[Linux] 將 atop 檔案轉成可分析的文字檔 + 畫出圖表

[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 畫圖了~

或是想用其他工具來自動繪圖也都可以囉~^^

 

(本頁面已被瀏覽過 257 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料