2015-09-23 9 views
7

背景読むようになります: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を参照してください。

+1

あなたのブロックサイズは?あなたがアクセスしているディスクにハードウェアキャッシングと先読みの効果が見られている可能性があります。 'pwrite()'はキャッシュをいっぱいにし、次の 'pread()'が別のデータ用のものであれば、キャッシュされません。 'pad()'のあとに 'pread()'を実行すると、ディスクのハードウェアキャッシュから直接データを読み込むことができます。 –

+0

私は物理的なブロックサイズを知らないし、私はプログラムで256KBに設定しました。あなたのコメントをありがとう、今私はそれがディスクのバッファによって引き起こされる可能性が高いと思う。 – Leo

答えて

2

私は直接I/Oを使用しているため、I/Oはファイルシステムのキャッシュメカニズムをバイパスし、ディスク上のブロックに直接アクセスします。

あなたはデバイス上のファイルシステムを持っており、直接読み取り/書き込みにデバイスを使用していない場合は、何のファイル・システム・キャッシュはありませんが、画像に入ってきます。

あなたが観察した動作は、ディスクアクセスとIOの動作の典型です。

は私がPWRITEをしない場合は、読んでスループットがあることがわかった125メガバイト/ sの

理由:ディスクはちょうどそれが戻っオフセットに行く必要はありません、データを読み取り、データの書き込み、1回の操作の削減。

私がpwriteを行うと、読み込みスループットは21 MB/sになり、書き込みスループットは169 MB/sになります。

理由:ディスクの書き込み速度が向上している可能性があります。ディスクバッファは、メディアに直接当たるのではなく、書き込みをキャッシュしている可能性があります。

私がpwriteの後にプレッドすると、書き込みスループットは115 MB/sになり、読み取りスループットは208 MB/sになります。

理由:書き込まれた可能性の高いデータはディスクレベルでキャッシュされているため、読み込みはメディアではなくキャッシュからデータを取得します。

パフォーマンスを最適にするには、一度に非同期IOとブロック数を使用する必要があります。しかし、合理的な数のブロックを使用しなければならず、非常に大きな数を使用することはできません。試行錯誤によって最適なものが見つかるはずです。

+0

あなたの答えをありがとう、今私はそれがディスクのバッファによって引き起こされる可能性が高いと思います。 しかし、私はまだ前のポジションを探していると想像することはできません125 MB /秒から21 MB /秒に読み取りスループットを低下させる... – Leo

+0

@レオ、はい、シークは高価です。スループットが低下した場合に増加するIO待機時間を調べてください。 – Rohan

関連する問題