背景読むようになります:CディスクI/Oは - 後のファイルのオフセットと同じで、読み取り、書き込みのスループットが非常に低い
は、私はデータベース関連のプログラムを開発している、と私はから汚れたメタデータをフラッシュする必要がメモリをディスクに順次書き込みます。 /dev/sda1はvolumn形式であるため、/ dev/sda1のデータはブロック単位でアクセスされ、ブロックは物理的に隣接してアクセスされます。 私は直接I/Oを使用しているため、I/Oはファイルシステムのキャッシュ機構をバイパスし、ディスク上のブロックに直接アクセスします。
問題:開口部は/ dev/sda1をした後
は、私は、一つのブロックを読んでブロックを更新し、反復的には、/ dev/sda1にの先頭からのオフセットと同じに戻ってブロックを記述します。
//block_size = 256KB
int file = open("/dev/sda1", O_RDWR|O_LARGEFILE|O_DIRECT);
for(int i=0; i<N; i++) {
pread(file, buffer, block_size, i*block_size);
// Update the buffer
pwrite(file, buffer, block_size, i*block_size);
}
は私がPWRITEをしない場合、スループットは125メガバイト/秒で読み取ることが判明 -
コードは以下のようです。
私はPWRITEを行う場合
は、スループットが 21メガバイト/ sのになり、スループットが 169メガバイト/ sので書きます読んで。私はPWRITE後PREADを行う場合、スループットは115メガバイト/ sので書き、そして読みスループットが208メガバイト/ sのです。
私はread()/ write()とaio_read()/ aio_write()も試しましたが、問題は残ります。私はなぜファイルの同じ位置で読み込み後に書き込むと、読み込みスループットが低くなるのか分かりません。
問題が軽減されます。この
pread(file, buffer, num_blocks * block_size, i*block_size);
のように、一度に複数のブロックにアクセスする場合は、chartを参照してください。
あなたのブロックサイズは?あなたがアクセスしているディスクにハードウェアキャッシングと先読みの効果が見られている可能性があります。 'pwrite()'はキャッシュをいっぱいにし、次の 'pread()'が別のデータ用のものであれば、キャッシュされません。 'pad()'のあとに 'pread()'を実行すると、ディスクのハードウェアキャッシュから直接データを読み込むことができます。 –
私は物理的なブロックサイズを知らないし、私はプログラムで256KBに設定しました。あなたのコメントをありがとう、今私はそれがディスクのバッファによって引き起こされる可能性が高いと思う。 – Leo