这种减速的根本原因可以追溯到Unix系统调用同步.
重复从终端运行同步可能需要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磁盘缓冲区?)都为零时.我的想法是调用同步刷新这些磁盘缓存但它仍然冻结,即使这些缓存中没有任何东西,所以它还做了别的什么?
重新启动后此问题仍然存在;例如 – 如果我等待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的spindown设置(可能是HD进入省电模式?):
hdparm /dev/sda -S252 #(set it to 5 hours before spindown)
>将文件系统的日志记录类型更改为回写而不是订购,以便我们获得性能改进 – 这不能解决问题,因为它没有解释30分钟无法减速的正常运行时间,当我尝试这个没有变化时.
>禁用CRON,因为它似乎在30分钟后出现.
> cpu使用率很好,并且完全空闲,所以没有任何进程可以归咎于我,但是我已经尝试关闭包括会话管理器(lightdm)在内的每个服务,这没有任何作用,因为我认为问题是较低级别.
>分析在30分钟进入的任何新进程表明没有变化 – 我已经在前后差分输出PS,并且没有区别.
这仅在大约2周前开始发生,没有安装任何内容,并且在此期间没有进行任何更新.我认为这个问题的水平要低得多,所以我真的很感激一些帮助,因为我很无能为力,即使把我指向正确的方向也会有所帮助.
在相关磁盘上启用了写入缓存,我也尝试禁用写入障碍. HD上的SMART数据表明HD本身没有任何问题,但是我怀疑这是HD在重新启动后仍然存在的神秘感.