Shell

如何監控單個程序的 CPU/記憶體使用情況?

  • May 19, 2021

我想實時監控一個程序的記憶體/cpu使用情況。類似於top但僅針對一個過程,最好使用某種歷史圖表。

在 Linux 上,top實際上支持關注單個程序,儘管它自然沒有歷史圖:

top -p PID

這在 Mac OS X 上也可用,但語法不同:

top -pid PID

程序路徑

2020 年更新(僅限 Linux/procfs)。經常回到過程分析的問題,並且對我最初描述的解決方案不滿意,我決定編寫自己的. 它是一個純 Python CLI 包,包括它的幾個依賴項(沒有繁重的 Matplotlib),可以繪製從 procfs、JSONPath 查詢到程序樹的許多指標,具有基本的抽取/聚合(Ramer-Douglas-Peucker 和移動平均),過濾通過時間範圍和 PID 以及其他一些東西。

pip3 install --user procpath

這是 Firefox 的範例。這將記錄所有帶有“firefox”的程序cmdline(通過PID查詢看起來像'$..children[?(@.stat.pid == 42)]')120次每秒一次。

procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'

繪製所有記錄中單個程序(或多個)的 RSS 和 CPU 使用情況如下所示:

procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg

圖表看起來像這樣(它們實際上是互動式 Pygal SVG):

RSS 中央處理器

psrecord

下面介紹某種歷史圖表。Pythonpsrecord包正是這樣做的。

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

對於單個程序,它如下(由 停止Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

對於多個程序,以下腳本有助於同步圖表:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

圖表看起來像: psrecord 範例

memory_profiler

提供僅 RSS 採樣(以及一些特定於 Python 的選項)。它還可以記錄帶有子程序的程序(請參閱 參考資料mprof --help)。

pip install memory_profiler
mprof run /path/to/executable
mprof plot

預設情況下,這會彈出一個基於 Tkinter(python-tk可能需要)的圖表瀏覽器,可以導出:

教授

石墨堆棧和統計數據

對於一個簡單的一次性測試來說,這似乎有點過頭了,但對於像幾天調試這樣的事情,它肯定是合理的。一個方便的一體式raintank/graphite-stack(來自 Grafana 的作者)圖像psutilstatsd客戶端。procmon.py提供了一個實現。

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

然後在另一個終端中,啟動目標程序後:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

然後在 http://localhost:8080 打開 Grafana,身份驗證為admin:admin,設置數據源 https://localhost,可以繪製如下圖表:

格拉法納圖表

石墨堆棧和電報

代替將指標發送到 Statsd 的 Python 腳本,telegraf(和procstat輸入外掛)可用於將指標直接發送到 Graphite。

最小telegraf配置如下:

[agent]
 interval = "1s"

[[outputs.graphite]]
 servers = ["localhost:2003"]
 prefix = "testprfx"

[[inputs.procstat]]
 pid_file = "/path/to/file/with.pid"

然後執行 line telegraf --config minconf.conf。Grafana 部分是相同的,除了指標名稱。

pidstat

pidstatsysstat包的一部分)可以產生易於解析的輸出。當您需要來自程序的額外指標時,它很有用,例如,最有用的 3 組(CPU、記憶體和磁碟)包含:%usr%system%guest%CPUminflt/smajflt/sVSZRSS%MEMkB_rd/skB_wr/skB_ccwr/s。我在一個相關的答案中描述了它。

引用自:https://unix.stackexchange.com/questions/554