调用sync / fsync会在30分钟的正常运行时间后减慢IO

使用Ubuntu 14.04和ext4 混合SSD 30分钟的正常运行时间后,我看到很多使用iotop阻止IO的进程。

这种放缓的根本原因已经追溯到Unix系统调用sync

从terminal重复运行sync可能需要1 – 2秒的时间,但只能在正常运行30分钟后进行。

为了certificate这一点,我制作了一个脚本,可以在几秒钟内输出正常运行所需的时间,然后每秒钟运行一次:

 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分钟)。

除了脚本以外,现在除了脚本以外,什么都不应该写入磁盘,因此在第一次同步之后,页面caching中应该几乎没有任何内容,随后的每个同步将写入正在写入脚本的内容,大致为100个字节,所以。

当我检查cat /proc/meminfo脏行(页caching中的数据需要保存到磁盘?)和回写行(HD磁盘缓冲区?)都为零。 我的想法是调用sync刷新这些磁盘caching,但即使这些caching中没有任何内容,它仍然冻结,所以它做了别的什么?

重新启动后,此问题仍然存在; 例如 – 如果我等待30分钟,然后重新启动,减速将仍然在那里。 如果我关机然后重新启动问题消失,直到30分钟后。

另一个好奇心是,当我检查上面的图表,放大发生放缓的地区时,我得到了这个:

减速图放大

波峰和波谷重复 – 每隔10秒从波谷到波谷发生。

在减速之前,我也运行了hdparmtesting( hdparm -t /dev/sdahdparm -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 

显示实际的磁盘读取没有受到影响,但caching的读取是,这是否意味着这是关系到系统总线而不是HD呢?

以下是我尝试的解决scheme:

  • 改变高清的旋转设置(也许HD进入省电模式?):

     hdparm /dev/sda -S252 #(set it to 5 hours before spindown) 
  • 文件系统的日志types改为回写,而不是命令,以便获得性能改进 – 这并不能解决问题,因为它不能解释30分钟的减速时间,当我尝试这个时没有任何变化。

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

  • CPU使用情况良好,是完全闲置,所以没有任何过程可以责怪,但我已经尝试closures包括会话pipe理器(lightdm)在内的每一项服务,这没有做什么,因为我相信这个问题是较低的水平。

  • 分析在30分钟内进入的任何新进程表明没有变化 – 我前后PS的输出差异并没有什么区别。

这只发生在大约2个星期前,没有安装任何东西,在那个时候没有更新。 我认为这个问题要低得多,所以在这里真的很感谢一些帮助,因为我毫无头绪,甚至指着我在正确的方向将是有益的。

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

这是由于正在讨论的驱动器启用SMART数据所致。

禁用SMART数据解决了这个问题:

 sudo smartctl --smart=off /dev/sda 

有趣的是,为驱动器重新启用SMART数据不会使问题返回,这表明SMART处于不一致的状态(在自检运行时可能发生崩溃?),然后将其closures,然后再重置该状态。

据推测,磁盘旋转30分钟后,它不断重新进行某种内部自检, 因为这是在硬件层,其余的计算机没有意识到它正在进行,因此我可以看到没有进程特别是负责IO阻塞和没有过程占用资源。

我会运行SMART自检,同时试图弄清楚什么是错误的,但即使这样也没有重置状态 – 必须closures,然后明确。

重新启动后,此问题仍然存在; 例如 – 如果我等待30分钟,然后重新启动,减速将仍然在那里。 如果我关机然后重新启动问题消失,直到30分钟后。

这表示在SSD上电30分钟后出现固件错误。