正常运行时间 30 分钟后,对sync/fsync 的调用会变慢

正常运行时间 30 分钟后,对sync/fsync 的调用会变慢

使用 Ubuntu 14.04 运行 30 分钟后混合SSD我看到许多进程使用iotop.这是在磁盘写入期间,例如,如果我在 gedit 中打开并关闭一个空文件,由于 dconf 写入设置,可能需要 2 秒才能关闭,这会以类似的方式影响其他应用程序;严重减慢整个系统的速度。

使用 strace,我设法将其追溯到 fsync 调用,并从那里设法使用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 字节或所以。

重启后此问题依然存在;例如 - 如果我等待 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

显示实际磁盘读取没有受到影响,但缓存读取受到影响,这是否意味着这与系统总线有关,而不是与硬盘有关?

这是我尝试过的解决方案:

  • 更改硬盘的降速设置,硬盘可能会进入省电模式:

    hdparm /dev/sda -S252 #(set it to 5 hours before spindown)
    
  • 将文件系统的日志类型更改为回写而不是排序,以便我们获得性能改进 - 但这并不能解决问题,因为它不能解释 30 分钟无减速的正常运行时间。

  • 禁用 CRON,因为它似乎在 30 分钟后发生。

  • CPU 使用情况很好并且完全空闲,因此不能归咎于任何进程,但是我尝试关闭包括会话管理器(lightdm)在内的每个服务,但这没有任何作用,因为我认为问题级别较低。

  • 分析 30 分钟后进入的任何新进程表明没有变化 - 我比较了 PS 之前和之后的输出,没有任何区别。

这种情况是在大约两周前才开始发生的,当时没有安装任何东西,也没有进行任何更新。我认为这个问题的级别要低得多,所以非常感谢这里的一些帮助,因为我一无所知,甚至为我指明正确的方向也会有所帮助 - 例如,有没有办法检查页面缓存中正在刷新的内容?

在有问题的磁盘上启用了写缓存,我也尝试禁用写屏障。硬盘上的智能数据表明硬盘本身没有问题,但我怀疑硬盘在做一些神秘的事情,因为它在重新启动后仍然存在。

编辑:

我已经搞定了 :

watch -n 1 cat /proc/meminfo

...查看内存如何变化,特别是查看脏行和写回行,我认为这是 HD 磁盘缓冲区。它们大部分都保持为零,最高可能为 300kb。调用sync会按预期将它们刷新回0,但在减速期间,当磁盘缓冲区中有零脏页和零kb时调用sync仍然会锁定IO。如果没有什么可以刷新页面缓存和写入缓存,同步还能做什么?

答案1

这些症状与大部分饱和的 IO 系统非常一致,但是在很大程度上排除了来自操作系统/用户空间端的 IO 负载,另一种可能性是驱动器在自身上运行自检,其中可能包括从所有扇区读取。这应该可以从 smartctl 查询/调整(至少有一个地方是 smartctl -c 用于查询)。

至于为什么现在来来去去又突然开始:

  • 驱动器已过了其生命周期的某个阶段(写入的扇区数、旋转时间等),并且驱动器上的固件已触发其中一项扫描
  • 我相信这也可以通过 smartctl 触发,因此可能是某些自动化过程触发了它
  • 触发其中一个扫描并将其标记为正在进行或已开始,当驱动器开启一段时间后,它会从头开始重新触发或从中断处恢复

相关内容