2011-02-22 6 views
1

Linuxサーバー(カーネル2.6.37,16コア、32G RAM)上の2つのファイルシステムの間に大きなファイル(3 x 30G)をコピーしていますが、パフォーマンスが低下しています。私は、バッファキャッシュの使用がI/Oパフォーマンスを殺していると思われます。IO上のLinuxバッファキャッシュエフェクトは書き込みますか?

問題を再現するための小さなCプログラムを作成しました。このプログラムは、0Gバイトの20Gを直接SASディスク(/ dev/sda、ファイルシステムなし)に書き込みます。また、O_DIRECTフラグもサポートしています。

私はO_DIRECTでプログラムを実行すると非常に安定し、予測可能なパフォーマンスを得る:私は最初のthroughtputがあるため高であることを理解し

/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なし

/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の場合よりも50%少なくなるとは思っていません。

私もDDとのテストは、私が手に入れた同様の結果(私はここにかかわらず、代わりに20Gの10Gを使用):

$ 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で2度目のチャンスが得られます。 –

+0

THanks、代わりに質問を投稿します。 –

答えて

1

バッファキャッシュは、膨大な量のデータをバッファする場合でも非常に効率的です。

エンタープライズSSDでddテストを実行すると、バッファキャッシュを介して1GBpsの32KB書き込みを簡単に実行できます。

あなたの結果は面白いですが、私はあなたの問題が "バッファーキャッシュが遅すぎる"とは思わないと思います。

私の最初の質問は次のようなものです:CPUが限られているかディスク制限されているために遅いですか?テスト中に1つの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の変更はあまり変わっていません。 –

関連する問題