![请澄清慢速磁盘技巧](https://linux22.com/image/9636/%E8%AF%B7%E6%BE%84%E6%B8%85%E6%85%A2%E9%80%9F%E7%A3%81%E7%9B%98%E6%8A%80%E5%B7%A7.png)
我遇到的问题是,我的各种磁盘的传输速率从大约 25 MB/s 减慢到大约 0.3 MB/s。有时重新启动会起作用,但不一定能持续很长时间。我用 Ubuntu Mate 做了这个,用 Xubuntu 替换了它,但没有运气。
所以再次随机搜索,我找到了这条线索Linux 中 I/O 性能出现大规模且不可预测的下降
那里的作者说
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
为他工作。我尝试了一下并且有效。 U盘几乎立刻就停止了摩擦声,恢复了正常速度。
但坦率地说,我完全不知道我在这里做什么。什么是/proc/sys/vm/drop_caches
? echo 后这个文件还是空的?为什么这样做有效?这样做有什么问题吗?是否表明硬件有问题?
附录 1:我通过调用运行同步的脚本和运行备份作业的根 crontab 中的 echo 来实现这一点。主要备份作业于凌晨 3:30 开始,我在其之前以及凌晨 4 点和 5 点调用该脚本。备份似乎只是在凌晨 4 点脚本之后才开始加快速度,因此实现这一点并不那么简单。但是我能现在再次合理地运行过夜系统备份。
附录 2:也许我还应该指出,在 IIRC 将 30 GB 左右的文件结构从 Internet 复制到内部系统硬盘 / 时,我曾看到 0.3 MB/s 的传输速率。因此,对我而言,问题并不明显在于速度较慢的 USB 硬盘(在我看来,USB 硬盘并不是特别慢,当系统正常工作时,例如写入 /proc/sys 后,速度为 30 Mb/s 或更高) /vm/dropped_caches。)
附录 3:将 vm.dirty_background_ratio、vm.dirty_ratio、vm.dirty_expire_centisecs 和 vm.dirty_writeback_centisecs 更改为我的 OK 笔记本电脑上的值并没有产生任何影响。
附录 4:显然这是一个已知的错误, https://bugs.launchpad.net/ubuntu/+source/linux-meta-lts-trusty/+bug/1333294 那里有一个有用的链接http://flaterco.com/kb/PAE_slowdown.html。在 /etc/default/grub 中设置 GRUB_CMDLINE_LINUX="mem=8192M"、运行 update-grub 并重新启动似乎已将磁盘写入恢复到合理的速度,而无需使用 drop_caches。 (损失 8GB 内存。)
答案1
听起来你正在经历这里描述了什么:
大量 I/O 也有可能淹没缓存。您是否曾经一次性将大量数据写入磁盘,并在尝试处理所有数据时看到系统出现大幅暂停?这些暂停是由于缓存认为有太多数据需要异步写入(作为非阻塞后台操作,让应用程序进程继续),并切换到同步写入(阻塞并使进程等待直到 I/ O 已提交到磁盘)
这个也有讨论在这篇 LWN 文章中。基本上,您的慢速 USB 驱动器可以处理持续的小写入,但是当您的备份作业运行时,它会填充虚拟机缓存,现在您会在一段时间内获得缓慢的同步写入。 “echo 3 > /proc/sys/vm/drop_caches”从这些缓存中删除干净的对象,允许 I/O 使用缓存,从而提高性能。
正如链接中建议的那样,尝试更改“vm.dirty_*”的值。例如,vm.dirty_background_ratio 和vm.dirty_ratio。
答案2
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
写入此内容将导致内核删除干净的缓存,以及可回收的平板对象,例如目录和索引节点。一旦掉落,他们的记忆就变得自由了。
释放slab对象和页面缓存:
echo 3 > /proc/sys/vm/drop_caches
“干净的缓存”是与光盘上的缓存相同的缓存,因此您可以简单地删除它并稍后从磁盘上重新读取它。
页缓存是从磁盘读取的内存页的缓存:https://en.wikipedia.org/wiki/Page_cache
Slab 是一块连续的内存:https://en.wikipedia.org/wiki/Slab_allocation