如何記錄應用程式的記憶體和CPU使用情況?

如何記錄應用程式的記憶體和CPU使用情況?

類似於問題如何記錄CPU負載?,我想記錄一個進程的記憶體。

我想要記錄的進程在遠端伺服器上被殺死,我想找出它被殺死之前的 CPU 負載和記憶體使用情況。

[更新]

Stefano Palazzo 簡潔的小 python 腳本和

Michał 的單行輸出值小於topCPU 和 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

CPU 與 RSS 圖

相關內容