プロセスが使用する帯域幅を制限するにはどうすればよいですか?

プロセスが使用する帯域幅を制限するにはどうすればよいですか?

CentOS 5.7 サーバーがあり、毎晩ファイルをバックアップする予定です。バックアップがネットワーク経由で転送されている間、サーバーがホストするさまざまなサイトへの訪問者のパフォーマンスが低下するのではないかと心配しています。

プロセスの最大許容スループットをネットワーク インターフェイスに制限することは可能ですか? SSH ベースのファイル転送を、使用可能な帯域幅の半分だけに制限したいと思います。これはサーバー側でもクライアント側でも実行できます。つまり、接続を開始するクライアント側でも、接続を受信するサーバー側でも、これを実行できます。

(残念ながら、バックアップ専用のインターフェイスを追加することはできません。利用可能なスループットを増やすことはできますが、それは単にネットワーク転送が速く完了するだけであり、その間接続の合計容量は最大になります。)


背景

おそらく、背景を説明する必要があるでしょう。少し振り返ってみると、バックアップ自体を作成するためのローカル スペースが足りないという問題がありました。SSHFS の登場です。バックアップは表面上はローカル ドライブに保存されるため、Web サーバー自体にはバックアップ ビットが保存されることはありません。

なぜそれが重要なのか?それは、尊敬すべきの使用を無効にするように思われるからですrsync --bwlimitrsync実際には転送も行われていませんし、できるバックアップ ファイルを保存するためのスペースすら確保できないためです。

「ちょっと待ってください。なぜバックアップ ファイルを作成する必要があるのですか?rsyncソース ファイルとフォルダーだけではだめなのですか?」という声が聞こえてきそうです。なぜなら、「Plesk」という厄介なものが混ざっているからです。これは、利便性のために Plesk を使用しているクライアント向け Web ホストです。そのため、私は Plesk を使用してバックアップを開始します。Plesk はバックアップにさまざまな魔法を追加し、復元手順中にバックアップを非常に安全に使用できるようにしてくれるからです。

悲しい顔

答え1

私が最近発見した選択肢の一つはtrickle

trickleは、ポータブルで軽量なユーザー空間帯域幅シェーパーです。 共同モード( と併用trickled)またはスタンドアロン モードで実行できます。

trickleUnix ローダーのプリロードを利用して動作します。基本的に、アプリケーションに、ソケットを介してデータを送受信するために必要な機能の新しいバージョンを提供します。次に、ソケットを介したデータの送受信を遅延させることに基づいてトラフィックを制限します。trickle完全にユーザー空間で実行され、ルート権限は必要ありません。

Ubuntuユーザーの場合は、以下を実行してインストールします。

sudo apt install trickle

例として、maven buildダウンロード速度を 20kB/s、アップロード速度を 111kB/s に制限して実行します。

trickle -sd 20 -u 111 mvn build

答え2

を使用しiptablesてパケットをマークし (--pid-owner ...)、次に を使用してtcトラフィックをシェーピングできます。また、「--sid-owner」を使用して、そのプロセスのスレッドと子を含めることもできます。

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

マッチ --pid 所有者
カーネル2.3、2.4、2.5、2.6
iptables -A 出力 -m 所有者 --pid-owner 78
説明 このマッチは、パケットの送信元であるプロセス ID (PID) に基づいてパケットをマッチさせるために使用されます。このマッチは使い方が少し難しいですが、1 つの例として、PID 94 のみが HTTP ポートからパケットを送信できるようにすることが挙げられます (もちろん、HTTP プロセスがスレッド化されていない場合)。あるいは、特定のデーモンの ps 出力から PID を取得し、そのデーモンのルールを追加する小さなスクリプトを作成することもできます。たとえば、Pid-owner.txt の例に示すようなルールを作成できます。

答え3

パイプ (または stdout) に書き込むことができる場合は、pv(pipe viewer) コマンドをインストールできます。これは、もともとパイプを介して転送されるデータの進行状況を表示するために作成されました。

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

答え4

どのようにデータを転送していますか? (ssh 経由の rsync? scp? sftp? その他?)

rsync を使用すると、帯域幅を制限できます (オプション --bwlimit=KBPS を参照)。rsync -e ssh --bwlimit ..

あるいは、qdisc または同等のものをセットアップして、高度なレート制限を行うこともできますが、あなたの場合はやりすぎだと思います。これに関するドキュメントは、Linux の高度なルーティングとトラフィック制御 HOWTO

関連情報