调整Linux磁盘caching行为以获得最大的吞吐量

我遇到了最大的吞吐量问题,需要一些build议来调整我的旋钮。 我们正在运行一个10Gb的文件服务器进行备份分发。 这是LSI MegaRAID控制器上的两个磁盘S-ATA2设置。 服务器也有24G的内存。

我们需要以最大吞吐量镜像我们上次上传的备份。

我们“热”备份的RAID0给我们大约260 MB /秒的写入和275 MB /秒的读取。 一个大小为20GB的testingtmpfs给我们大约1GB /秒。 这种吞吐量是我们需要的。

现在,我怎样才能调整Linux的虚拟内存子系统,将最后上传的文件尽可能长时间地caching在内存中,而不需要将其写入磁盘(甚至更好:写入磁盘并将其保存在内存中)?

我设置了下面的sysctl,但是他们不给我们预期的吞吐量:

# VM pressure fixes vm.swappiness = 20 vm.dirty_ratio = 70 vm.dirty_background_ratio = 30 vm.dirty_writeback_centisecs = 60000 

这在理论上应该给我们16GB的cachingI / O,并等待几分钟,直到写入磁盘。 尽pipe如此,当我对服务器进行基准testing时,我发现写入没有影响,吞吐量并没有增加。

需要帮助或build议。

看看你设定的variables,看起来你最关心的是写入性能,而不关心停电造成的可能的数据丢失。

你只会得到懒惰的写入选项和使用asynchronous写入操作的写回caching。 同步写入操作需要提交到磁盘,不会被懒惰写入。 您的文件系统可能会导致频繁的页面刷新和同步写入(通常由于日志logging,特别是在data = journal模式下的ext3)。 此外,即使“后台”页面刷新也会干扰未caching的读取和同步写入 ,从而减慢caching 。

一般来说,你应该采取一些指标来看看发生了什么 – 你看到你的复制过程处于“D”状态,等待I / O工作由pdflush完成吗? 你在磁盘上看到繁重​​的同步写入活动吗?

如果一切都失败了,你可以select设置一个显式的tmpfs文件系统,在这个文件系统中你可以将备份拷贝到磁盘上,并且只需要在磁盘上同步数据,甚至自动使用inotify

对于读取caching,事情要简单得多 – 有fcoretools fadvise实用程序 ,它具有build议内核将文件内容加载到缓冲区caching中的参数。

编辑:

vm.dirty_ratio = 70

这在理论上应该给我们16GB的cachingI / O,并等待几分钟,直到写入磁盘。

这不会对您的testing场景产生很大的影响,但您的理解存在误解。 dirty_ratio参数不是系统总内存的百分比,而是系统空闲内存的百分比。

有一篇关于调优Write-Heavy负载的文章,其中提供了更深入的信息。

或者只是获得更多的磁盘…您拥有的驱动器arraysconfiguration不支持您所需要的。 这种情况下,解决scheme应该重新devise,以满足您的实际需求。 我明白,这只是备份,但它是有道理的,以避免kludgy修复。

使用内存caching可能意味着数据丢失,如果出现问题,内存中的数据将不会保存到磁盘上。

也就是说,在文件系统级别上进行了一些调整。

例如,如果您使用的是ext4,则可以尝试安装选项:

屏障= 0

那就是:“禁止在jbd代码中使用写障碍,写障碍强制执行日志提交的正确的磁盘顺序,使得易失性磁盘写caching安全地使用,在某些性能上会受到损害。如果你的磁盘有一种电池备份方式或者其他的,禁用障碍可以安全地提高性能,安装选项“barrier”和“nobarrier”也可以用来启用或禁用障碍,以便与其他ext4安装选项保持一致。

更多: http : //www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt