我们需要以最大吞吐量镜像上次上传的备份.
我们的“热”备份的RAID0为我们提供了大约260 MB /秒的写入速度和275 MB /秒的读取速度.经过测试的大小为20GB的tmpfs给我们大约1GB /秒.这种吞吐量是我们所需要的.
现在,我如何调整Linux的虚拟内存子系统,以便在内存中尽可能长时间地缓存上次上传的文件,而无需将其写入磁盘(甚至更好:写入磁盘并将其保留在内存中)?
我设置了以下sysctls,但它们没有给我们预期的吞吐量:
# VM pressure fixes vm.swappiness = 20 vm.dirty_ratio = 70 vm.dirty_background_ratio = 30 vm.dirty_writeback_centisecs = 60000
理论上,这应该为我们提供16GB的缓存I / O并等待几分钟,直到它写入磁盘.当我对服务器进行基准测试时,我发现写入没有任何影响,吞吐量也没有增加.
需要帮助或建议.
解决方法
您将只获得延迟写入的选项以及使用异步写入操作的写回缓存.同步写操作需要提交到磁盘,并且不会延迟写入.您的文件系统可能导致频繁的页面刷新和同步写入(通常是由于日志记录,尤其是在data = journal模式下的ext3).此外,即使是“background” page flushes will interfere with uncached reads and synchronous writes,也会减慢它们的速度.
一般来说,你应该采取一些指标来看看发生了什么 – 你是否看到你的复制过程处于“D”状态,等待pdflush完成I / O工作?您是否在磁盘上看到了大量的同步写入活动?
如果所有其他方法都失败了,您可以选择设置一个显式的tmpfs文件系统,您可以将备份复制到其中,然后在事后与磁盘同步数据 – 甚至是automatically using inotify
对于读缓存,事情要简单得多 – 有fcoretools fadvise
utility,它有–willneed参数,建议内核将文件的内容加载到缓冲区缓存中.
编辑:
vm.dirty_ratio = 70
This should in theory give us 16GB for caching I/O and wait some
minutes until its writing to disk.
这不会对您的测试场景产生很大影响,但您的理解存在误解. dirty_ratio参数不是系统总内存的百分比,而是系统的可用内存的百分比.
有一篇关于Tuning for Write-Heavy loads的文章,有更深入的信息.