2.3. Diskdevstat 和 netdevstat
Diskdevstat 和 netdevstat 是收集有关磁盘活性以及在系统中运行的所有程序的网络活性的 SystemTap 工具。这些工具是由 PowerTOP 支配,并可显示每秒钟每个程序唤醒 CPU 的次数(请参考 第 2.2 节 “PowerTOP”)。这些工具收集的统计可让您识别那些使用很多小 I/O 操作的程序,它们比少量的较大操作更耗能。其它监控工具只是测量传输速度,无法帮助确认此类使用。
使用 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。这里是来自使用 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 就是最佳审查对象。
请使用 strace 和 ltrace 命令,通过追踪所有给定进程 ID 的系统调用更进一步检查应用程序。在这个示例中,您可以运行:
strace -p 2789
在这个示例中,
strace
的输出结果中包含一个每 45 秒重复一次的图案,该图案打开用户的 KDE 图标缓冲文件,接着写入,然后马上再次关闭该文件。这导致一个在硬盘中的必需物理写入,因为已经更改了文件原数据(特别是修改时间)。最终修复是防止那些在没有图标更新时的不必要调用。