【问题标题】:Linux buffer cache effect on IO writes?Linux缓冲区缓存对IO写入的影响?
【发布时间】:2011-07-02 06:09:28
【问题描述】:

我在 Linux 服务器(内核 2.6.37、16 核、32G RAM)上的 2 个文件系统之间复制大文件 (3 x 30G),但性能很差。我怀疑缓冲区缓存的使用正在扼杀 I/O 性能。

我编写了一个小 C 程序来复制这个问题。该程序将 20G 的零字节直接写入 SAS 磁盘(/dev/sda,无文件系统)。它还支持 O_DIRECT 标志。

当我使用 O_DIRECT 运行程序时,可以获得非常稳定且可预测的性能:

/dev/sda:   100M current_rate=195.569950M/s avg_rate=195.569950M/s  
/dev/sda:   200M current_rate=197.063362M/s avg_rate=196.313815M/s  
/dev/sda:   300M current_rate=200.479145M/s avg_rate=197.682893M/s  
/dev/sda:   400M current_rate=210.400076M/s avg_rate=200.715853M/s  
...  
/dev/sda: 20100M current_rate=206.102701M/s avg_rate=201.217154M/s  
/dev/sda: 20200M current_rate=206.485716M/s avg_rate=201.242573M/s  
/dev/sda: 20300M current_rate=197.683935M/s avg_rate=201.224729M/s  
/dev/sda: 20400M current_rate=200.772976M/s avg_rate=201.222510M/s  

没有 O_DIRECT 是另一回事:

/dev/sda:   100M current_rate=1323.171377M/s avg_rate=1323.171377M/s  
/dev/sda:   200M current_rate=1348.181303M/s avg_rate=1335.559265M/s  
/dev/sda:   300M current_rate=1351.223533M/s avg_rate=1340.740178M/s  
/dev/sda:   400M current_rate=1349.564091M/s avg_rate=1342.935321M/s  
...  
/dev/sda: 20100M current_rate=67.203804M/s avg_rate=90.685743M/s  
/dev/sda: 20200M current_rate=68.259013M/s avg_rate=90.538482M/s  
/dev/sda: 20300M current_rate=64.882401M/s avg_rate=90.362464M/s  
/dev/sda: 20400M current_rate=65.412577M/s avg_rate=90.193827M/s  

我知道最初的吞吐量很高,因为该数据被缓存并稍后提交到磁盘。不过,我预计使用缓冲区缓存的整体性能不会比使用 O_DIRECT 时低 50%。

我也用 dd 做了测试,我得到了类似的结果(我在这里使用 10G 而不是 20G):

$ dd if=/dev/zero of=/dev/sdb bs=32K count=327680 oflag=direct
327680+0 records in
327680+0 records out
10737418240 bytes (11 GB) copied, 54.0547 s, 199 MB/s

$ dd if=/dev/zero of=/dev/sdb bs=32K count=327680             
327680+0 records in
327680+0 records out
10737418240 bytes (11 GB) copied, 116.993 s, 91.8 MB/s

是否有任何内核调整可以修复/最小化问题?

【问题讨论】:

  • 欢迎来到 SO,这个社区很适合编程相关的问题。虽然我觉得这个问题很有趣,但我还是建议将其移至 serverfault.com。
  • 我也以“两全其美”的方式投票决定搬家。如果他们得到回答,这里的问题会很快得到回答。如果在移动问题时您没有答案,您将获得第二次服务器故障机会。
  • 谢谢,我会在那里发布我的问题。
  • serverfault的问题在这里:serverfault.com/questions/238879/…

标签: linux caching file-io linux-kernel


【解决方案1】:

缓冲区缓存非常有效,即使在缓冲大量数据时也是如此。

在企业级 SSD 上运行 dd 测试,我可以轻松地通过缓冲区缓存执行超过 1GBps 的 32KB 写入。

我觉得你的结果很有趣,但我不认为你的问题是“缓冲区缓存太慢”。

我的第一个问题是:速度慢是因为 CPU 受限还是磁盘受限?检查您是否有一个 CPU 内核在测试期间固定为 100%——这可能表明驱动程序或块级别存在问题,例如 I/O 电梯行为异常。如果您发现某个核心被固定,请运行一些配置文件以查看该核心在做什么。

如果您的磁盘受限,您可能需要调查设备级别的 I/O(使用 blktrace 吗?),看看您是否可以确定生成的 I/O 模式是否在设备级别。

另外,您可能需要考虑使用类似 fio 的东西来运行您的测试,而不是发明自己的基准测试程序 - 其他人会更容易重现您的结果并相信您的程序没有错误.

【讨论】:

  • 按照其他人的建议,我在 serverfault 上发布了这个问题:serverfault.com/questions/238879/…。 fio 输出包含在其中。
  • 减少 /sys/block/sd*/queue/max_sectors_kb 有帮助吗?不同的调度器怎么样? ( /sys/block/sd*/queue/scheduler )
  • 更改 max_sectors_kb 并没有太大变化,在没有成功之前我已经尝试了不同的调度程序。
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多