2.3. Diskdevstat 和 Netdevstat

Diskdevstatnetdevstat 都属于 SystemTap 工具,它们的功能是搜集系统上运行的所有应用程序的磁盘和网络活动的详细信息。这些工具的灵感来自于 PowerTOP,PowerTOP 可显示每个应用程序每秒唤醒 CPU 的次数(请参阅〈第 2.2 节 “PowerTOP”〉)。这些工具收集的统计数据可让您识别那些使用大量的小型 I/O 操作的应用程序,这种应用程序比少量的较大操作更耗电。其它的监控工具只测量传输速度,无法帮助分辨此类使用量。
使用 SystemTap 来安装这些工具,请以 root 身份执行以下指令:
yum install tuned-utils-systemtap 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 的结果类似。以下是在使用 KDE 4.2 的 Fedora 10 系统上运行 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 就是最佳的观察对象。
请使用 straceltrace 命令,通过追踪所有给定进程 ID 的系统调用,对应用程序进行进一步检查。在这个示例中,您可以运行:
strace -p 2789
在这个示例中,strace 的输出结果中包含一个每 45 秒重复一次的模式,该模式会打开用户的 KDE 图标缓冲文件,接着写入,然后马上关闭该文件。这导致必需在硬盘上进行物理写入,因为文件原数据已经改变了(更准确地说是时间被修改了)。最终修复是为了避免在没有图标更新时进行不必要的调用。