使用带有 ext4混合 SSD 的Ubuntu 14.04 正常运行 30 分钟后,我看到许多进程使用 iotop 阻塞 IO。
这种减速的根本原因可以追溯到 Unix 系统调用sync。
sync从终端重复运行可能需要 1 - 2 秒的时间,但仅在 30 分钟的正常运行时间之后。
为了证明这一点,我制作了一个脚本,以秒为单位输出正常运行时间与执行同步所需的时间,并每秒运行一次:
while true;
do
cat /proc/uptime | awk '{printf "%f ",$1}'; /usr/bin/time -f '%e' sync;
sleep 1;
done;
Run Code Online (Sandbox Code Playgroud)
我运行了上面的脚本,等了大约一个小时(系统处于空闲状态)并在 gnuplot 中绘制了结果(y = 执行同步的时间,x = 以秒为单位的正常运行时间):

图表上升的时间点大约是 1780(1780/60 = 大约 30 分钟)。
除了脚本,此时不应向磁盘写入任何内容,因此在第一次同步之后页面缓存中应该几乎没有任何内容,每个后续同步将准确写入正在写入脚本的内容,大约为 100 字节或所以。
当我检查cat /proc/meminfo脏行(页面缓存中的数据需要保存到磁盘?)和回写行(HD磁盘缓冲区?)都为零时。我的想法是调用会sync刷新这些磁盘缓存,但即使这些缓存中没有任何内容,它仍然会冻结,所以它会做其他事情吗?
重新启动后此问题仍然存在;例如 - 如果我等待 30 分钟减速然后重新启动,减速仍然存在。如果我关闭电源然后重新启动问题会消失,直到 30 分钟后。
另一个好奇心是,当我检查上图并放大正在发生减速的区域时,我得到了这个:

波峰和波谷重复——这在波谷与波谷之间以 10 秒的间隔发生。
在减速之前,我还运行了 hdparm 测试( …