類似於問題如何記錄CPU負載?,我想記錄一個進程的記憶體。
我想要記錄的進程在遠端伺服器上被殺死,我想找出它被殺死之前的 CPU 負載和記憶體使用情況。
[更新]
Stefano Palazzo 簡潔的小 python 腳本和
Michał 的單行輸出值小於top
CPU 和 Mem 的單行輸出值。你知道為什麼嗎?
輸出頂部:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
輸出 Stefano Palazzo 的 python 腳本:
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
答案1
您可以在 shell 中建立一行:
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
記錄 pid=123 的進程:
logpid 123
或查看日誌並將其寫入文件:
logpid $$ | tee /tmp/pid.log
如果您希望記錄其他數據,請修改-o {this}
選項。man ps
有關可用參數,請參閱“標準格式說明符”部分。如果您想要不同的時間分辨率,請變更sleep {this}
function logpid()
。
答案2
如果您精確地追蹤top
統計訊息,您可以top
在批次模式下運行,指定您所追蹤的進程的 pid。以此頁面為例(http://www.dedoimedo.com/computers/linux-cool-hacks.html)如果你輸入
top -b -d 10 -n 3 >> top-file
您將“讓 top 以批次模式運行 (-b)。它將按照延遲 (-d) 標誌的指定每 10 秒刷新一次,總共 3 次迭代 (-n)。輸出將被發送到一個文件。”包括-p
您可以指定pid
您正在執行的流程。當然,這將返回的不僅僅是純粹的 cpu 和 ram,但它將包含這些字段。以我為例,當使用以下命令監視 pid 9189 時,我會得到以下資訊top -b -d 10 -n 3 -p 9189 >> ~/top-file
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
答案3
這個簡單的 python 腳本應該可以完成您想要的操作:
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __name__ == '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
你首先需要找出你想要監控的程式的進程ID,然後你可以使用PID作為參數來執行腳本:
python log.py 3912
它將每秒列印兩次 cpu 使用率和 ram 使用率百分比:
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
然後,您可以將其輸出重定向到文件,以便稍後將其匯入電子表格中 ( python log.py 9391 > firefox_log.txt
),並將資料匯入至選擇Tab
作為分隔符號的電子表格中。
當您按 Ctrl+C 或進程被終止時,程式將會退出。
答案4
行程路徑可用於記錄應用程式(進程樹)的 Procfs 指標,包括 CPU 使用率和駐留集大小 (RSS)。完全披露:我寫的。
我們以火狐瀏覽器為例。在我的機器上,它的進程樹如下所示:
/usr/lib/firefox/firefox
├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
└─ /usr/lib/firefox/firefox -contentproc -childID 8 ...
透過 Procpath,您可以從該樹中收集進程指標,如下所示(並參見文件如果您想向您的應用程式的進程管理器(例如 systemd 或 Docker)詢問根 PID):
procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'
使用此命令,Procpath 將每 10 秒收集並記錄一次該樹的 Procfs 指標。您可以讓它在終端多工器(如 Byobu)中運行,以便在伺服器的後台運行它。
當您的應用程式再次崩潰時,您可以使用此命令視覺化應用程式的 CPU 使用情況和駐留集大小。
procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer