プロセスのディスクioを設定された速度制限に制限する方法を探しています。理想的には、プログラムは次のように機能します。
$ limitio --pid 32423 --write-limit 1M
プロセス32423を毎秒1メガバイトのハードドライブ書き込み速度に制限します。
これは確かに、ユーザー空間では実行できない簡単な作業ではありません。幸い、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
他のオペレーティングシステムでこれを実行できるかどうか、またどのように実行できるかわかりません。
ionice
からutil-linux
は、あなたが望むものと同様のことを行います。
絶対IO制限を設定せず、IO優先度と「素晴らしさ」を設定します-Nice
がプロセスに対して行うことと同様です ' CPU優先度。
Manページから:
ionice-プロセスI/Oスケジューリングクラスと優先度を設定または取得します DESCRIPTION このプログラムは、a [のI/Oスケジューリングクラスと優先度を設定または取得します。____。]プログラム。引数がない場合、または-pのみが指定されている場合、ioniceは 現在のI/Oスケジューリングクラスとそのプロセスの優先度を照会します。 コマンドが指定されると、ioniceはこれを実行します与えられた 引数を持つコマンド。クラスが指定されていない場合、コマンドは「ベストエフォート」スケジューリングクラスで実行されます 。デフォルトの優先度レベルは4です。
systemdは、cgroupで操作されるプロセスの呼び出し用のラッパーを提供します。 systemd-run(1)のmanページから:
次のコマンドは、updatedb(8)ツールを呼び出しますが、ブロックIOの重みを10に下げます。BlockIOWeight=プロパティの詳細については、systemd.resource-control(5)を参照してください。
systemd-run -p BlockIOWeight=10 updatedb
--scope
オプションを使用して、systemd-run
がプログラムをフォアグラウンドで実行するようにすることを検討してください。
fche の答えは非常に良いヒントです。そのおかげで問題は本当に解決しませんが、問題はプロセスを特定の帯域幅に制限することでした。
私はこのようなものを提案します:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
または非推奨バージョン:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
それでも、すでに実行中のプロセスには使用できないため、これは問題に適合しませんが、他のいくつかのケースでは役立つ場合があります。
リンク: