[Linux] 將 atop 檔案轉成可分析的文字檔 + 畫出圖表
最近在分析 memory leak 的問題,很自然地使用 atop -w 來記錄 process 的資訊,
像下面這樣的指令是每秒記錄一次,存到 test.atop 檔裡:
atop -w test.atop -a 1
要看的時候,用 atop -r 就可以用 UI 的方式查看:
(在 UI 畫面按 t 往前、按 T 往後,或是按 b 跳到指定時間)
atop -r test.atop
不過,如果想把記憶體用量的趨勢畫成圖表,
就得將這 atop 檔案轉成可以分析 (parseable) 的文字檔才行~
要轉的方法我目前知道的有兩種:
1. 直接輸出至檔案
atop -r 直接轉向至檔案,資料就會以文字方式存起來~
atop -r test.atop > test_atop.txt
存起來的內容類似下面這樣:
ATOP - localhost 2015/01/23 23:59:59 --------- 31d6h56m13s elapsed PRC | sys 26h50m | user 231m59s | #proc 257 | #zombie 0 | #exit 0 | CPU | sys 86% | user 14% | irq 1% | idle 685% | wait 14% | cpu | sys 12% | user 1% | irq 0% | idle 86% | cpu001 w 1% | cpu | sys 12% | user 1% | irq 0% | idle 86% | cpu003 w 1% | cpu | sys 11% | user 2% | irq 0% | idle 86% | cpu007 w 1% | cpu | sys 11% | user 2% | irq 0% | idle 86% | cpu006 w 1% | cpu | sys 11% | user 2% | irq 0% | idle 85% | cpu000 w 2% | cpu | sys 11% | user 1% | irq 0% | idle 87% | cpu002 w 1% | cpu | sys 10% | user 2% | irq 0% | idle 87% | cpu005 w 1% | cpu | sys 8% | user 2% | irq 0% | idle 82% | cpu004 w 8% | CPL | avg1 0.91 | avg5 1.47 | avg15 1.62 | csw 876041e5 | intr 11623e4 | MEM | tot 15.6G | free 1.0G | cache 9.9G | buff 1.1G | slab 428.6M | SWP | tot 0.0M | free 0.0M | | vmcom 4.2G | vmlim 7.8G | PAG | scan 76016e3 | steal 7596e4 | stall 0 | swin 0 | swout 0 | DSK | sda | busy 11% | read 1718657 | write 9879e4 | avio 3.00 ms | NET | transport | tcpi 11204e4 | tcpo 71272e3 | udpi 10422e4 | udpo 30197e3 | NET | network | ipi 217364e3 | ipo 103213e3 | ipfrw 0 | deliv 2174e5 | NET | eth0 0% | pcki 32790e3 | pcko 22908e3 | si 70 Kbps | so 10 Kbps | NET | lo ---- | pcki 37637e3 | pcko 37637e3 | si 54 Kbps | so 54 Kbps | NET | vboxnet ---- | pcki 0 | pcko 43314e3 | si 0 Kbps | so 26 Kbps | NET | br0 ---- | pcki 0 | pcko 6 | si 0 Kbps | so 0 Kbps | NET | br1 ---- | pcki 0 | pcko 6 | si 0 Kbps | so 0 Kbps | NET | br2 ---- | pcki 0 | pcko 6 | si 0 Kbps | so 0 Kbps | NET | brsnf ---- | pcki 0 | pcko 6 | si 0 Kbps | so 0 Kbps | *** system and process activity since boot *** PID SYSCPU USRCPU VGROW RGROW RDDSK WRDSK ST EXC S CPU CMD 1256 646m38s 0.00s 0K 0K 0K 0K N- - S 1% kipmi0 22944 78m10s 24m12s 321.6M 132.3M 0K 4K N- - S 0% VBoxHeadless 859 58m16s 0.00s 0K 0K 264K 38.7G N- - S 0% kjournald 23515 7m36s 47m20s 225.8M 15752K 64K 0K N- - S 0% python
只要再用 awk 或其他方法取出裡面需要的資訊就行了~
不過像 RSIZE 的資訊這樣子是看不到的…
2. 使用 atop -P 選擇要分析的類別
這是比較好的方式,因為輸出的資料會比方法 1 更容易分析~
執行 atop -r file -P [labels],這邊的 labels 是 atop 定義的一些名稱,
像 PRM 就代表要取出 process memory 相關的資料,
而 PRC 則是跟 process CPU usage 有關的資料…
詳細的 labels 可以用 man atop,
或是查線上的 atop(1) – Linux man page: Parseable Output~
像下面的指令就是要取出跟記憶體用量相關的資訊:
atop -r test.atop -P PRM
執行後的結果會類似下面這樣:
PRM localhost 1422028860 2015/01/24 00:01:00 1 26935 (python) S 4096 320968 54408 1304 0 0 0 0 12736 185760 196 0 26935 y PRM localhost 1422028860 2015/01/24 00:01:00 1 26952 (python) S 4096 320968 54408 1304 0 0 0 0 12736 185760 196 0 26935 n PRM localhost 1422028860 2015/01/24 00:01:00 1 26953 (python) S 4096 320968 54408 1304 0 0 0 0 12736 185760 196 0 26935 n PRM localhost 1422028860 2015/01/24 00:01:00 1 27290 (tail) S 4096 3148 344 940 0 0 0 0 0 980 84 0 27290 y PRM localhost 1422028860 2015/01/24 00:01:00 1 28208 (sh) S 4096 3148 420 940 0 0 0 0 0 980 84 0 28208 y PRM localhost 1422028860 2015/01/24 00:01:00 1 28295 (sh) S 4096 3148 448 940 0 0 0 0 0 980 84 0 28295 y PRM localhost 1422028860 2015/01/24 00:01:00 1 28339 (sshd) S 4096 5168 3004 372 0 0 0 0 3076 1468 84 0 28339 y PRM localhost 1422028860 2015/01/24 00:01:00 1 28340 (sh) S 4096 5760 1152 940 0 0 0 0 1416 2036 168 0 28340 y PRM localhost 1422028860 2015/01/24 00:01:00 1 28352 (atop) S 4096 6004 6004 148 0 0 0 0 1900 3784 84 0 28352 y
上面這個要怎麼看呢?先看一下 man atop 裡關於 PRM 的說明,
前面六個的欄位不算的話,第 1 個欄位是 PID、第 2 個欄位是 process name…
像我想看的 RSIZE 是在第 6 個欄位 (例如第一個 python 的 RSIZE 是 54408 KB)~
知道上述的資訊之後,就可以很容易地分析想要的東西了,
像我想知道 pid 26935 的 RSIZE 變化趨勢,可以執行下面的指令,
找出 pid 是 26935 且是 process (非 thread) 的 RSIZE 資料:
atop -r test.atop -P PRM | egrep "26935 y$" | awk '{print $12}'
執行後像這樣:
54416 54408 54408 54408 54408 54408 54408 54896 54896 54896
這個資訊就可以直接貼去 Excel 畫圖了~
或是想用其他工具來自動繪圖也都可以囉~^^