私はプロセスディスクioを設定された速度制限に制限する方法を探しています。理想的には、プログラムは次のように動作します。
$ limitio --pid 32423 --write-limit 1M
プロセス32423のハードディスク書き込み速度を1秒あたり1MBに制限します。
答え1
これは間違いなくユーザースペースで実行できないマイナーな作業ではありません。幸いなことに、cgroup
LinuxとLinuxではmechanizmを使用できます。ブロックコントローラ。
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
limit1M
これで、メジャー/マイナー番号を持つデバイスの書き込み速度を制限するcgroupがあります。X:Y1MB/秒 ご覧のとおり、この制限はデバイスごとに適用されます。今やるべきことは、そのグループにいくつかのプロセスを入れて制限することだけです。
echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
他のオペレーティングシステムでこれを行うことができるかどうかはわかりません。
答え2
ionice
util-linux
あなたが望むものに似た仕事を始めてください。
絶対的なIO制限を設定せずに、nice
プロセスのCPU優先順位と同様にIO優先順位と「良い」を設定します。
マニュアルページから:
ionice - プロセス I/O スケジューリングのカテゴリと優先順位を設定または取得します。 説明する このプログラムは、I / Oスケジューリングカテゴリと優先順位を設定または取得します。 プログラム。引数が指定されていない場合、または-pのみが指定されている場合は、ioniceが照会します。 現在のI / Oスケジューリングクラスとこのプロセスの優先順位。 コマンドが与えられると、ionice は与えられたコマンドを使ってコマンドを実行します。 議論。クラスが指定されていない場合は、コマンドが実行されます。 「ベスト」スケジューリングクラスを使用します。デフォルトの優先順位は4です。
答え3
正解はFaqieとても良いヒントです。ありがとうございます。問題はプロセスを特定の帯域幅に制限するため、問題は実際には解決されません。
私は次のことを提案したいと思います:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
または廃止予定のバージョン:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
これはすでに実行されているプロセスでは機能しないため、まだ問題にはなりませんが、他の場合に役立ちます。
リンク:
答え4
systemdは、cgroup操作に対するプロセス呼び出しのためのラッパーを提供します。 systemd-run(1) のマニュアルページから:
次のコマンドはUpdateb(8)ツールを呼び出しますが、ブロックIOの重みを10に減らします。 BlockIOWeight= プロパティの詳細については、systemd.resource-control(5) を参照してください。
systemd-run -p BlockIOWeight=10 updatedb
フォアグラウンドでプログラムを実行するには、この--scope
オプションを使用することをお勧めします。systemd-run