書き込み操作の多いアプリケーションを実行すると、システム全体の速度が遅くなることがわかりました。これをさらにテストするために(相対的に)低CPU、高ディスクアクティビティを実行するために、以下を実行しました。
john -incremental > file_on_SSD
これにより、システムディスク上のファイルに毎秒数万文字の文字列が出力されます。
これにより、マウスが遅くなり、TTYが応答しなくなり、アプリケーションが「消えて」、通常はコンピュータ全体を使用できなくなります。最後にControl + Cを押すことができたらjohn
、数秒後にシステムが最大電力に戻りました。
これは極端な例ですが、高速ソースから大容量ファイルをコピーまたはトランスコードするなど、書き込みが集中していないアクティビティでも同様の問題に直面しました。
私のデフォルトのOSディスクはかなり高速なSSDです(OCZアジャイル60GB) EXT4を使用します。 EXT4を使用して機械式ディスクに出力を書き込むと、john
速度がはるかに遅くても同じ速度低下は発生しません(SSDの場合は毎秒最大42,000語、機械式の場合は毎秒8,000語)。スループットが関連している可能性があります。メカニカルディスクはシステム独立でもあります。これは単なるデータです。
私はカーネル2.6.35-2を使用していますが、このSSDを購入して以来この問題を発見しました。
では、速度低下の原因は何ですか? EXT4の問題?カーネルの問題? SSDの問題?何よりも?他にはありませんか?
追加のテストが必要だと思われる場合は、実行方法を説明するコメントを残してください。結果を質問に添付します。
答え1
これはしばらく既知の問題でした。 BtrfsなどのSSD調整FSを使用すると役に立ちますが、そうでない可能性があります。
最終的に、これはIOスケジューラ/メモリ管理システムのバグです。最近、この問題を解決するためのいくつかのパッチがリリースされました。バラより修正済み:Linuxデスクトップの応答性に問題がありますか?
これらのパッチは最終的にメインラインカーネルに含めることができますが、現時点ではこの問題を解決するには独自のカーネルをコンパイルする必要があります。
答え2
LinuxでSSDのパフォーマンスを向上させるために確認できるいくつかの点があります。
マウントポイントを「noatime」に設定します。ほとんどのユースケースでは、追加のアクティビティ更新アクセス時間は通常無駄になります。特に、単一の行がファイルに連続的に挿入されている場合、アクセスするたびにファイルシステムが複数回更新されます。
エレベーターをチェックしてください。ほとんどのディストリビューションのデフォルトのエレベーターは、回転ディスクへのランダムアクセス用に設定されています。 SSDには追加のロジックが必要ないため、エレベータをnoopに設定すると、ハードウェアに書き込みを管理させ、パフォーマンスを向上させることができます。
連続書き込みおよび後書きキャッシュ。少し難解ですが、
hdparm
デバイスで使用されているキャッシュ方法を確認できます。後書きキャッシュは、連続書き込みと比較してSSDパフォーマンスにプラスの影響を与える可能性があります。
答え3
ファイルキャッシュがワークロードに合わせて正しく調整されていない可能性があります。残念ながら、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圧力を大幅に減らし、コアが他のタスクをよりよく処理できるようにします。これは低スループットのために改善された待ち時間を交換する。
もう一つの可能性はキャッシュを増やすことです。ただし、プロセスが常に新しいデータを書き込んでいる場合、キャッシュがいっぱいになると非常に深刻な待ち時間が発生します。試してみたい場合は、次のようにできます。
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
設定は、*_ratio
使用可能なRAMの割合を示します。より良い制御が必要な場合は、*_bytes
設定を使用してください。私は個人的にワークステーションに次の構成を使用します。
vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000
これにより、バックグラウンド書き込みキャッシュが50MBに制限され、キャッシュに200MBがある場合、同期書き込みが強制されます。