![调整 Linux 磁盘缓存行为以实现最大吞吐量](https://linux22.com/image/575747/%E8%B0%83%E6%95%B4%20Linux%20%E7%A3%81%E7%9B%98%E7%BC%93%E5%AD%98%E8%A1%8C%E4%B8%BA%E4%BB%A5%E5%AE%9E%E7%8E%B0%E6%9C%80%E5%A4%A7%E5%90%9E%E5%90%90%E9%87%8F.png)
我在这里遇到了最大吞吐量问题,需要一些关于如何调整旋钮的建议。我们正在运行一个 10Gbit 文件服务器进行备份分发。它是 LSI MegaRAID 控制器上的双磁盘 S-ATA2 设置。该服务器还配备了 24GB 内存。
我们需要以最大吞吐量镜像我们上次上传的备份。
我们的“热”备份的 RAID0 提供了大约 260 MB/秒的写入速度和 275 MB/秒的读取速度。经过测试的 20GB 大小的 tmpfs 提供了大约 1GB/秒的速度。这种吞吐量正是我们所需要的。
现在我该如何调整 Linux 的虚拟内存子系统,以便尽可能长时间地将最后上传的文件缓存在内存中,而不将它们写入磁盘(或者更好的是:写入磁盘并将它们保存在内存中)?
我设置了以下 sysctl,但它们并没有给我们提供我们期望的吞吐量:
# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000
这应该理论上,给我们 16GB 的缓存 I/O,然后等待几分钟,直到写入磁盘。当我对服务器进行基准测试时,我仍未看到写入效果,吞吐量没有增加。
需要帮助或建议。
答案1
通过查看您设置的变量,似乎您主要关心写入性能,而不关心由于断电而可能造成的数据丢失。
您只能选择延迟写入和使用异步写入操作的写回缓存。同步写入操作需要提交到磁盘,并且永远不会延迟写入。您的文件系统可能会导致频繁的页面刷新和同步写入(通常是由于日志记录,尤其是使用数据=日志模式的 ext3)。此外,即使“后台”页面刷新将干扰未缓存的读取和同步写入,从而减慢了它们的速度。
一般来说,您应该采取一些指标来查看发生了什么 - 您是否看到复制过程处于“D”状态,等待 pdflush 完成 I/O 工作?您是否看到磁盘上有大量同步写入活动?
如果其他方法都失败了,您可以选择设置一个显式的 tmpfs 文件系统,将备份复制到其中,并在事后将数据与磁盘同步 - 即使自动使用 inotify
对于读取缓存来说,事情要简单得多——有 fcoretoolsfadvise
公用事业它具有--willneed
建议内核将文件内容加载到缓冲区缓存中的参数。
编辑:
vm.dirty_ratio = 70
理论上,这应该为我们提供 16GB 的缓存 I/O,并等待几分钟直到其写入磁盘。
这不会对您的测试场景产生很大影响,但您的理解存在误解。 dirty_ratio 参数不是系统总内存的百分比,而是系统自由的记忆。
有一篇文章调整写入密集型负载提供更深入的信息。
答案2
或者只是获得更多磁盘...您拥有的驱动器阵列配置不支持您所需的吞吐量。在这种情况下,解决方案应该重新设计以满足您的实际需求。我明白这只是备份,但避免笨拙的修复是有意义的。
答案3
使用内存缓存可能意味着数据丢失,因为如果出现问题,位于内存中而未保存到磁盘的数据将会丢失。
也就是说,需要在文件系统级别进行调整。
例如,如果您使用的是 ext4,则可以尝试 mount 选项:
屏障=0
即:“禁用 jbd 代码中的写入屏障。写入屏障强制日志提交在磁盘上的正确排序,使易失性磁盘写入缓存可以安全使用,但性能会有所下降。如果您的磁盘以某种方式由电池供电,则禁用屏障可能会安全地提高性能。挂载选项“barrier”和“nobarrier”也可用于启用或禁用屏障,以与其他 ext4 挂载选项保持一致。”
更多内容请见:http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt