我的 Debian 7.3 服务器上存在高 I/O 问题(平均 I/O 等待时间长达 7 秒)。我尝试使用 iotop -o 找出导致此问题的原因。现在我看到一些奇怪的事情:iotop 在顶部告诉我“总磁盘写入:32.46M/s”。但在任务列表中,我看不到任何进程在磁盘上写入这么多。最高的是两个 mysql 进程,速度分别为 90K/s 和 8K/s,以及一个 kjournald 进程。这三个进程的 IO 均为 99.99%。# 如果我将所有写入速度加起来,也远远达不到 32MB/s。
iotop屏幕:
这里有什么问题?我认为 32.46MB/s 的写法是正确的,因为此时我的网络服务器的页面加载时间很长,可能是由于 I/O 较高造成的。但为什么使用这么多容量的“大任务”没有列在下面的列表中?
编辑:我还可以按磁盘写入对其进行排序,并且还会得到这样的奇怪结果:
答案1
如果你安装了较新的 iotop(例如 wheezy-backports 的 0.6.x),它将同时显示“总”值和“实际”值。手册页给出了解释
此外,界面顶部还显示了采样期间读写的总 I/O 带宽。总磁盘读取和总磁盘写入值表示进程和内核线程与内核块设备子系统之间的总读写带宽。而实际磁盘读取和实际磁盘写入值表示内核块设备子系统与底层硬件(HDD、SSD 等)之间实际磁盘 I/O 的相应带宽。因此,由于 Linux 内核内部发生的数据缓存和 I/O 操作重新排序,总值和实际值在任何给定时刻可能不相等。
虽然这个答案并不能完全让我满意,但至少它指出了导致差异的可能原因。可能是某些内核线程,如 FS 元数据/日志,或启动、执行 IO 并在 iotop 发现它们之前死亡的短暂进程。
有一些相关问题这里和这里. 对于调试,/proc/sys/vm/block_dump可能对找到来源有用。