效能優化 讓nodejs再快一點

2021-09-14 04:57:07 字數 2535 閱讀 8147

本文首次發表於
但從node.js(服務端)的角度來看,js本身的執行時間卻變得至關重要,還是之前的例子,如果執行時間從30ms降到3ms, 理論上qps就能提公升10倍,換句話說,以前要10臺伺服器才能扛住的流量現在1臺伺服器就能扛住,而且響應時間更短.

那到底node端如何做效能優化呢?

有兩種方法,一種是通過node/v8自帶的profile能力 , 另一種是通過alinode的 cpu profile功能. 前者只列出了各函式的執行佔比, 後者包括更加完整的呼叫棧,可讀性更強,更加容易定位問題,建議採用後者.

$ node --prof index.js
$ loadtest   --rps 10
$ node --prof-process isolate-0*********xx-v8-***x.log > profile.txt
profile.txt檔案如下圖,包括js和c++**各消耗多少ticks, 具體分析方法詳見node profile文件

alinode是與 node 社群版完全相容的二進位制執行時環境, 推薦使用tnvm工具進行安裝

$ wget -o-  | bash
完成安裝後,需要將tnvm新增為命令列程式. 根據平台的不同,可能是~/.bashrc,~/.profile 或 ~/.zshrc等

$ source ~/.zshrc
$ tnvm install alinode-v3.8.0

$ tnvm use alinode-v3.8.0

$ node --perf-basic-prof-only-functions index.js
$ loadtest   --rps 10
假設啟動的worker程序號為6989, 執行以下指令碼, 三分鐘後將在/tmp/目錄下生成乙個cpuprofile檔案/tmp/cpu-profile-6989-***.cpuprofile指令碼詳見take_cpu_profile.sh

下面通過乙個真實的案例展示如何一步步地做效能調優.

通過loadtest請求1000次,統計平均rt, 初始rt為15.8ms

剔除program和gc消耗,效能消耗的前三位分別是get,j_eval三個方法

展開最耗效能的get方法呼叫棧,可以定位到get方法所在的位置,具體**如下

return json.parse(json.stringify(this.state[propname]));}}

方法體中,json.parse(json.stringify(obj))雖然使用便捷,但卻是cpu密集型操作. 做一次驗證,去除該操作, 直接返回this.state[propname]. rt時間降為12.3ms了

這僅僅是一次試驗,肯定不能直接移除json.parse(json.stringify(obj)), 不然會影響業務邏輯的. 參考下常用拷貝方法的效能對比, 自配梯子. 截圖如下:

其中效能最優的是lodash deep clone,採用該庫替換,再驗證一遍, rt降為12.8ms

第二耗效能是的j方法,裡面大部分是各個元件的render時間,暫時略過,以同樣的方式對_eval方法進行一次優化, rt降為10.1ms.

以此類推,根據cpu profile找出效能消耗的點,逐個去優化.

簡單12招讓Hive執行快一點,再快一點

hive可以讓你在hadoop上使用sql,但是在分布系統上的sql的調優是不同的。這裡有12個技巧能夠幫助你。hive並不是乙個關係型資料庫,但它假裝是大部分情況中的乙個。它有 執行sql,並且支援jdbc和odbc。這個啟示有利及不利的訊息 hive不執行查詢資料庫方式。這是乙個很長的故事,但是...

如何讓mysql索引更快一點

在 innodb 中,從二級索引回到主鍵索引查詢資料,這個過程稱作回表過程,而且這個回表過程是可以被優化的,這個優化就是利用覆蓋索引。先說結論,如果乙個索引的字段包含了所有要查詢的字段,這個索引就稱作覆蓋索引,覆蓋索引可以減少回表過程,能有效提高查詢效率。前面我們有說過,在 innodb 中資料都是...

讓QT編譯快一點(增加基礎標頭檔案)

2 如何才能學到qt的精髓 提供了絕佳的物件間通訊方式,同時也是窺視gui具體實現的絕佳機會 我是來反對樓上某些答案的。我曾經用mfc寫了金山詞霸 大約20多萬行 又用qt寫了yy語音 大約100多萬行 算是對兩種框架都比較有經驗。糾正幾個錯誤的認識。1.用qt寫的程式編譯比mfc慢 的說法是錯誤的...