alinode是基本上是免費開源的,不僅是能夠運行在ECS裏面,理論上能夠應用在任何地方(只要面子上過得去)。本文將贅述一下alinode的使用方法。html
本文首先囉嗦一下 Node.js 平臺的性能問題分析所包含的一些內容,第二part再敘述下 alinode 是如何使用的node
要定位 Node.js 的性能問題,通常要對Node進程進行性能方面的進程分析。git
進程分析通常包括 內存、CPU、EventLoop、ActiveHandlers 等的分析。對於開發人員來講,這裏麪包括3個主要任務:github
這個有幾個比較經常使用的工具,例如 Apache ab、wrk 以及 Node.js 編寫的 autocannongolang
這裏就不具體講用法了,經過壓測工具,咱們能夠量化咱們站點的性能指標,在性能問題排查過程當中爲咱們提供依據。web
通常咱們的性能指標須要達到必定的吞吐量 req/sec,且單個請求的耗時要在預期範圍以內。不然耗時太高影響用戶體驗、吞吐過低則會形成某些用戶訪問失敗。chrome
cpu通常要觀察一些時間來拿到他的函數執行堆棧狀況,好比 alinode 進行dump時也是要等3分鐘。npm
node --prof app.js
node.js 從 4.4.0 版本開始內置了 profiler, --prof 命令選項運行應用會在當前目錄生成性能日誌文件json
以上命令會在項目根目錄會生成 `isolate-xxxxxxx-v8.log` 格式的文件,這個log文件還不能直接進行分析,通常可視化工具都是要一個json文件。所以,log須要進行預處理,咱們能夠這樣預處理這個log:
node --prof-process --preprocess isolate-xxxxxxxxxx-v8.log > v8.json
這樣就能夠把它轉爲一個json字符串文件。api
方法2:使用npm包 v8-profile
使用示例以下:
profiler.startProfiling('', true); setTimeout(function() { var profile = profiler.stopProfiling(''); profile.export() .pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`)) .on('finish', () => profile.delete()) }, 1000);
kill -USR2 <pid>
的信號。分析的話,無非是用一些易於查看的數據展現工具或定位工具來幫助咱們更好的展現數據。好比能按函數熱度去展現cpu profile文件。
方法1: 使用v8自身提供的界面分析工具。
git clone https://github.com/v8/v8.git
打開 v8/tools/profview/index.html
文件,是個靜態界面,在界面中心選擇剛生成的 v8.json文件,文件解析成功後,界面上就展現了函數調用的時間信息了。
chromedevTools
這裏再也不贅述了。chromedevtool提供了heavvvy、chart多種視圖,仍是很不錯的。
方法3:使用 v8-analysis工具
v8-analysis這個模塊能夠解析 v8-profiler
和 heapdump
等工具輸出的cpu & heap-memory日誌,能夠提供:
經過上面簡單的介紹,能夠發現性能分析這裏有2個痛點。一個是收集數據,須要侵入代碼,手工執行相應的指令。另一個是: 分析工具五花八門,哪怕用chrome devtool也得經歷把dump的數據下載回來導入的比較痛苦的過程。
alinode 阿里Node.js性能平臺 對以上一些問題的解決過程進行了集成,提供了更易用的體驗,解決了大部分的痛點。並且是免費開源的(基本上)。alinode經過 錯誤日誌、操做系統指標(cpu/內存/磁盤/IO)、慢日誌、異常等維度來監控node應用,並提供瞭如 coredump、cpuProfile、heamdump 等工具,同時提供了Profile的在線web數據可視化分析的能力.
整體來看,alinode的幾個工具也就是提供了本文最開始提到的性能分析相關的能力,即數據提取、數據分析能力(固然還有額外的監控通知、好看的UI、實時數據展現)。
alinode的設計架構以下:

其實,只看技術細節部分的話。alinode包括這3部分的組件,咱們從底向上說:
我在本機macbook上進行了站點的性能分析,下面咱們來看看 alinode 使用的基本步驟,對咱們學習別人的設計和思路也是頗有幫助的。除了觀看這裏的步驟以外,你還能夠參考官方幫助文檔 做爲輔助。
從上面的分析能夠看到,咱們在本機要作的事情其實就是安裝阿里改裝後的node運行時(alinode)以及agenthub。下面是具體步驟:
wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash
執行安裝腳本後,咱們再執行
source ~/.bash_profile ,# 你的多是 ~/.bash_rc
此時tnvm安裝成功。
執行tvnm命令查看下 alinode遠程有哪些版本
tnvm ls-remote alinode
選擇一個alinode版本進行安裝
tnvm install alinode-vx.y.z # 4.8.0->10.16.0
好比我安裝的 v4.8.0,他對應 node的 v10.16.0
tnvm install alinode-v4.8.0
接下來,別忘了要 use 一下你安裝的版本。
tnvm use alinode-v4.8.0 #別忘這一句。
此時,執行 which node
命令你會發現已經使用上了 tnvm管理的alinode:
/Users/cuiyongjian/.tnvm/versions/alinode/v4.8.0/bin/node
agenthub 只是一個 npm 命令行工具,經過以下命令能夠很簡單的完成安裝:
npm install @alicloud/agenthub -g
agenthub接收和發送信息,須要知道雲上的服務ID. 因此他啓動須要一份配置,咱們在任意地方新建一個config.json
1 { 2 "appid": "80535", 3 "secret": "3c4d************5」, // 你在aliyun上新建node監控實例時,會給你一個appid和secret 4 "logdir": "/tmp" 5 }
而後啓動agenthub:
DEBUG=* agenthub start config.json
注意點:這裏的 /tmp是指的agenthub從哪一個目錄來獲取dump出來的日誌文件。 所以這個目錄必須跟你接下來啓動node應用時指定的日誌輸出目錄一致,不然你的agenthub將沒法上傳dump信息。
咱們來啓動咱們的應用:
NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES node app.js NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES pm2 start app.js
例如個人實際項目:
sudo NODE_LOG_DIR=/tmp ENABLE_NODE_LOG=YES PORT=80 MODE=ssr NODE_ENV=production CGI_ENV=online node ./backend/app.js
這倆LOG的環境變量必須指定。一個是前文所說的日誌輸出目錄,一個是是否打開日誌功能,若是不這樣配置確定就不能進行遠程dump了
一些小問題
source ~/.bash_profile
來讓tnvm的node路徑優先。當你在管理平臺查看數據或執行dump命令時,可能會提示出錯。這裏有幾點排查思路:
打開 node.console.aliyun.com
,進入管理控制檯首頁。

這裏會展現實例。所謂實例就是你的一臺機器。在這裏能夠點擊主頁進入一個實例,也能夠配置該實例相關的告警(如針對錯誤日誌、內存等閾值配置告警),還能夠配置團隊成員。

左側連接能夠看到:針對當前實例有這麼幾個功能: 進程信息查看和管理、系統信息、異常信息、慢日誌信息、依賴信息。



dump以後就去點頁面左側 文件列表
菜單, 來到文件面板這裏,查看文件生生進度,生成完成以後就點擊轉儲,轉儲完成就課能夠點擊分析。

當咱們點擊一個已經轉儲完成的 CPU profile 文件,管理平臺會打開一個新頁面展現火焰圖:

cpuprofile還能夠直接點擊 devtool分析
查看,這種分析會自動會在瀏覽器中打開一個chrome風格 分析工具。很神奇:

GcTrace分析: