SIGSTOP、SIGCONTシグナルを使用したIO過負荷保護を使用したLVM2ボリュームのバックアップ

バックアップを確実に構成することは、管理者の活動において最も重要な場所の1つになります。 バックアップタスク、アプリケーションタイプ、およびデータタイプに応じて、rsync、duplicity、rdiff-backup、baculaなど、さまざまなツールを使用してバックアップを実行できます。







組織のニーズを満たすバックアッププロセス自体の実装に加えて、バックアップの実行時に必然的に発生する多くの問題があります。その1つは、ディスクサブシステムの負荷の増加であり、アプリケーションパフォーマンスの低下につながる可能性があります。







この問題の解決策は単純ではありません。多くの場合、管理者は妥協を余儀なくされ、その結果、手順の期間が長くなったり、バックアップの頻度が毎日から毎週に減少したりします。 これらのトレードオフは避けられず、既存の技術的制限に対する必要な対応です。







それにもかかわらず、主な問題は未解決のままです。 メインアプリケーションが許容可能なサービス品質を得るためのバックアップ方法 UNIXファミリオペレーティングシステムは、 ioniceと呼ばれるアプリケーションに標準のI / O優先度管理メカニズムを提供し、さらに、特定のUNIX実装は、追加の制限を許可する独自のメカニズムを提供します。 たとえば、GNU / Linuxの場合、帯域幅(物理的に接続されたデバイス)を制限し、プロセスのグループに相対的な優先順位を設定できるcgroupsメカニズムがあります。







ただし、場合によっては、このような決定だけでは不十分であり、システムプロセスの実際の「ウェルビーイング」に集中する必要があります。これは、 Load Averageや%IOWaitなどのシステムパラメータを反映します。 この場合、ddを使用してLVM2からデータをバックアップしている間、私はかなり長い間首尾よく使用してきました。







タスクの説明



LVM2を使用したスト​​レージが構成されているGNU / Linuxサーバーがあり、このサーバーのボリュームは毎晩バックアップされます。これは、パーティションスナップショットを作成し、dd + gzipを実行することで実行されます:







ionice -c3 dd if=/dev/vg/volume-snap bs=1M | gzip --fast | ncftpput ...
      
      





バックアップを実行するとき、できる限り迅速に実行したいのですが、%IOWaitを30%に増やすと、アプリケーションのディスクシステムによるサービス品質が受け入れられなくなるため、このレベル以下に保つ必要があることに実験的に気づきました。 %IOWaitの最大許容値での処理を保証する制限メカニズムを実装する必要があります。







ソリューションを検索する



最初は、 ionice -3



アプローチを使用したソリューションが適用されましたが、安定した結果は得られませんでした。 %IOWaitが正常な場合、データを迅速にコピーできないため、cpipeおよびcgroups(スロットル)に基づくメカニズムは破棄されました。 その結果、%IOWaitの監視とSIGSTOP、SIGCONTシグナルとsar統計サービスを使用したddプロセスの一時停止/再開に基づいてソリューションが選択されました。







解決策



概略的には、解決策は次のとおりです。







  1. N秒間の統計を要求し、%IOWaitの平均値を取得します。
  2. アクションを定義します。

    a。 %IOWaitの値<30の場合、プロセスを再開します(SIGCONT)。

    b。 %IOWait> 30の値がプロセスを停止した場合(SIGSTOP)、カウンターを増やします。
  3. プロセスがN x Kより長く停止した場合、プロセスを再開し、2秒後に再び停止します


ほとんどの場合、項目3で質問が発生します。 なぜこんな奇妙な行動なのか? 実際、バックアップの一部として、データはFTPを介してリモートサーバーに転送され、コピープロセスが十分に長い時間停止した場合、タイムアウトによって接続が失われる可能性があります。 これを防ぐために、「レッド」ゾーンにいる場合でも、コピープロセスの強制再開と停止を実行します。

ソリューションコードを以下に示します。







 #!/bin/bash INTERVAL=10 CNTR=0 while : do CUR_LA=`LANG=C sar 1 $INTERVAL | grep Average | awk '{print $6}' | perl -pe 'if ($_ > 30) { print "HIGH "} else {print "LOW "}'` echo $CUR_LA MARKER=`echo $CUR_LA | awk '{print $1}'` if [ "$MARKER" = "LOW" ] then CNTR=0 pkill dd -x --signal CONT continue else let "CNTR=$CNTR+1" pkill dd -x --signal STOP fi if [ "$CNTR" = "5" ] then echo "CNTR = $CNTR - CONT / 2 sec / STOP to avoid socket timeouts" CNTR=0 pkill dd -x --signal CONT sleep 2 pkill dd -x --signal STOP fi done
      
      





このソリューションは、サーバーのIO過負荷の問題を解決しましたが、速度を厳しく制限することはなく、数か月間は忠実に機能しましたが、これを目的としたメカニズムに基づくソリューションはプラスの結果をもたらしませんでした。 sarによって取得されたパラメーター値は、Load Averageおよびサービスの低下と相関する他のパラメーターに簡単に置き換えることができることに注意してください。 このスクリプトは、LVM2 + ddを使用しないが、たとえばRsyncまたは他のバックアップツールを使用するタスクに非常に適しています。







cgroupを使用すると、物理ブロックデバイスからデータをコピーする際に、この方法で停止ではなく帯域制限を実装できます。







PS:スクリプトは、編集せずに元の形式で提供されます。








All Articles