调整Linux磁盘缓存行为以实现最大吞吐量


12

我在这里遇到了最大吞吐量问题,并且需要一些有关调整旋钮的建议。我们正在运行10Gbit文件服务器进行备份分发。这是LSI MegaRAID控制器上的两个磁盘S-ATA2设置。服务器还获得了24gig的内存。

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

我们的“热”备份的RAID0给我们大约260 MB /秒的写入速度和275 MB /秒的读取速度。经过测试的大小为20GB的tmpfs大约为1GB /秒。我们需要这种吞吐量。

现在,我如何调整Linux的虚拟内存子系统,以将最近上传的文件尽可能长时间地缓存在内存中,而不将它们写到磁盘上(甚至更好:写入磁盘并将它们保存在内存中)?

我设置了以下系统,但它们没有给我们期望的吞吐量:

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

从理论上讲,这应该为我们提供16GB的缓存I / O,并等待几分钟,直到将其写入磁盘。仍然当我对服务器进行基准测试时,我看不到对写入的影响,吞吐量并没有增加。

需要帮助或建议。


尽快开始写作更有意义吗?否则,它将达到最大缓冲区大小,并突然停止。如果一直在写,它会给您更多时间。
Zan Lynx '02

我有20GB的内存用于缓冲区,因为我的应用程序(基本linux + vsftpd)使用的内存不足4GB(总计24GB)。我的备份容量为20GB。如果我可以将它们写到缓冲区中,然后在备份运行后顺序写出到磁盘中,这将大大减少备份源(虚拟服务器)的停机时间。PS:服务器可以随后停止,没问题。它有30分钟的时间来恢复:)
Peter Meyer 2012年

听起来您正在通过网络传输数据的任何应用程序都将其同步到磁盘。您将不希望这样做,因此数据只能位于高速缓存中,尽管我质疑为什么您希望能够以比磁盘可以保持的速度快的速度爆发大量数据。这表明某处存在设计缺陷。
psusi'2

这听起来像是缺陷:您的备份解决方案不应该要求服务器一直关闭。
psusi'2

1
@PeterMeyer:即使您有很多RAM,等待写入开始仍然是一个错误。唯一有意义的时间是,如果要编辑或删除文件(例如临时文件),然后再将其放入磁盘。备份不会这样做。您希望尽快开始后台写入。您background_ratio设置为1或2
咱山猫

Answers:


6

通过查看已设置的变量,您似乎最在意写入性能,而不在乎电源中断可能造成的数据丢失。

您将永远只能选择延迟写入以及通过异步写入操作使用回写缓存。同步写入操作需要提交到磁盘,并且永远不会被延迟写入。您的文件系统可能会导致频繁的页面刷新和同步写入(通常是由于日志记录,尤其是在data = journal模式下使用ext3)。此外,即使“后台”页面刷新也将干扰未缓存的读取和同步写入,从而减慢它们的速度。

通常,您应该采取一些指标来查看正在发生的事情-您是否看到复制过程处于“ D”状态,以等待pdflush完成I / O工作?您是否在磁盘上看到大量同步写入活动?

如果所有其他方法均失败,则您可以选择设置一个显式的tmpfs文件系统,在该系统中将备份复制到该文件系统上,并在事实发生后仅与磁盘同步数据-甚至自动使用inotify

对于读取缓存来说,事情要简单得多-fcoretools fadvise实用程序具有--willneed用于建议内核将文件内容加载到缓冲区缓存中的参数。

编辑:

vm.dirty_ratio = 70

从理论上讲,这应该为我们提供16GB的缓存I / O,并等待几分钟,直到将其写入磁盘。

这不会极大地影响您的测试方案,但是您的理解存在误解。dirty_ratio参数不是系统总内存的百分比,而是系统可用内存的百分比。

有一篇关于调整重载负载的文章,其中包含更深入的信息。


是的,我追求写性能。将备份散发到备份从站所需的时间与我无关。如果主备份服务器发生故障并且备份无法通过备份从属服务器,我还准备了一个用于重传的脚本。PS我已经阅读了链接并进行了相应的调整。很抱歉关于免费vs缓冲vs总计的错误。
彼得·迈耶

3

或者只是获得更多磁盘...您拥有的驱动器阵列配置不支持您所需要的全部。在这种情况下,应重新设计解决方案以满足您的实际需求。我了解这仅是备份,但避免出现混乱修复是有意义的。


同意 几个SATA(认真对待SATA吗?)驱动器无法保持275MB / s的速度,我们甚至都没有在谈论从中获得的糟糕的IOP。
适配器

1
我可以看到他的前进方向-因为这只是数据备份的目的地,所以他不关心因断电而偶尔丢失数据的可能性。他希望通过提供最大可用吞吐量来最小化备份窗口所需的时间-这样一来,可以在30秒内写入20 GB的数据。如果备份由于某种原因而导致停机或服务影响,那么30秒肯定比20分钟更容易。
the-wabbit'2

完全正确。我正在同步虚拟机映像(对于计算节点来说很小),这些映像在同步时关闭。该应用程序的工作方式类似于tar | ssh,但使用ftp。而且,模拟需要运行... :)
Peter Meyer 2012年

1
SATA是什么品种都没关系。7200RPM非企业磁盘根本无法保证吞吐量或延迟。
适配器

1
@adaptr,备份将是顺序写入。
psusi'2

1

使用内存缓存可能意味着数据丢失,就像出了点问题,内存中未保存到磁盘的数据将丢失。

也就是说,需要在文件系统级别进行调整。

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

障碍= 0

那是:“禁止在jbd代码中使用写屏障。写屏障强制在磁盘上对日志提交进行正确的排序,使易失性磁盘写缓存可以安全使用,但会降低性能。如果您的磁盘以某种方式靠电池供电否则,禁用障碍可以安全地提高性能。安装选项“ barrier”和“ nobarrier”也可以用于启用或禁用障碍,以与其他ext4安装选项保持一致。”

更多信息,请访问:http : //www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt


我使用的是经过严格调整的XFS。有关这方面的更多信息,请参见上面的评论:)
Peter Meyer

该文件系统是使用mkfs.xfs -l lazy-count = 1,version = 2,size = 256m -i attr = 2 -d sunit = 512,swidth = 1024创建的,并且安装有:rw,noatime,logbufs = 8, logbsize = 256k,osyncisdsync,delaylog,attr2,nobarrier,allocsize = 256k
Peter Meyer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.