行程路徑

行程路徑

我想即時監控一個進程的記憶體/CPU 使用情況。類似於top但僅針對一個進程,最好有某種歷史圖。

答案1

在Linux上,top實際上支援專注於單一進程,儘管它自然沒有歷史圖:

top -p PID

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

top -pid PID

答案2

行程路徑

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 中央處理器

記錄

以下地址某種歷史圖表。 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'

圖表看起來像: ps記錄範例

記憶體分析器

包裹提供僅 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,您可以繪製如下圖表:

格拉法納圖表

石墨堆疊和電報

不是使用 Python 腳本將指標傳送到 Statsd,telegraf(和procstat輸入插件)可用於將指標直接傳送到 Graphite。

最小telegraf配置如下:

[agent]
  interval = "1s"

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

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

然後跑線telegraf --config minconf.conf。除了指標名稱之外,Grafana 部分是相同的。

PID統計

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

答案3

htop是 . 的一個很好的替代品top。它有……顏色!簡單的鍵盤快捷鍵!使用箭頭鍵滾動列表!殺死一個進程而不離開也不記下 PID!標記多個進程並將其全部殺死!

在所有功能中,線上說明頁顯示您可以F跟隨一個過程。

真的,你應該嘗試一下htoptop自從我第一次使用之後,我就再也沒有開始過htop

顯示單一進程:

htop -p PID

答案4

我來晚了一點,但我將僅使用預設值分享我的命令列技巧ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

我用它當作一句台詞。這裡第一行觸發命令並將 PID 儲存在變數中。然後 ps 將列印經過的時間、PID、CPU 使用百分比、記憶體百分比和 RSS 記憶體。您也可以新增其他欄位。

一旦進程結束,該ps命令將不會返回“成功”並且while循環將結束。

如果您要分析的 PID 已在運行,您可以忽略第一行。只需將所需的 id 放入變數中即可。

您將得到如下輸出:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....

相關內容