2011-02-22 78 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並沒有太大的改變,我沒有成功之前就已經嘗試了不同的調度程序。 –