常見問題
Node.js 性能平臺(tái)運(yùn)行時(shí)與社區(qū) Node.js 運(yùn)行時(shí)是什么關(guān)系
Node.js 性能平臺(tái)運(yùn)行時(shí)完全兼容社區(qū)對(duì)應(yīng)版本 Node.js 運(yùn)行時(shí),對(duì)應(yīng)關(guān)系 請(qǐng)查看。
Node.js 性能平臺(tái)運(yùn)行時(shí)是否會(huì)影響性能
Node.js 性能平臺(tái)運(yùn)行時(shí)每分鐘在主線程將監(jiān)控?cái)?shù)據(jù)寫到內(nèi)存中,通過額外的日志線程寫日志到文件,因此對(duì)性能影響可以忽略。
做故障診斷時(shí),執(zhí)行診斷功能 3 分鐘,隨后自動(dòng)切回到正常運(yùn)行狀態(tài)。
Node.js 性能平臺(tái)運(yùn)行時(shí)提供了哪些額外的功能
Node.js 虛擬機(jī) V8 的運(yùn)行時(shí)內(nèi)存狀態(tài)監(jiān)控;
libuv 運(yùn)行時(shí)狀態(tài)監(jiān)控;
在線故障診斷功能:堆快照、CPU Profile、GC Trace 等。
部署 Node.js 性能平臺(tái)運(yùn)行時(shí)后控制臺(tái)顯示實(shí)例數(shù)為 0
step 1 查看 agenthub 是否啟動(dòng)成功,通過如下命令查看是否有 agenthub 實(shí)例運(yùn)行。
u@h:~$ agenthub list |- App ID -|- PID -|---- Start Time -----|--- Config Path ------------------------------------| | 12345 | 29015 | 2018-07-11 16:53:44 | /path/to/your/config.json | |----------|-------|---------------------|----------------------------------------------------| u@h:~$
如果沒有運(yùn)行中的 agenthub,可以通過 DEBUG 方式啟動(dòng) agenthub 后查看 ~/.agenthub.log 日志查看具體出錯(cuò)信息。
DEBUG=* agenthub start config.json cat ~/.agenthub.log
step 2 查看 agenthub 的配置,通過
實(shí)例
頁面上的查看運(yùn)行中的Node.js進(jìn)程
后點(diǎn)擊檢查進(jìn)程
。
診斷操作提示失敗
所有診斷操作需要順序執(zhí)行。一個(gè)操作未完成時(shí)進(jìn)行下一個(gè)操作會(huì)提示操作失敗。文件頁面轉(zhuǎn)儲(chǔ)按鈕有效時(shí)表明操作已完成(診斷報(bào)告數(shù)秒可完成,堆快照根據(jù)堆大小可能數(shù)秒到數(shù)分鐘,其他操作持續(xù)時(shí)間為 3 分鐘)。
agenthub 異常退出
通過 agenthub start config.json
啟動(dòng) agenthub 后,agenthub list
無法獲得 agenthub 實(shí)例。那么通過 DEBUG 方式啟動(dòng)agenthub
DEBUG=* agenthub start config.json
然后查看 ~/.agenthub.log 獲取出錯(cuò)信息。
修復(fù)錯(cuò)誤后,重新普通方式啟動(dòng)agenthub。
agenthub stop all # 停止 agenthub
agenthub start config.json
如何處理一臺(tái)服務(wù)器部署多個(gè)應(yīng)用
強(qiáng)烈建議每臺(tái)服務(wù)器部署一種應(yīng)用。
如果必須要在同一臺(tái)服務(wù)器部署多個(gè)應(yīng)用,下面提供了兩種方法來實(shí)現(xiàn):
每個(gè)應(yīng)用申請(qǐng)不同的 和
App Secret
,用NODE_LOG_DIR
指定不同的路徑存放運(yùn)行時(shí)日志,并且與config.json
里面logdir
路徑一致。這樣可以啟動(dòng)多個(gè) agenthub。啟動(dòng)一個(gè) agenthub,所有應(yīng)用的運(yùn)行時(shí)日志指向相同目錄(默認(rèn)
/tmp
),error_log
和packages
可以放到配置文件的數(shù)組里面。
請(qǐng)使用其中一種方式來進(jìn)行部署。
使用 pm2 管理的應(yīng)用如何使用 Node.js 性能平臺(tái)運(yùn)行時(shí)
如果安裝 Node.js 性能平臺(tái)運(yùn)行時(shí)前系統(tǒng)已經(jīng)安裝社區(qū) Node.js 運(yùn)行時(shí)和 pm2 :
安裝 Node.js 性能平臺(tái)運(yùn)行時(shí)后重新安裝 pm2,確保
which pm2
結(jié)果中包含.tnvm
字段;將 pm2 所有進(jìn)程殺掉,尤其是其守護(hù)進(jìn)程
PM2 v0.15.8: God Daemon
不能漏掉;重新用 pm2 啟動(dòng)應(yīng)用。
$ ENABLE_NODE_LOG=YES pm2 start app.js
如果安裝 Node.js 性能平臺(tái)運(yùn)行時(shí)前系統(tǒng)未安裝社區(qū) Node.js 運(yùn)行時(shí)和 pm2 :
安裝 pm2 后直接使用 pm2 啟動(dòng)應(yīng)用
$ ENABLE_NODE_LOG=YES pm2 start app.js
控制臺(tái)只有系統(tǒng)監(jiān)控?cái)?shù)據(jù),沒有進(jìn)程監(jiān)控?cái)?shù)據(jù)
通過實(shí)例
頁面上的 查看運(yùn)行中的Node.js進(jìn)程
后點(diǎn)擊 檢查進(jìn)程
進(jìn)行排查。
多個(gè)實(shí)例的 hostname 相同如何處理
在配置文件中添加配置項(xiàng) "agentidMode": "IP"
。
例如有兩個(gè)實(shí)例的 hostname
都是 app_container
,IP
分別是 10.10.12.124
和 10.10.12.123
,如果配置中增加 "agentidMode": "IP"
,那么兩個(gè)實(shí)例ID分別是 app_container_12124
和 app_container_12123
。細(xì)節(jié)請(qǐng)參考。
慢 HTTP 日志是什么
響應(yīng)時(shí)間 (RT) 大于 400ms 的 HTTP 請(qǐng)求。
異常日志是什么
在
config.json
里面中配置的error_log
所指定的日志文件中帶error stack
的日志,該日志由用戶應(yīng)用生成。
模塊依賴是什么
在
config.json
里面中配置的packages
所指定的 npm 模塊,用紅色提示存在安全風(fēng)險(xiǎn)的模塊。
系統(tǒng)監(jiān)控?cái)?shù)據(jù)各項(xiàng)指標(biāo)什么含義
基本信息
最近一次日志上報(bào)的各項(xiàng)指標(biāo),具體指標(biāo)含義如下所述。
長(zhǎng)周期數(shù)據(jù)
Memory
memory_sys
:系統(tǒng)內(nèi)存使用百分比。memory_node
: 所有 Node.js 進(jìn)程內(nèi)存使用之和占系統(tǒng)內(nèi)存的百分比。
CPU
cpu_sys
:系統(tǒng) CPU 使用百分比。cpu_node
:所有 Node.js 進(jìn)程 CPU 使用百分比之和。
Load
load1
:1分鐘內(nèi)平均 Load。load5
:5分鐘內(nèi)平均 Load。load15
:15分鐘內(nèi)平均 Load。下面是一些
Load
的參考信息 (Load
已經(jīng)歸一化處理,如果是 N 核 CPU,那么相應(yīng)Load * N
):0.7 < Load < 1
:不錯(cuò)的狀態(tài),有新任務(wù)也可以及時(shí)處理;Load = 1
:即將有任務(wù)需要額外的等待時(shí)間才能被處理,需要引起關(guān)注;Load > 5
:任務(wù)需要等待時(shí)間很長(zhǎng),需要干預(yù)處理。通常先看
load15
,如果很高,再看load1
和load5
,看是否有下降趨勢(shì),短時(shí)間內(nèi)load1
大于 1,不用擔(dān)心,如果長(zhǎng)時(shí)間Load
較高,需要引起關(guān)注。
QPS
該實(shí)例所有 Node.js 進(jìn)程每秒鐘處理的 HTTP 請(qǐng)求數(shù)之和。
GC
gc_avg
:所有 Node.js 進(jìn)程垃圾回收時(shí)間占比平均值。gc_max
:每分鐘內(nèi)垃圾回收時(shí)間最多的 Node.js 進(jìn)程的垃圾回收時(shí)間占比。
Apdex
Node.js 性能平臺(tái)根據(jù) HTTP
的響應(yīng)時(shí)間 RT
來定義用戶滿意度(默認(rèn)響應(yīng)時(shí)間 100ms
):
satisfied
(滿意):RT <= T
tolerating
(容忍):T < RT < 4 * T
frustrated
(失望):RT > 4 * T
計(jì)算方式:
satisfied + tolerating / 2
舉例來說:
每分鐘
satisfied
的HTTP
請(qǐng)求為60%
,tolerating
的為30%
,frustrated
的為10%
那么
Apdex = 0.6 + 0.3 / 2 = 0.75
Apdex detail
如上面描述的,根據(jù)響應(yīng)時(shí)間分類的 HTTP
請(qǐng)求詳細(xì)統(tǒng)計(jì)。
node進(jìn)程數(shù)
該實(shí)例內(nèi)的 Node.js 進(jìn)程數(shù)統(tǒng)計(jì)。
磁盤
該實(shí)例的磁盤使用率。
進(jìn)程監(jiān)控?cái)?shù)據(jù)各項(xiàng)指標(biāo)什么含義
堆整體信息
rss
:該進(jìn)程實(shí)際使用的內(nèi)存,包括堆內(nèi)內(nèi)存和堆外內(nèi)存。heap_total
:總的堆內(nèi)存。heap_used
:實(shí)際使用的堆內(nèi)存。
GC 信息
scavange_duration
:scavange
垃圾回收時(shí)間占比。marksweep_duration
:marksweep
垃圾回收時(shí)間占比。
堆空間組成
堆上各個(gè)內(nèi)存空間 code_space
,lo_space
,map_space
,new_space
,old_space
上的內(nèi)存大小。
QPS 趨勢(shì)
該進(jìn)程每秒鐘處理的 HTTP 請(qǐng)求數(shù)。
CPU 趨勢(shì)
該進(jìn)程在各個(gè)統(tǒng)計(jì)時(shí)段內(nèi)的 CPU 使用率。now
,cpu_15
,cpu_30
,cpu_60
分別代表1s
,15s
,30s
,60s
內(nèi)的 CPU 使用率。
Timer 趨勢(shì)
該進(jìn)程當(dāng)前定時(shí)器數(shù)量。
所有超時(shí)值相同的
js
層面的定時(shí)器在該統(tǒng)計(jì)中數(shù)量為1。
libuv 句柄趨勢(shì)
該進(jìn)程的 libuv
句柄數(shù)統(tǒng)計(jì),其中:
每個(gè) TCP 連接占用一個(gè)句柄。
每個(gè)打開的文件占用一個(gè)句柄。
如何配置報(bào)警項(xiàng)
Node.js 性能平臺(tái)是如何進(jìn)程故障診斷的
參見 用戶指南-故障診斷。
異常日志和性能日志有什么區(qū)別
異常日志是由應(yīng)用寫入的日志;
性能日志是由運(yùn)行時(shí)在設(shè)置了
ENABLE_NODE_LOG=YES
(默認(rèn)不寫)后寫入到NODE_LOG_DIR
所指定的目錄(默認(rèn)/tmp
),每天一個(gè)日志文件,例如文件名稱為node-20171010.log
表示2017年10月10日的日志文件。
如何判斷是否存在內(nèi)存泄露
內(nèi)存監(jiān)控指標(biāo)部分能看到隨著時(shí)間內(nèi)存持續(xù)增長(zhǎng)。
如何判斷是否存在 CPU 熱點(diǎn)函數(shù)
CPU 持續(xù)飚高。