跳到主要內容
節省工具箱Jason Tools
專案分享

IT @ Jason Tools:自主開發的 IT 實用工具箱(四)

Jason Cheng 發布
IT @ Jason Tools:自主開發的 IT 實用工具箱(四)
本文目錄
  1. 運作方式
  2. 在主機上收集資料
  3. 在瀏覽器分析
  4. 常見使用情境
  5. 注意事項
  6. 結論
  7. 參考資料

使用者說「系統每天下午都很慢」、客戶說「那台主機三不五時 CPU 衝高」,要查是哪一支程式造成的,最直接的方式是收集每個執行檔的 CPU、記憶體、磁碟 I/O 一段時間,再看趨勢。

問題是,要做到這件事,常見的做法是裝 agent 或 exporter、架 Prometheus 收資料、再架 Grafana、再做儀表板……為了查一次問題要搞這麼多東西,很多時候客戶的主機也不允許隨便裝軟體。所以我在 IT @ Jason Tools 做了執行檔效能檢視器:主機上只要放一支腳本跑一段時間,把產生的檔案拿回來,丟進瀏覽器就能分析,不用安裝任何軟體。

運作方式

整個流程只有兩段:

階段在哪裡做需要什麼
收集資料要檢查的主機Windows 內建的 PowerShell,或 Linux 內建的 bash
分析資料你自己的電腦瀏覽器開 it.jason.tools

和常見的監控方案比較:

項目agent/exporter+Prometheus+Grafana執行檔效能檢視器
主機上要裝的東西agent 或 exporter 服務無,一支腳本跑完就結束
要另外架的伺服器Prometheus、Grafana無
要設定的儀表板要自己做或匯入內建,載入檔案就有圖表
資料去向存在監控伺服器檔案在你手上,分析時也不會上傳
適合長期監控、告警臨時查問題、一次性的效能分析

長期監控、告警還是要靠正式的監控系統(我自己用 LibreNMS),但「這台主機最近到底是誰在吃資源」這種一次性的問題,用這個方式快很多。

在主機上收集資料

收集用的腳本放在 GitHub 的 it-scripts 專案裡,工具頁面上也有完整的下載與執行指令,可以直接複製。

Windows

以系統管理員身分開啟 PowerShell:

if (!(Test-Path C:\temp)) { New-Item -Path C:\temp -ItemType Directory }; cd C:\temp

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod -Uri "https://raw.githubusercontent.com/jasoncheng7115/it-scripts/refs/heads/master/jt_procperf_analyzer/jt_procperf_analyzer.ps1" -OutFile "jt_procperf_analyzer.ps1"

powershell.exe -ExecutionPolicy Bypass -File .\jt_procperf_analyzer.ps1 -D 30 -I 15
  • -D 30:收集 30 分鐘
  • -I 15:每 15 秒取樣一次
  • -ExecutionPolicy Bypass:只對這一次執行放寬腳本限制,不會改到系統的執行原則

部分 Windows 11 用指令下載可能會被擋,也可以在瀏覽器直接下載 jt_procperf_analyzer.ps1 存到 C:\temp 再執行。完成後 CSV 檔就在 C:\temp。

Linux

建議用 root 執行,才能讀到所有程序的完整資訊:

cd /tmp
curl -O https://raw.githubusercontent.com/jasoncheng7115/it-scripts/refs/heads/master/jt_procperf_analyzer/jt_procperf_analyzer.sh
chmod +x jt_procperf_analyzer.sh
sudo ./jt_procperf_analyzer.sh -d 30 -i 15

Linux 版只用 /proc 與 awk、date 這些系統內建工具,連 bc 都不需要,一般發行版、容器、精簡的嵌入式系統都能執行。完成後會產生 process_metrics_YYYYMMDD_HHMMSS.csv。

常用參數

用途WindowsLinux
收集時間(分鐘,預設 60)-D-d、--duration
取樣間隔(秒,預設 60)-I-i、--interval
輸出格式(CSV/JSON/TSV)-F-f、--format
輸出目錄-O-o、--output
只收集特定程序-IncludeProcesses--include
CPU 門檻(%)-MinimumCPU--min-cpu
記憶體門檻(MB)-MinimumMemoryMB--min-memory

例如只看 nginx 和 mysql:

sudo ./jt_procperf_analyzer.sh -d 30 -i 10 --include nginx --include mysql

注意:取樣間隔建議 20 秒以上。每次取樣都要讀取所有程序的資訊,間隔太短反而會讓腳本本身成為主機的負擔,影響你要觀察的結果。

邊收邊寫

腳本是每次取樣就寫入檔案,不是全部收完才寫。所以:

  • 收集到一半可以先把檔案拿出來看
  • 臨時要中斷,按 Ctrl + C,已經收集的資料不會遺失
  • 長時間收集也不會在記憶體裡累積大量資料

在瀏覽器分析

打開 https://it.jason.tools/tools/process-perf-analyzer.html,把 CSV 檔拖進「資料來源」區塊,或直接貼上內容,按「開始分析」。

執行檔效能檢視器:上傳或貼上腳本產生的檔案,資料只在瀏覽器內解析
執行檔效能檢視器:上傳或貼上腳本產生的檔案,資料只在瀏覽器內解析

檔案不會上傳到任何地方,全部在瀏覽器分頁裡解析。效能資料裡有主機上的程序名稱、執行帳號,這點對客戶的主機特別重要。

想先看看效果,可以按「載入範例資料」,會產生一份 30 分鐘、每 10 秒取樣的範例。

總覽

分析完成後,上方會先顯示監控的程序數、CPU 最高的程序、記憶體最高的程序,以及資料來自哪種作業系統(依欄位自動判斷 Windows 或 Linux)。

挑選程序

左側列出所有程序,可以搜尋、多選,也可以依最大 CPU 使用率、最大記憶體、最大磁碟 I/O 設定門檻篩選,把幾百個程序收斂到真正有在用資源的那幾個。

同一個執行檔有多個程序時(例如瀏覽器、服務主機),可以切換:

  • 合併模式:依執行檔名稱加總,看整支程式的用量
  • 分開模式:依 PID 分開,找出是其中哪一個程序在作怪

時間範圍

用時間軸滑桿或指定起訖時間,把圖表聚焦在問題發生的那段時間,例如使用者說「下午兩點多最慢」,就只看那半小時。

趨勢圖表

選好程序後,會同時畫出八種趨勢圖:

圖表用途
CPU 使用率誰在吃 CPU、是持續高還是週期性衝高
記憶體使用量是否持續成長(可能有記憶體流失)
磁碟 I/O 讀取、寫入誰在大量讀寫磁碟
I/O 操作次數小檔案大量讀寫造成的 IOPS 壓力
執行緒數量執行緒不斷增加通常是程式有問題
控制代碼數量(Linux 為檔案描述元)控制代碼只增不減,是資源流失的典型徵兆
分頁錯誤率記憶體不足、頻繁換頁
CPU 使用率趨勢:同時比較多個程序,右側可切換顯示
CPU 使用率趨勢:同時比較多個程序,右側可切換顯示

所有圖表的時間軸是同步的,可以對照同一時間點 CPU、記憶體、磁碟 I/O 的變化,找出它們之間的關係。

記憶體使用趨勢:與 CPU、磁碟 I/O 的時間軸同步
記憶體使用趨勢:與 CPU、磁碟 I/O 的時間軸同步

最下方還有異常偵測與建議,例如 CPU 使用率超過 50% 的程序會特別標出來;以及每個程序的詳細資訊表。

常見使用情境

  • 使用者反應某個時段特別慢
    在那段時間前後收集,對照 CPU 與磁碟 I/O,看是排程工作、防毒掃描還是某個服務
  • 懷疑記憶體或控制代碼流失
    拉長收集時間(例如 6 小時、每 60 秒),看記憶體與控制代碼是否只增不減
  • 變更前後比較
    更新程式、調整設定前後各收一份,用同一個工具比對
  • 客戶主機不允許安裝軟體
    只需要執行腳本,跑完就結束,不會留下服務或排程

注意事項

  • 腳本只讀取系統資訊,不會修改任何設定,執行前還是建議先打開看過內容,它是公開在 GitHub 上的
  • Windows 部分進階指標需要系統管理員權限,Linux 用一般使用者執行時,只看得到自己的程序
  • 這是取樣,不是連續記錄:取樣間隔 15 秒,就看不到中間幾秒鐘的尖峰,要抓短暫的尖峰,就縮短間隔、縮短收集時間
  • 效能資料檔裡有程序名稱、執行帳號、命令列等資訊,交給別人分析前要留意內容

結論

想抓效能,不一定要先架一整套監控系統。一支內建 Shell 就能跑的腳本、一個瀏覽器就能開的分析工具,就能回答「到底是誰在吃資源」這個問題,而且主機上什麼都不用裝。

IT @ Jason Tools 系列的其他介紹:

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀