欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年02月25日 09:22:08   投稿:lijiao  
這篇文章主要為大家介紹了3種你所未知的Node.js代碼優(yōu)化方式,幫助大家剛好的進(jìn)行代碼優(yōu)化,感興趣的小伙伴們可以參考一下

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

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

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

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

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

2、

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

請(qǐng)運(yùn)行以下代碼來(lái)測(cè)試你的程序:

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)

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

kill -SIGUSR2 [pid]

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

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

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

首先,運(yùn)行npm install strongloop –g,然后運(yùn)行以下代碼:

slc start [/path/to/app]

上述代碼會(huì)在進(jìn)程管理器中啟動(dòng)你的程序,你可以按需提取 CPU 分析數(shù)據(jù)。要想驗(yàn)證并獲取應(yīng)用程序 id,請(qǐng)運(yùn)行:

slc ctl

你將得到與下面類似的運(yùn)行結(jié)果:

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

定位應(yīng)用的進(jìn)程 id。在此例中,id 為1.1.61023?,F(xiàn)在我們就能在任意時(shí)間開(kāi)始分析了,運(yùn)行如下代碼即可:

slc ctl cpu-start 1.1.61023

當(dāng)我們覺(jué)得已經(jīng)捕獲到了遲滯行為,就可以運(yùn)行以下代碼來(lái)停止分析器:

slc ctl cpu-stop 1.1.61023

以下代碼將寫文件至硬盤:

CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools

好啦,就是這樣。你可以像在 V8 分析器里那樣把文件加載到 Chrome 里面進(jìn)一步分析。

作出正確決定
在本文中,筆者展示了三種在 Node 中捕獲生產(chǎn)環(huán)境下 CPU 使用量的方式。那么,你應(yīng)該選用哪一種呢?下面是一些幫助你縮小決策范圍的想法:

  • 我需要分析很長(zhǎng)一段時(shí)間:使用內(nèi)核級(jí)工具。
  • 我想用 Chrome 開(kāi)發(fā)工具:使用 V8 分析器或者過(guò)程管理器。
  • 我想捕獲應(yīng)用中的特定行為:使用 V8 分析器。
  • 我不想影響到程序性能:使用內(nèi)核級(jí)程序
  • 我希望我不用挨個(gè)測(cè)試文件來(lái)獲取程序分析信息:使用過(guò)程管理器

以上就是本文的全部?jī)?nèi)容,3種Node.js代碼優(yōu)化方式,希望大家可以熟練掌握。

相關(guān)文章

  • node.js缺少mysql模塊運(yùn)行報(bào)錯(cuò)的解決方法

    node.js缺少mysql模塊運(yùn)行報(bào)錯(cuò)的解決方法

    前幾天在工作中需要利用node.js連接數(shù)據(jù)庫(kù),通過(guò)網(wǎng)上的教程連接后運(yùn)行卻報(bào)錯(cuò)了,然后趕緊查找解決的方法,通過(guò)測(cè)試與朋友的提點(diǎn),終于解決了這個(gè)問(wèn)題,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-11-11
  • linux 下以二進(jìn)制的方式安裝 nodejs

    linux 下以二進(jìn)制的方式安裝 nodejs

    這篇文章主要介紹了linux 下以二進(jìn)制的方式安裝 nodejs,文中給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 參考?EventEmitter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的訂閱發(fā)布功能函數(shù)

    參考?EventEmitter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的訂閱發(fā)布功能函數(shù)

    這篇文章主要為大家介紹了參考?EventEmitter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的訂閱發(fā)布功能函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • nodejs子進(jìn)程child_process和cluster模塊深入解析

    nodejs子進(jìn)程child_process和cluster模塊深入解析

    本文從node的單線程單進(jìn)程的理解觸發(fā),介紹了child_process模塊和cluster模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • nodejs中實(shí)現(xiàn)路由功能

    nodejs中實(shí)現(xiàn)路由功能

    這篇文章主要介紹了nodejs中實(shí)現(xiàn)路由功能,顧名思義,路由指的就是我們要針對(duì)不同的URL有不同的處理方式,本文將教你在node.js中實(shí)現(xiàn)路由功能,需要的朋友可以參考下
    2014-12-12
  • Google官方支持的NodeJS訪問(wèn)API,提供后臺(tái)登錄授權(quán)

    Google官方支持的NodeJS訪問(wèn)API,提供后臺(tái)登錄授權(quán)

    Google官方支持的NodeJS集成客戶端,用以訪問(wèn)Google APIs, 支持OAuth 2.0授信及登錄認(rèn)證。登錄以后即可在后臺(tái)訪問(wèn)例如 Google Drive(云存儲(chǔ)), Google Analytics, Gmail等服務(wù)。
    2014-07-07
  • Linux?Ubuntu升級(jí)nodejs版本的簡(jiǎn)單步驟

    Linux?Ubuntu升級(jí)nodejs版本的簡(jiǎn)單步驟

    Node.js是一種對(duì)應(yīng)于JavaScript運(yùn)行時(shí)環(huán)境的編程語(yǔ)言,這篇文章主要給大家介紹了關(guān)于Linux?Ubuntu升級(jí)nodejs版本的簡(jiǎn)單步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Nodejs的express使用教程

    Nodejs的express使用教程

    Express 是一個(gè)簡(jiǎn)潔、靈活的 node.js Web 應(yīng)用開(kāi)發(fā)框架, 它提供一系列強(qiáng)大的特性,幫助你創(chuàng)建各種 Web 和移動(dòng)設(shè)備應(yīng)用,本篇文章給大家介紹nodejs的express使用教程,感興趣的朋友參考下
    2015-11-11
  • NodeJS爬蟲(chóng)實(shí)例之糗事百科

    NodeJS爬蟲(chóng)實(shí)例之糗事百科

    本篇文章主要給大家講解了一下用NodeJS學(xué)習(xí)爬蟲(chóng),并通過(guò)爬糗事百科來(lái)講解用法和效果,一起學(xué)習(xí)下吧。
    2017-12-12
  • node實(shí)現(xiàn)mock-plugin中間件的方法

    node實(shí)現(xiàn)mock-plugin中間件的方法

    這篇文章主要介紹了node實(shí)現(xiàn)mock-plugin中間件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論