web-dev-qa-db-ja.com

SSDの大量の書き込みアクティビティがシステムパフォーマンスを低下させる

重い書き込みアプリケーションを実行すると、システム全体の速度が低下することに気づきました。これをさらにテストするために、これを実行して(比較的)低CPU、高ディスクアクティビティを実行しました。

john -incremental > file_on_SSD

これにより、毎秒数万の文字列がシステムディスク上のファイルに送り出されます。

これを行うと、マウスが遅れ、TTYが応答しなくなり、アプリケーションが「フェード」し、通常、コンピューター全体が使用できなくなります。最終的にControl + C johnができるようになると、システムは数秒後に完全な状態に戻ります。

これは極端な例ですが、高速ソースからの大きなファイルのコピーやトランスコーディングなど、書き込みの少ないアクティビティで同様の問題が発生します。

私のメインOSディスクは、EXT4を搭載した非常に高速なSSD(OCZ Agility 60GB)です。 johnの出力をEXT4を使用してメカニカルディスクに書き込むと、速度は大幅に低下しますが、同じ速度低下は発生しません(SSDは毎秒約42,000ワード、メカニカルは8,000 w/sを実行します) 。スループットが関係している可能性があります。メカニカルディスクもシステムとは何の関係もありません。それは単なるデータです。

カーネル2.6.35-2を使用していますが、おそらくその頃から.31か何かを使用していたときに、このSSDを入手してから、この問題に気づきました。

では、速度低下の原因は何ですか?EXT4の問題?カーネルの問題?SSDの問題?上記のすべて?他の何か?

追加のテストを実行する必要があると思われる場合は、何をすべきかを示すコメントをドロップするだけで、結果を質問に追加します。

13
Oli

これはしばらくの間既知の問題でした。 BtrfsのようにSSDで調整されたFS)を使用すると役立つ場合がありますが、そうでない場合もあります。

最終的には、IOスケジューラ/メモリ管理システムのバグです。最近、この問題に対処することを目的としたパッチがいくつかあります。 修正済み:Linuxデスクトップの応答性の問題)を参照してください。 ?

これらのパッチは最終的にメインラインカーネルに組み込まれる可能性がありますが、この問題を修正するには、今のところ、独自のカーネルをコンパイルする必要があります。

12
Zifre

LinuxでSSDのパフォーマンスを向上させるために確認できることがいくつかあります。

  1. マウントポイントを「noatime」に設定します。アクセス時間を更新する余分なアクティビティは、通常、ほとんどのユースケースで無駄になります。特に、ファイルに1行を継続的に送り込む場合は、アクセスごとにファイルシステムに複数の更新を強制します。

  2. エレベーターを確認してください。ほとんどのディストリビューションのデフォルトのエレベーターは、ランダムアクセスの回転するプラッター用に設定されています。 SSDは追加のロジックを必要としないため、エレベータをnoopに設定すると、ハードウェアに書き込みを管理させることでパフォーマンスを向上させることができます。

  3. ライトスルーvライトバックキャッシング。これはもう少し難解ですが、デバイスのhdparmで使用されるキャッシュ方法を確認できます。ライトバックキャッシングは、ライトスルーと比較してSSDのパフォーマンスにプラスの影響を与える可能性があります。

1
nzwulfin

ファイルキャッシュは、ワークロードに合わせて正しく調整されていない可能性があります。残念ながら、Linuxカーネルはこれを自動的に処理しないほど愚かであり、RAMがたくさんあり、ブロックデバイスが十分に遅い場合、デフォルトはかなり悪いです。 https:// lonesysadmin。詳細については、net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio / を参照してください。

/etc/sysctl.confのいずれかを変更してみることをお勧めします

vm.dirty_background_ratio = 3
vm.dirty_ratio = 6

カーネルが他のタスクをより適切に処理できるようにするために、書き込みキャッシュによって引き起こされるRAMプレッシャーを大幅に削減します。これにより、レイテンシーの改善とスループットの低下が犠牲になります。

もう1つの可能性は、キャッシュを増やすことですが、プロセスが常に新しいデータを書き込み続けると、キャッシュがいっぱいになると非常に悪いレイテンシーになります。あなたがそれを試してみたいなら、あなたは次のようなことをすることができます

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

*_ratio設定は、使用可能なRAMのパーセンテージを参照することに注意してください。より適切に制御したい場合は、*_bytes設定を使用してください。私は個人的にワークステーションに次の設定を使用しています。

vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000

これにより、バックグラウンド書き込みキャッシュが50 MBに制限され、200 MBがキャッシュにある場合は、同期書き込みが強制されます。

0