![运行 30 分钟后,调用 sync/fsync 会减慢 IO 速度](https://linux22.com/image/645158/%E8%BF%90%E8%A1%8C%2030%20%E5%88%86%E9%92%9F%E5%90%8E%EF%BC%8C%E8%B0%83%E7%94%A8%20sync%2Ffsync%20%E4%BC%9A%E5%87%8F%E6%85%A2%20IO%20%E9%80%9F%E5%BA%A6.png)
使用带有 ext4 的 Ubuntu 14.04 运行 30 分钟后混合SSD我看到许多进程使用 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;
我运行了上述脚本,等待了大约一个小时(系统处于空闲状态)并在 gnuplot 中绘制了结果(y = 执行同步的时间(秒数),x = 正常运行时间(秒数):
图表突然上升的时间点在 1780 左右(1780/60 = 大约 30 分钟)。
此时除了脚本之外,不应该将任何内容写入磁盘,因此第一次同步后页面缓存中应该几乎没有任何内容,每次后续同步都会准确地写入写入脚本的内容,大约 100 字节左右。
当我检查cat /proc/meminfo
脏行(页面缓存中需要保存到磁盘的数据?)和写回行(HD 磁盘缓冲区?)时,它们都为零。我的想法是,调用sync
会刷新这些磁盘缓存,但即使这些缓存中没有任何内容,它仍然会冻结,所以它是否做了其他事情?
重启后此问题仍然存在;例如 - 如果我等待 30 分钟以解决速度减慢问题,然后重启,速度减慢问题仍然存在。如果我关机然后重启,问题会在 30 分钟后消失。
另一个令人好奇的是,当我检查上面的图表并放大出现速度减慢的区域时,我得到了以下结果:
波峰和波谷会重复出现 - 波谷之间的间隔为 10 秒。
在速度变慢之前,我也运行了 hdparm 测试(hdparm -t /dev/sda
和):hdparm -T /dev/sda
/dev/sda:
Timing cached reads: 23778 MB in 2.00 seconds = 11900.64 MB/sec
/dev/sda:
Timing buffered disk reads: 318 MB in 3.01 seconds = 105.63 MB/sec
在经济放缓期间:
/dev/sda:
Timing cached reads: 2 MB in 2.24 seconds = 915.50 kB/sec
/dev/sda:
Timing buffered disk reads: 300 MB in 3.01 seconds = 99.54 MB/sec
显示实际的磁盘读取没有受到影响但缓存读取受到影响,这是否意味着这与系统总线有关而不是 HD 有关?
以下是我尝试过的解决方案:
更改 HD 的旋转设置(也许 HD 正在进入省电模式?):
hdparm /dev/sda -S252 #(set it to 5 hours before spindown)
将文件系统的日志类型更改为写回而不是有序,以便我们获得性能改进 - 但这并不能解决问题,因为它不能解释当我尝试这样做时 30 分钟的无减速正常运行时间而没有任何变化。
禁用 CRON,因为它似乎在 30 分钟后发生。
CPU 使用率很好并且完全处于空闲状态,因此不能归咎于任何进程,但是我尝试关闭包括会话管理器 (lightdm) 在内的所有服务,但这没有任何作用,因为我相信问题是较低级别的。
分析 30 分钟内出现的任何新流程都表明没有变化——我已经比较了前后 PS 的输出,没有区别。
这个问题大约在 2 周前才开始出现,当时没有安装任何软件,也没有进行任何更新。我认为这个问题的级别要低得多,因此我非常希望得到一些帮助,因为我对此一无所知,即使给我指明正确的方向也会有所帮助。
有问题的磁盘上启用了写入缓存,我也尝试过禁用写入屏障。HD 上的 SMART 数据表明 HD 本身没有问题,但我怀疑是 HD 做了一些神秘的事情,因为重启后问题仍然存在。
答案1
这是由于智能数据针对相关驱动器启用。
禁用SMART数据解决了这个问题:
sudo smartctl --smart=off /dev/sda
有趣的是,重新启用驱动器的 SMART 数据不会使问题再次出现,这表明 SMART 处于不一致的状态(在自我检测运行时可能崩溃?),将其关闭然后再次打开会重置该状态。
据推测,在磁盘旋转 30 分钟后,它会不断重新运行某种内部自检并进入循环;因为这是在硬件层,所以计算机的其余部分并不知道它的发生,因此我看不到任何特别负责 IO 阻塞的进程,也看不到任何占用资源的进程。
我运行了 SMART 自我测试,试图找出问题所在,但即使这样也无法重置状态 - 必须先关闭然后再打开。
答案2
重启后此问题仍然存在;例如 - 如果我等待 30 分钟以解决速度减慢问题,然后重启,速度减慢问题仍然存在。如果我关机然后重启,问题会在 30 分钟后消失。
这表明SSD本身存在固件错误,该错误在通电30分钟后出现。