15

巨大なファイル ツリーをある場所から別の場所にコピーし始めたり、他のプロセスが大量のディスク アクティビティを開始したりすると、フォアグラウンド アプリ (GUI) の速度が大幅に低下します。たとえば、100k ファイルを含む 2GB のファイル ツリーを考えてみましょう。コンソールを開き、cp -r bigtree bigtree2 を実行します。次に、firefox に移動してブラウジングを開始します。Firefoxはほとんど使えません。Firefox のナイス レベルを非常に高い優先度 (-20) に設定しても、非常に遅く、大きな遅延が発生します。

数年前、Solaris ボックスで作業していたときのことを覚えていますが、システムは同様の状況ではるかに優れた動作をしました。

私の HD は PIO ではなく DMA を使用しています。SATAです。atime フラグではマウントされません。

4

4 に答える 4

18

Linux は長い間、システムのすべての「汚れた」キャッシュ メモリを占有するプログラムに問題を抱えていました。何が起こっているかというと、コピー プロセスが、コピーしているファイル データで書き込みキャッシュをいっぱいにし、それを非常に高速に実行しているということです。そのため、Firefox が登場して書き込みが必要になると、最初にダーティ バッファ スペースまたはディスク キューの書き込みスロットが使用可能になるまで待機する必要があります。待機中は、コピー プロセスおよびカーネルの pdflush スレッドと競合し、ダーティ バッファからディスク書き込みキューにデータを移動します。

このシナリオでは、Firefox にはさらに別の問題があります。SQLite を使用してブックマーク、履歴などを保存します。SQLite は ACID 準拠のデータベースであり、ディスク書き込みがディスクにフラッシュされるトランザクション システムを使用します。そのため、バッファ スペースを待つ必要があるだけでなく、コピーされたファイルでいっぱいになっているディスク キューがクリアされるのを待ってから、書き込みの成功を確認する必要があります。

Linux のディスク キューイングおよびバッファリング システムに対して、多くの調整が行われました。ほぼすべてのカーネル リリースで変更があります。新しいリリースのいずれかを試してください。sysctl 値を微調整することもできます。私はこれらが好きです:

vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 9000
vm.dirty_background_ratio = 4
vm.dirty_ratio = 80

ディスク キューのスロット数を調整することもできます。この値は にあり/sys/block/sda/queue/nr_requestsます。sdaドライブが実際に何であれ、置き換える必要があります。スロットが多いということは、IO 要求をマージする機会が増えることを意味し、CFQ IO スケジューラは優先度をより適切に処理できます。通常、スロットが少ないということは、SQLite のトランザクションのような同期 IO でディスクに書き込まれるまでの待ち時間が短くなることを意味します。スロットが少ないということは、書き込み負荷の高いプロセスが書き込み IO でキューを完全に埋め尽くした場合に、読み取り IO をディスク キューに入れるまでの待ち時間が短くなることも意味します。

于 2008-12-25T00:38:55.903 に答える
7

コピープロセスをioniceまたはniceで試してみてください。この問題は、IO が GUI と同じ優先度を取得するという事実によるもので、デスクトップの場合、認識される応答性に影響します。

現在、これについてUbuntu のブレインストーミングがあります。

于 2008-12-24T20:50:28.640 に答える
3

この問題に気付いたのはあなたが初めてではありません。元カーネル開発者 [Con Kolivas] ( http://en.wikipedia.org/wiki/Con_Kolivas ) は、多くの企業がLinux サーバーのパフォーマンスを向上させるために、デスクトップのパフォーマンスを犠牲にしてお金を払っていることを発見しました。Con には、デスクトップの応答性を高めるための印象的な一連のパッチがありました。残念ながら、ある種のコード戦争があり、最終的にCon は脱落しました

デスクトップのパフォーマンスを向上させるために Linux カーネル開発者に請願する方法を知りたいです。それまでの間、カーネル 2.6.22 を実行したい場合は、-ckパッチ セットで実行できます。

于 2008-12-25T01:33:13.280 に答える
0

DMAをサポートするすべてのドライブでDMAが有効になっていることを確認してください。ディストリビューションによっては、これがデフォルトではない場合があります。を読んman hdparmで、システムinitメカニズムを調べてください。

于 2008-12-25T21:24:11.817 に答える