如何監控單個程序的 CPU/記憶體使用情況?
我想實時監控一個程序的記憶體/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):
psrecord
下面介紹某種歷史圖表。Python
psrecord
包正是這樣做的。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'
memory_profiler
該包提供僅 RSS 採樣(以及一些特定於 Python 的選項)。它還可以記錄帶有子程序的程序(請參閱 參考資料
mprof --help
)。pip install memory_profiler mprof run /path/to/executable mprof plot
預設情況下,這會彈出一個基於 Tkinter(
python-tk
可能需要)的圖表瀏覽器,可以導出:石墨堆棧和統計數據
對於一個簡單的一次性測試來說,這似乎有點過頭了,但對於像幾天調試這樣的事情,它肯定是合理的。一個方便的一體式
raintank/graphite-stack
(來自 Grafana 的作者)圖像psutil
和statsd
客戶端。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
pidstat
(sysstat
包的一部分)可以產生易於解析的輸出。當您需要來自程序的額外指標時,它很有用,例如,最有用的 3 組(CPU、記憶體和磁碟)包含:%usr
、%system
、%guest
、%CPU
、minflt/s
、majflt/s
、VSZ
、RSS
、%MEM
、kB_rd/s
、kB_wr/s
、kB_ccwr/s
。我在一個相關的答案中描述了它。