web-dev-qa-db-ja.com

プロセスI / Oごとに最大制限までスロットルする方法は?

プロセスのディスクioを設定された速度制限に制限する方法を探しています。理想的には、プログラムは次のように機能します。

$ limitio --pid 32423 --write-limit 1M

プロセス32423を毎秒1メガバイトのハードドライブ書き込み速度に制限します。

35
Sepero

これは確かに、ユーザー空間では実行できない簡単な作業ではありません。幸い、cgroup mechanizmとその blkioコントローラー を使用して、Linuxで実行できます。

Cgroupのセットアップは、すでにマウントされているか、どこかで使用されている可能性があるため、どういうわけかディストリビューション固有です。ただし、一般的な考え方は次のとおりです(適切なカーネル構成がある場合)。

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

blkioコントローラを設定したので、それを使用できます。

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

これでcgroupができましたlimit1Mメジャー/マイナー番号X:Yを持つデバイスの書き込み速度を1MB/sに制限します。ご覧のとおり、この制限はデバイスごとです。あなたが今しなければならないのは、そのグループの中にいくつかのプロセスを置くことであり、それは制限されるべきです:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

他のオペレーティングシステムでこれを実行できるかどうか、またどのように実行できるかわかりません。

34

ioniceからutil-linuxは、あなたが望むものと同様のことを行います。

絶対IO制限を設定せず、IO優先度と「素晴らしさ」を設定します-Niceがプロセスに対して行うことと同様です ' CPU優先度。

Manページから:

 ionice-プロセスI/Oスケジューリングクラスと優先度を設定または取得します
 
 DESCRIPTION 
このプログラムは、a [のI/Oスケジューリングクラスと優先度を設定または取得します。____。]プログラム。引数がない場合、または-pのみが指定されている場合、ioniceは
現在のI/Oスケジューリングクラスとそのプロセスの優先度を照会します。
 
コマンドが指定されると、ioniceはこれを実行します与えられた
引数を持つコマンド。クラスが指定されていない場合、コマンドは「ベストエフォート」スケジューリングクラスで実行されます
。デフォルトの優先度レベルは4です。
23
cas

systemdは、cgroupで操作されるプロセスの呼び出し用のラッパーを提供します。 systemd-run(1)のmanページから:

次のコマンドは、updatedb(8)ツールを呼び出しますが、ブロックIOの重みを10に下げます。BlockIOWeight=プロパティの詳細については、systemd.resource-control(5)を参照してください。
systemd-run -p BlockIOWeight=10 updatedb

--scopeオプションを使用して、systemd-runがプログラムをフォアグラウンドで実行するようにすることを検討してください。

9
fche

fche の答えは非常に良いヒントです。そのおかげで問題は本当に解決しませんが、問題はプロセスを特定の帯域幅に制限することでした。

私はこのようなものを提案します:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

または非推奨バージョン:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

それでも、すでに実行中のプロセスには使用できないため、これは問題に適合しませんが、他のいくつかのケースでは役立つ場合があります。

リンク:

7
Benibr