2.3. Diskdevstat 與 netdevstat

Diskdevstatnetdevstat 都屬於 SystemTap 工具組,用來蒐集系統上所有應用程式存取磁碟與網路的詳盡資料。這些工具的靈感來自 PowerTOP,顯示了每個應用程式對 CPU 的喚醒次數(詳情請參閱 節 2.2, “PowerTOP”)。這些工具所蒐集的統計數據能讓您找出最耗電的應用程式,其中以大量的小筆 I/O 運作為最,而不是少量大筆的運作。其它只能衡量傳輸速度的監控工具,並無法分辨這方面的用量。
root 身份透過下列指令來以 SystemTap 安裝這些工具:
yum install systemtap tuned-utils kernel-debuginfo
請以此指令執行這些工具:
diskdevstat
或是:
netdevstat
兩個指令都可以接受三個參數,分別是:
diskdevstat update_interval total_duration display_histogram
netdevstat update_interval total_duration display_histogram
update_interval
每次更新畫面的時間間隔,單位為秒。預設值為 5
total_duration
整個執行時間,單位為秒。預設值為 86400(一天)
display_histogram
旗標值,表示在執行結束時,是不是要將所有資料以直方圖列出。
螢幕列出的資料來自 PowerTOP。以下是在 Fedora 10 搭配 KDE 4.2 的系統上,執行 diskdevstat 的結果:
  PID   UID DEV     WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG    READ_CNT  READ_MIN  READ_MAX  READ_AVG COMMAND        
 2789  2903 sda1          854     0.000   120.000    39.836           0     0.000     0.000     0.000 plasma            
15494     0 sda1            0     0.000     0.000     0.000         758     0.000     0.012     0.000 0logwatch         
15520     0 sda1            0     0.000     0.000     0.000         140     0.000     0.009     0.000 perl              
15549     0 sda1            0     0.000     0.000     0.000         140     0.000     0.009     0.000 perl              
15585     0 sda1            0     0.000     0.000     0.000         108     0.001     0.002     0.000 perl              
 2573     0 sda1           63     0.033  3600.015   515.226           0     0.000     0.000     0.000 auditd            
15429     0 sda1            0     0.000     0.000     0.000          62     0.009     0.009     0.000 crond             
15379     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15473     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15415     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15433     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15425     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15375     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15477     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15469     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15419     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15481     0 sda1            0     0.000     0.000     0.000          61     0.000     0.001     0.000 crond             
15355     0 sda1            0     0.000     0.000     0.000          37     0.000     0.014     0.001 laptop_mode       
 2153     0 sda1           26     0.003  3600.029  1290.730           0     0.000     0.000     0.000 rsyslogd          
15575     0 sda1            0     0.000     0.000     0.000          16     0.000     0.000     0.000 cat               
15581     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15582     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15579     0 sda1            0     0.000     0.000     0.000          12     0.000     0.001     0.000 perl              
15580     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15354     0 sda1            0     0.000     0.000     0.000          12     0.000     0.170     0.014 sh                
15584     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15548     0 sda1            0     0.000     0.000     0.000          12     0.001     0.014     0.001 perl              
15577     0 sda1            0     0.000     0.000     0.000          12     0.001     0.003     0.000 perl              
15519     0 sda1            0     0.000     0.000     0.000          12     0.001     0.005     0.000 perl              
15578     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15583     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15547     0 sda1            0     0.000     0.000     0.000          11     0.000     0.002     0.000 perl              
15576     0 sda1            0     0.000     0.000     0.000          11     0.001     0.001     0.000 perl              
15518     0 sda1            0     0.000     0.000     0.000          11     0.000     0.001     0.000 perl              
15354     0 sda1            0     0.000     0.000     0.000          10     0.053     0.053     0.005 lm_lid.sh
欄位為:
PID
應用程式的程序 ID
UID
執行應用程式的使用者 ID
DEV
發生 I/O 的裝置
WRITE_CNT
寫入的總數
WRITE_MIN
兩次連續寫入的最短時間(單位為秒)
WRITE_MAX
兩次連續寫入的最長時間(單位為秒)
WRITE_AVG
兩次連續寫入的平均時間(單位為秒)
READ_CNT
讀取的總數
READ_MIN
兩次連續讀取的最短時間(單位為秒)
READ_MAX
兩次連續讀取的最長時間(單位為秒)
READ_AVG
兩次連續讀取的平均時間(單位為秒)
COMMAND
程序的名稱
在這範例中,有三個應用程式特別突出:
  PID   UID DEV     WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG    READ_CNT  READ_MIN  READ_MAX  READ_AVG COMMAND
 2789  2903 sda1          854     0.000   120.000    39.836           0     0.000     0.000     0.000 plasma
 2573     0 sda1           63     0.033  3600.015   515.226           0     0.000     0.000     0.000 auditd
 2153     0 sda1           26     0.003  3600.029  1290.730           0     0.000     0.000     0.000 rsyslogd
這三個應用程式的 WRITE_CNT 都大於 0,表示在評量期間,它們都有寫入資料。其中 plasma 的數值特別高:它進行了大部分的寫入動作,當然寫入之間的平均時間也最低。如果您想找出最不省電的應用程式,自然 Plasma 就成為最值得觀察的對象。
請藉由追蹤特定程序 ID 的系統呼叫,使用 stranceltrace 指令來進一步檢視應用程式。就以目前的範例來說,您可以執行:
strace -p 2789
在這範例中,strace 的運作模式為每 45 秒開啟 KDE 的圖示快取檔案,寫入資料後又馬上關閉檔案。這導致不必要的硬碟寫入,因為檔案的 meta 資訊(更準確的說,是修改時間)有所改變。最終的修正是為了避免這些不必要的呼叫,因為圖示沒有任何改變。