Linuxサーバーでディスクに大量に書き込んでいるという問題が発生しているため、IO待機が大きいため、応答時間が遅くなっています。ディスクのスマート値をすでに確認しています。これは、RAID1 softwareRaid、ext4ファイルシステムでの2つのディスクのセットアップです。
今のところハードウェアをアップグレードすることも、集中的なI/Oアプリケーションを取り除くこともできないため、I/O待機時間を短縮するためにLinuxvm設定を構成することを計画していました。
私はスワッピングを調整することを考えていますが、主にdirty_background_ratioとdirty_ratioです。
質問:
現在のシステム負荷とメモリ使用量に基づいて、この値の調整をどのように見積もることができますか?
あなたはいくつかのものが欲しいです。まず、swappinessを減らしたい
sysctl -w vm.swappiness = 10
これにより、ディスクIOがいくらか節約されます。最後に必要なのは、カーネルがmemから何かをページアウトしようとしたときに、ディスクに追加で書き込むことです。目標は、スワッピングがほとんど必要ないように調整することです。ただし、swappinessを0に設定したり、無効にしたりしてオフにしないでください。 swappinessを1に設定するまで、極端なアクションを実行することをお勧めします。dstatの出力をしばらく観察すると、実際にスワップから読み書きされるデータの量にすぐに気付くでしょう。
新しいカーネル(3.2以降)には、 ライトバックスロットル と呼ばれるメカニズムがあります。あなたが言ったようにそれを使用できるようにするには、ダーティレシオを調整する必要があります。詳細を確認してください このリンク 。そこからあなたが興味を持っていることを引用してください
Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which
writes gets throttled.
したがって、デフォルトでは、特にメモリが多く、ディスクサブシステムが遅い場合は、汚れがかなり多くなります。したがって、それらを調整する必要があります。通常の使用に影響を与えないように可能な限り低く*、それでも値は、ディスクIOボトルネックの状況で、カーネルがプロセスを生成してディスクに書き込む前に、メモリに存在するデータの量を決定しますその時点で、そのプロセスをスロットルする必要があります。これは、カーネルがスリープを挿入することによって実行されます。
*通常の使用法を理解するため。上にインストールして、そこで何が起こっているかを観察することをお勧めします。そこでdirty
の数値を確認し、ディスクの読み取り/書き込みが追跡されるDの概要を確認します。列WCANCLがあります。これらは実際にはメモリで処理された書き込みであり、ディスク(ダーティページ)に書き込む必要はありませんでしたが、一部の一時データ用です。 Mysqlには、複雑なクエリを実行する場合や、長い間必要とされない小さなobjファイルを大量に作成する場合のコンパイラなどがあります。
それ以外の場合は、期限付きディスクスケジューラに切り替えて、環境に合わせて読み取りと書き込みの親和性を調整すると役立つ場合があります。例えば書き込みの10倍の読み取りを行う場合は、設定することをお勧めします
/sys/block/<device>/queue/iosched/writes_starved
デフォルト2ではなく5に設定します。
/sys/block/<device>/queue/iosched/write_expire
また役立ちます。さらに、バッチで実行されるリクエストの数を128
から32
に減らすと、レイテンシが発生する可能性があります。
/sys/block/<device>/queue/nr_requests
大量の書き込みがある場合は、システムで使用可能な書き込みキャッシュレイヤーがないために制約があります。 2つのディスクとソフトウェアRAIDがそれを困難にします。通常、これはハードウェアRAIDの機能です。現在の状況は、ワークロードに適したハードウェア構成ではありません。
より良い回答を提供するために、アプリケーションが実行していること、OS、ファイルシステムで書き込みバリアが有効になっているかどうかなどの詳細が必要になります。
編集:あなたの基礎が悪い場合にのみ、これまでのところ調整することができます。この目的のために、ディスクを回転させるのではなく、SSDを検討する必要があるかもしれません。
最近、dirty_background_ratioやdirty_ratioなどについてブログに書いています。
短いバージョンでは、* _ ratio変数を使用せず、代わりに* _bytesバージョンを使用し、帯域幅(またはデータ生成レート)を取得し、大規模な書き込みの前に許容できる最大レイテンシーを掛けてバイト数を見積もります。ディスクを叩き始めます。
ダーティバックグラウンドバイトの値を比較的低く設定することで(完全なデータ受信/生成レートで1秒未満の遅延)、誰も何もしていないときにバッファーが蓄積されないようにします。ダーティバイトを2倍または3倍高く設定すると(RAMの量によっては、少なくとも10倍以上になる可能性があります)、バーストプロセスが抑制されないようにします。データ生成速度とディスク書き込み速度の違いを考慮することで、dirty_bytes値を見積もることができます。これはバッファのフィルレートであり、フィルが抑制される前に最大バッファリング時間を掛けることができます。したがって、たとえば、レートRgでデータを生成し、レートRdでディスクに書き込む場合、RgがRdより大きい場合、dirty_background_bytesをRg *(0.5秒)に設定して、データのスラミングを開始してから約0.5秒後にディスクが書き込みを開始するようにすることができます。バッファに入れてから、たとえばdirty_bytesをmax(2 * Rg * 0.5、(Rg-Rd)*(2seconds))に設定します。バーストプロセスは、バッファがスロットルされるのに十分な大きさになる前に、最大2秒間書き込むことができます。