国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

你所未知的3種Node.js代碼優(yōu)化方式

2019-11-20 10:31:06
字體:
供稿:網(wǎng)友

Node.js 程序的運(yùn)行可能會受 CPU 或輸入輸出操作的限制而十分緩慢。從 CPU 角度看,程序運(yùn)行緩慢的典型原因之一就是未經(jīng)優(yōu)化的「熱點路徑」(一段經(jīng)常被訪問的代碼)。從輸入輸出角度看,程序運(yùn)行速度的局限可能是受底層操作系統(tǒng)影響,也可能是出于 Node 本身的故障。更或者,一個運(yùn)行緩慢的程序可能跟 Node 本身沒有任何關(guān)系,問題在于外部資源,比如數(shù)據(jù)庫查詢或是 API 調(diào)用緩慢,未經(jīng)過優(yōu)化處理。

在本文中,我們將重點識別并優(yōu)化代碼庫中會導(dǎo)致 CPU 繁重運(yùn)行的操作。同時,將探討生產(chǎn)應(yīng)用的配置文件,分析并作出可提高運(yùn)作效率的改動。

由于 Node 的單線程性質(zhì),避免繁重的 CPU 負(fù)載對服務(wù)器來說尤為重要。因為在 CPU 上消耗的時間會占用響應(yīng)其他請求的時間。如果你注意到自己的應(yīng)用響應(yīng)速度緩慢,而且 CPU 在這個過程中始終占用率較高,分析你的程序有助于找出瓶頸,并且使程序恢復(fù)快速運(yùn)行的狀態(tài)。

分析應(yīng)用
復(fù)制生產(chǎn)環(huán)境中出現(xiàn)的緩慢程序問題非常難解決,而且十分耗時。值得慶幸的是,你不需要親自做這些了。你可以在生產(chǎn)服務(wù)器上收集配置文件數(shù)據(jù),然后離線分析。下面讓我們來看一下幾種分析方法。

1、使用內(nèi)核級工具
首先,你可以使用內(nèi)核級工具,比如 DTrace(Solaris, BSD),perf(Linux),或者 XPerf(Windows),從運(yùn)行的進(jìn)程中收集堆棧跟蹤信息,然后生成火焰圖。內(nèi)核級分析對運(yùn)行中的進(jìn)程影響最小。火焰圖是根據(jù)調(diào)用棧生成的支持放大縮小查看的向量圖形。來自 Netflix 公司的 Yunong Xiao 針對 Linux 系統(tǒng)中 perf,發(fā)表過超贊的演講和推文,幫助你加深對該技術(shù)的了解。如果你想在生產(chǎn)程序中保持高吞吐量,可以參考使用這種方法。

2、

2、使用 V8 分析器
另一個選項是直接使用 V8 分析器。這種方式會與程序共享進(jìn)程,因此它會影響程序性能。基于這個原因,請只在你遇到此類問題時運(yùn)行 V8 分析器來捕獲相關(guān)輸出。該方法的好處是:你可以使用 Chrome 的所有分析工具,結(jié)合其輸出結(jié)果(包括火焰圖),對程序進(jìn)行調(diào)查。

請運(yùn)行以下代碼來測試你的程序:

npm install v8-profiler --save

之后,在你的程序中添加以下代碼:

const profiler = require('v8-profiler')const fs = require('fs')var profilerRunning = falsefunction 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)

只要你發(fā)送 SIGUSR2 信號到此進(jìn)程,它就會開始分析。再次發(fā)送一個 SIGUSR2 信號可以停止分析(代碼如下)。

kill -SIGUSR2 [pid]

該進(jìn)程的分析結(jié)果將被寫入到當(dāng)前工作路徑的文件中(請確保該路徑可被寫入)。由于這是一個可編程接口,你可以隨意觸發(fā)它(使用 web endpoint,IPC,等等)。如果你對程序在何時變得緩慢有預(yù)感,你可以在任一時期觸發(fā)該接口。建立自動觸發(fā)對避免持續(xù)監(jiān)看程序是非常有用的,但是它要求你對捕獲時間以及捕獲時長有預(yù)測性認(rèn)知。

一旦已經(jīng)收集好配置文件數(shù)據(jù),將它加載到Chrome開發(fā)工具中,開始分析吧!

3、使用進(jìn)程管理器
盡管直接使用 V8 分析器是非常有效且可定制的,但是它會進(jìn)入你的代碼庫,并且會向項目添加又一項你可能不想要的依賴性條件。一種替代方式就是使用進(jìn)程管理器,它可以在你需要分析時,用各種工具將你的程序包裝起來。一種可選的工具是來自 StrongLoop 的 SLC 命令行工具。

首先,運(yùn)行npm install strongloop

主站蜘蛛池模板: 株洲市| 曲靖市| 鹤峰县| 安阳市| 永年县| 个旧市| 海原县| 灵宝市| 鹿邑县| 宜阳县| 略阳县| 和田县| 扶沟县| 满城县| 江油市| 湖北省| 双牌县| 曲麻莱县| 同德县| 淮阳县| 墨竹工卡县| 石泉县| 酒泉市| 泰顺县| 息烽县| 台北县| 清水河县| 东兰县| 大关县| 黔江区| 弋阳县| 白城市| 庆云县| 塔河县| 扎囊县| 新昌县| 绩溪县| 凤城市| 十堰市| 阜宁县| 华安县|