Linux缓冲区缓存对IO写入的影响?

时间:2011-02-22 19:24:26

标签: linux caching file-io linux-kernel

我在Linux服务器(内核2.6.37,16内核,32G内存)上的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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我的第一个问题是:它是否因为CPU限制或磁盘限制而变慢?检查在测试过程中是否有一个CPU核心固定为100% - 这可能表明驱动程序或块级别出现了问题,例如I / O电梯行为不端。如果你找到一个核心挂钩运行一些配置文件,看看核心是什么。

如果您受磁盘限制,您可能需要调查设备级别的I / O外观(使用blktrace?)并查看是否可以确定生成的I / O模式是否会导致性能不佳设备级别。

此外,您可能需要考虑使用类似fio的内容来运行测试,而不是发明自己的基准测试程序 - 其他人更容易重现您的结果并相信您的程序不是在错。