你所未知的3種Node.js程式碼優化方式_node.js
Node.js 程式的運作可能會受 CPU 或輸入輸出作業的限製而十分緩慢。從 CPU 角度來看,程式運作緩慢的典型原因之一就是未經最佳化的「熱點路徑」(一段經常被存取的程式碼)。從輸入輸出角度來看,程式運行速度的限制可能是受底層作業系統影響,也可能是出於 Node 本身的故障。更或者,一個運作緩慢的程式可能跟 Node 本身沒有任何關係,問題在於外部資源,例如資料庫查詢或 API 呼叫緩慢,未經過最佳化處理。
在本文中,我們將重點放在識別並優化程式碼庫中會導致 CPU 繁重運作的操作。同時,將探討生產應用的配置文件,分析並做出可提高運作效率的改變。
由於 Node 的單執行緒性質,避免繁重的 CPU 負載對伺服器來說尤其重要。因為在 CPU 上消耗的時間會佔用回應其他請求的時間。如果你注意到自己的應用程式回應速度緩慢,而且 CPU 在這個過程中始終佔用率較高,分析你的程式有助於找出瓶頸,並且使程式恢復快速運行的狀態。
分析應用
複製生產環境中出現的緩慢程序問題非常難解決,而且十分耗時。值得慶幸的是,你不需要親自做這些了。你可以在生產伺服器上收集設定檔數據,然後離線分析。下面讓我們來看看幾種分析方法。
1、使用核心級工具
首先,你可以使用核心級工具,例如 DTrace(Solaris, BSD),perf(Linux),或 XPerf(Windows),從運行的進程中收集堆疊追蹤信息,然後產生火焰圖。核心級分析對運行中的進程影響最小。火焰圖是根據呼叫堆疊產生的支援放大縮小查看的向量圖形。來自 Netflix 公司的 Yunong Xiao 針對 Linux 系統中 perf,發表過超讚的演講和推文,幫助你加深對該技術的了解。如果你想在生產程式中保持高吞吐量,可以參考使用這種方法。
2、
2、使用 V8 分析器
另一個選項是直接使用 V8 分析器。這種方式會與程式共用進程,因此它會影響程式效能。基於這個原因,請只在你遇到這類問題時執行 V8 分析器來捕捉相關輸出。此方法的優點是:你可以使用 Chrome 的所有分析工具,結合其輸出結果(包括火焰圖),對程式進行調查。
請執行以下程式碼來測試你的程式:
npm install v8-profiler --save
之後,在你的程式中加入以下程式碼:
const profiler = require('v8-profiler') const fs = require('fs') var profilerRunning = false function toggleProfiling () { if (profilerRunning) { const profile = profiler.stopProfiling() console.log('stopped profiling') profile.export() .pipe(fs.createWriteStream('./myapp-'+Date.now()+'.cpuprofile')) .once('error', profiler.deleteAllProfiles) .once('finish', profiler.deleteAllProfiles) profilerRunning = false return } profiler.startProfiling() profilerRunning = true console.log('started profiling') } process.on('SIGUSR2', toggleProfiling)
只要你發送 SIGUSR2 訊號到此進程,它就會開始分析。再次發送一個 SIGUSR2 訊號可以停止分析(程式碼如下)。
kill -SIGUSR2 [pid]
該進程的分析結果將寫入到目前工作路徑的檔案中(請確保該路徑可被寫入)。由於這是一個可編程接口,你可以隨意觸發它(使用 web endpoint,IPC,等等)。如果你對程式在何時變得緩慢有預感,你可以在任一時期觸發該介面。建立自動觸發對避免持續監看程序是非常有用的,但是它要求你對捕獲時間以及捕獲時長有預測性認知。
一旦已經收集好設定檔數據,將它載入到Chrome開發工具中,開始分析吧!
3、使用進程管理器
儘管直接使用 V8 分析器是非常有效且可自訂的,但是它會進入你的程式碼庫,並且會向專案添加另一個你可能不想要的依賴性條件。一種替代方式就是使用進程管理器,它可以在你需要分析時,用各種工具將你的程式包裝起來。一種可選的工具是來自 StrongLoop 的 SLC 命令列工具。
首先,執行npm install strongloop –g,然後執行以下程式碼:
slc start [/path/to/app]
上述程式碼會在進程管理器中啟動你的程序,你可以按需提取 CPU 分析資料。要驗證並獲取應用程式 id,請運行:
slc ctl
你將得到與下面類似的運行結果:
Service ID: 1 Service Name: my-sluggish-app Environment variables: Name Value NODE_ENV production Instances: Version Agent version Debugger version Cluster size Driver metadata 5.0.1 2.0.2 1.0.0 1 N/A Processes: ID PID WID Listening Ports Tracking objects? CPU profiling? Tracing? Debugging? 1.1.61022 61022 0 1.1.61023 61023 1 0.0.0.0:3000
定位應用的進程 id。在此例中,id 為1.1.61023。現在我們就能在任何時間開始分析了,運行如下程式碼即可:
slc ctl cpu-start 1.1.61023
当我们觉得已经捕获到了迟滞行为,就可以运行以下代码来停止分析器:
slc ctl cpu-stop 1.1.61023
以下代码将写文件至硬盘:
CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools
好啦,就是这样。你可以像在 V8 分析器里那样把文件加载到 Chrome 里面进一步分析。
作出正确决定
在本文中,笔者展示了三种在 Node 中捕获生产环境下 CPU 使用量的方式。那么,你应该选用哪一种呢?下面是一些帮助你缩小决策范围的想法:
- 我需要分析很长一段时间:使用内核级工具。
- 我想用 Chrome 开发工具:使用 V8 分析器或者过程管理器。
- 我想捕获应用中的特定行为:使用 V8 分析器。
- 我不想影响到程序性能:使用内核级程序
- 我希望我不用挨个测试文件来获取程序分析信息:使用过程管理器
以上就是本文的全部内容,3种Node.js代码优化方式,希望大家可以熟练掌握。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

一開始的時候 JS 只在瀏覽器端運行,對於 Unicode 編碼的字串容易處理,但對於二進位和非 Unicode 編碼的字串處理困難。並且二進制是電腦最底層的資料格式,視訊/音訊/程式/網路包

作為世界上最受歡迎的程式語言之一,Java已成為許多企業和開發者的首選語言。然而,程式碼的重構對於保持程式碼品質以及開發效率至關重要。 Java程式碼由於其複雜性,隨著時間的推移可能會變得越來越難以維護。本文將討論如何進行Java程式碼的重構,以提高程式碼品質和可維護性。了解重構的原則Java程式碼重構的目的在於改進程式碼的結構、可讀性和可維護性,而不是簡單的「改變程式碼」。因

如何使用 Node.js 進行前端應用的開發?以下這篇文章為大家介紹一下Node開發前端應用的方法,涉及到表現層應用的開發。我今天分享的方案是針對簡單場景的,旨在讓前端開發人員不必掌握太多關於 Node.js 的背景知識和專業知識,即使沒有程式碼編寫經驗,也能完成一些簡單的服務端開發任務。

Event Loop 機制大家應該都有了解。本文利用 EventLoop 去做一個有趣的檢測node或頁面效能的程式碼,順便介紹了一下EventLoop,希望對大家有幫助!
