2011-02-22 79 views
1

我在Linux服务器(内核2.6.37,16核心,32G内存)上的2个文件系统之间复制大文件(3 x 30G),而且性能下降。我怀疑缓冲区缓存的使用是否会影响I/O性能。Linux缓冲区缓存对IO写入的影响?

我写了一个小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 

是否有任何内核的调音,可以固定/最小化的问题呢?

+0

欢迎来到SO,这个社区是编程相关问题的意思。虽然我觉得这个问题很有趣,但我建议将它移到serverfault.com。 – joshperry

+0

我也投票选择“两全其美”。如果他们得到答案,问题会很快得到解答。如果在问题被移动的时候你还没有答案,你会在serverfault上得到第二个机会。谢谢, –

+0

谢谢,我会在那里发表我的问题。 –

回答

1

即使缓冲大量数据,缓冲区缓存也非常有效。

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

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

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

如果你是磁盘受限的,你可能想研究设备级别的I/O看起来是什么样子(使用blktrace?),看看你能否确定产生的I/O模式是否在设备级别。另外,你可能要考虑使用诸如fio之类的东西来运行你的测试,而不是发明你自己的基准测试程序 - 其他人可以更容易地重现你的结果并相信你的程序没有错。

+0

继其他人的意见,我发布了问题在serverfault这里:http:///serverfault.com/questions/238879/linux-buffer-cache-effect-on-io-writes。 fio的输出包含在那里。 –

+0

减少/ sys/block/sd */queue/max_sectors_kb有帮助吗?不同的调度程序如何?(/ sys/block/sd */queue/scheduler) –

+0

更改max_sectors_kb并没有太大的改变,我没有成功之前就已经尝试了不同的调度程序。 –