web-dev-qa-db-ja.com

Linuxは同時ディスクIOをどのように処理しますか?

Linuxサーバーが多くの異なるファイルを読み取るための多数の同時要求を処理している場合、それは次のようになります。

  1. File_1をシークし、ファイル全体を読み取り、次にFile_2をシークし、ファイル全体を読み取り、次にFile_3をシークします。

  2. File_1にシークし、その一部を(先読み値まで)読み取ってから、File_2にシークし、その一部を読み取ってから、中断した場所のFile_1にシークし、さらに読み、次にFile_3にシークします。等

2番目のケースの場合、サーバーは必要以上に多くのシークを実行しているため、処理速度が大幅に低下します。その場合、私にできるチューニングはありますか?

12
Continuation

ディスクI/Oには、エレベーターと呼ばれるものがあります。ディスクサブシステムは、プラッター全体でディスクヘッドをスラッシングしないようにします。 I/O要求を並べ替えて(バリアなどで禁止されていない場合)、ヘッドがディスクの内側から外側に移動し、戻って、要求されたI/Oを実行します。

2つ目は、I/O要求のマージです。ファイルのさまざまな部分にアクセスする短い時間枠内に多数の要求がある場合、I/Oサブシステムは、いくつかのばらばらの要求を発行する代わりに、一度にすべてのデータを取得しようとします。

チューニングに関する限り。あなたがアプリケーションライターなら、できることはたくさんあります。 fsync()などを使用できる場合はいつでも、大規模な順次I/Oを発行できます。データがプラッター上にあることを確認する必要がある場合。

あなたがシステム管理者であり、2つのアプリのデータ要求が飛躍し、ファイルを順番に読み取ろうとすることを絶対に知っている場合(たとえば、2つのDVDが並行してトランスコードされている場合)、はい、先読みを増やすと役立ちます。それ以外の場合は、チューニングを行う前に、I/Oパターンとサイズを確認し、RAIDレベル(存在する場合)およびその他の要因を考慮する必要があります。チューニングを開始する前に、実際のボトルネックが何であるかを確認してください。システムを実際に制限しているものを推測するのは難しい場合があります。

14
Paweł Brodacki

Linuxでは、独自のスケジューリングアルゴリズムを定義できます。さまざまな可能性があります。学校でそれを実行する必要があり、 this RedHatの記事が大いに役立ちました。これはRed Hat専用ですが、これらのスケジューラーは事実上すべてのLinuxディストリビューションにあります。

5
Lucas Kauffman