Node.js性能分析工具alinode的安裝和使用簡介

囉嗦

alinode是基本上是免費開源的,不僅是能夠運行在ECS裏面,理論上能夠應用在任何地方(只要面子上過得去)。本文將贅述一下alinode的使用方法。html

本文首先囉嗦一下 Node.js 平臺的性能問題分析所包含的一些內容,第二part再敘述下 alinode 是如何使用的node

性能問題分析

要定位 Node.js 的性能問題,通常要對Node進程進行性能方面的進程分析。git

進程分析通常包括 內存、CPU、EventLoop、ActiveHandlers 等的分析。對於開發人員來講,這裏麪包括3個主要任務:github

  • 第一,壓測應用。一般咱們但願分析的都是應用在實際生產運行時的一個情況,而這個情況能夠經過本身壓測來模擬。
  • 第二,獲取數據。也就是獲取到咱們的 CPU情況、內存情況等信息。這個通常經過運行時或運行時的底層提供的一些API來獲取。例如Node的語言執行引擎V8就提供了cpu profile的能力。
  • 第三,分析數據。拿到數據後,咱們須要對數據進行分析以讓咱們快速定位到問題。通常拿到的數據可讀性比較差,所以這一步一般是對數據可視化,例如cpu profile能夠經過工具轉換爲火焰圖。或者經過其餘第三方工具如v8-analysis工具庫提供分析。

壓測應用

這個有幾個比較經常使用的工具,例如 Apache ab、wrk 以及 Node.js 編寫的 autocannongolang

這裏就不具體講用法了,經過壓測工具,咱們能夠量化咱們站點的性能指標,在性能問題排查過程當中爲咱們提供依據。web

通常咱們的性能指標須要達到必定的吞吐量 req/sec,且單個請求的耗時要在預期範圍以內。不然耗時太高影響用戶體驗、吞吐過低則會形成某些用戶訪問失敗。chrome

數據獲取

CPU

cpu通常要觀察一些時間來拿到他的函數執行堆棧狀況,好比 alinode 進行dump時也是要等3分鐘。npm

  • 方法1:直接使用v8底層對Node暴露的api。咱們只需在啓動node應用的時候,傳入
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);

內存

  • 方法1: heapdump 這個模塊能夠用來進行內存數據的採集。這個包須要侵入代碼,在代碼中引用後,能夠經過其API進行dump。或者在外部給進程發送 kill -USR2 <pid> 的信號。
  • 方法2:v8-profile。這也是一個須要侵入node代碼的模塊,經過該模塊能夠獲取 heapdump 和 cpu profile

數據分析

分析的話,無非是用一些易於查看的數據展現工具或定位工具來幫助咱們更好的展現數據。好比能按函數熱度去展現cpu profile文件。

  • 方法1: 使用v8自身提供的界面分析工具。

    git clone https://github.com/v8/v8.git

    打開 v8/tools/profview/index.html 文件,是個靜態界面,在界面中心選擇剛生成的 v8.json文件,文件解析成功後,界面上就展現了函數調用的時間信息了。

  • 方法2: 使用 chromedevTools
    具體參考:Node性能問題排查指南

    這裏再也不贅述了。chromedevtool提供了heavvvy、chart多種視圖,仍是很不錯的。

  • 方法3:使用 v8-analysis工具

    v8-analysis這個模塊能夠解析 v8-profilerheapdump 等工具輸出的cpu & heap-memory日誌,能夠提供:

    • v8引擎逆優化或者優化失敗的函數標紅展現以及優化失敗緣由展現
    • 函數執行時長超過預期標紅展現
    • 當前項目中可疑的內存泄漏點展現
  • 方法4:
    對於cpu profile,還能夠本身動手製做火焰圖(這就有點考驗動手能力了)。 用FlameGraph這個工具。

alinode使用

經過上面簡單的介紹,能夠發現性能分析這裏有2個痛點。一個是收集數據,須要侵入代碼,手工執行相應的指令。另一個是: 分析工具五花八門,哪怕用chrome devtool也得經歷把dump的數據下載回來導入的比較痛苦的過程。

alinode 阿里Node.js性能平臺 對以上一些問題的解決過程進行了集成,提供了更易用的體驗,解決了大部分的痛點。並且是免費開源的(基本上)。alinode經過 錯誤日誌、操做系統指標(cpu/內存/磁盤/IO)、慢日誌、異常等維度來監控node應用,並提供瞭如 coredump、cpuProfile、heamdump 等工具,同時提供了Profile的在線web數據可視化分析的能力.

整體來看,alinode的幾個工具也就是提供了本文最開始提到的性能分析相關的能力,即數據提取、數據分析能力(固然還有額外的監控通知、好看的UI、實時數據展現)。

整體架構

alinode的設計架構以下:
架構圖

其實,只看技術細節部分的話。alinode包括這3部分的組件,咱們從底向上說:

  1. alinode改造後的Node 運行時。 這個node基本上是原生node,只是阿里在裏面給加入了dump數據的開關,從而能夠遠程收集性能數據。alinode版本與原生版本的對應關係能夠戳這裏。(你們夥本身使用時也無須關心有什麼後門,由於只是加了一些性能分析能力,且開源正在路上)
  2. agenthub。這是一個安裝在應用服務器上的一個agent。它負責與雲端alinode服務進行通訊。雲端管理系統進行命令下發、機器進行數據上報 都要經過這個agent來執行。所以,它是node進程與雲端管理平臺的橋樑。
  3. alinode雲服務。其實就是一個管理平臺了。雲端會有相應的服務來與機器上的agenthub創建websocket通訊,用於下發命令或收集信息。你能夠在雲端管理平臺上經過web界面集中式的處理性能分析的全部任務。

使用步驟

我在本機macbook上進行了站點的性能分析,下面咱們來看看 alinode 使用的基本步驟,對咱們學習別人的設計和思路也是頗有幫助的。除了觀看這裏的步驟以外,你還能夠參考官方幫助文檔 做爲輔助。

從上面的分析能夠看到,咱們在本機要作的事情其實就是安裝阿里改裝後的node運行時(alinode)以及agenthub。下面是具體步驟:

  • 安裝tnvm。咱們知道nvm是一個node版本管理器,淘寶這裏出了一個tnvm,用來管理anlinode版本。因此咱們先安裝tnvm,以後再經過tnvm來安裝alinode。
wget -O- https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh | bash

執行安裝腳本後,咱們再執行

source ~/.bash_profile ,# 你的多是 ~/.bash_rc

此時tnvm安裝成功。

  • 安裝alinode

執行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安裝

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 應用進程

咱們來啓動咱們的應用:

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了

  • 一些小問題

    • egg.js 項目
      若是你是egg的項目,那就不用親自啓動agenthub了。egg集成的話已經把agent內置在插件裏了,因此直接用插件就行了。這裏再也不贅述能夠看文檔
    • 安裝 alinode 運行時以後,別忘記 tnvm use;另外有時候你新開一個terminal的話,你的PATH環境變量會被還原。此時能夠再次執行 source ~/.bash_profile 來讓tnvm的node路徑優先。
    • 當你在管理平臺查看數據或執行dump命令時,可能會提示出錯。這裏有幾點排查思路:

      1. agenthub要與阿里雲管理平臺創建鏈接,而咱們的公司網絡不用代理的狀況下沒法聯通。這裏你能夠想辦法改agenthub的代理。我這裏採用了最簡單的辦法,直接使用 staffWifi。。
      2. 能夠tail -f ~/.agenthub.log 來看看本機agent日誌。好比日誌裏會看到你網絡鏈接有問題或日誌目錄配錯了;啓動應用時別忘了那兩個LOG的環境變量。

clipboard.png

雲管理界面

打開 node.console.aliyun.com ,進入管理控制檯首頁。

  • 首先看到的是:

控制檯首頁

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

  • 點開實例主頁,咱們能夠看到系統總體資源情況的儀表盤:

儀表盤

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

  • 點擊進程選項,咱們就能夠找到咱們進程信息。咱們在界面右上角的「正在運行的進程」 中選中咱們要分析的node進程,就能夠對他進行各類dump數據和分析操做了。例如咱們選中node進程,能夠查看他的qps、cpu使用率等基本信息:

進程面板

  • 點開進程面板右下角的 「數據趨勢」 按鈕,還能夠按時間線來看各項指標的變化曲線,便於發現問題。

數據變化趨勢

  • 系統監控數據面板能夠看到機器總體性能:

系統監控

  • 慢日誌面板會按照請求的耗時狀況給到超出預期的耗時,耗時從高到低排序展現在面板上,讓你知道系統的最慢耗時狀況。這裏沒有截圖。
  • 進程面板右下角的「抓取性能數據」就是咱們分析性能的利器了。這裏有 heapDump,cpu profile, 堆時間線(能夠看堆變化狀況),gctrace, 診斷報告。更多詳情能夠參考文檔

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

文件列表

  • 在線分析

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

火焰圖

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

devtool分析

GcTrace分析:

 GCtrace 分析

一些資料

你不知道的Node.js性能優化,讀了以後水平直線上升

對node工程進行壓力測試與性能分析

阿里雲的Node.js 應用故障排查手冊

alinode ppt: alinode-基於Node.js運行時的應用性能管理解決方案

你不知道的Node.js性能優化

相關文章
相關標籤/搜索