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


32

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

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

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

回答:


33

それは確かに、ユーザースペースで実行できない簡単なタスクではありません。幸いなことに、mechanizmcgroupとその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 

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

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

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


3
あなたすなわちによってサブグループを作成するために、デバイスの広い総ポリシーを設定するための最初の必要があることに注意してくださいecho "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device、あなたはすなわちによってXとYを得るls -l /dev/sda
dothebart

cgroup v1は、次のキャッシュのライトバックをサポートしていません。つまり、(デバイスではなく)ファイルシステムの標準ファイルに書き込む単純なddコマンドをテストしても、おそらく制限は表示されません。ライトバックを使用しなくてもdd ... oflag=direct機能します。期待どおりに機能します。ファイルシステムがサポートしている場合、cgroup v2はこれを処理できます。詳細:cgroupを使用してI / Oを制限する
AB

22

ioniceからutil-linuxあなたが望むものに似た何かをします。

絶対的なIO制限を設定するのではなく、IO優先度と「ナイスネス」を設定します- niceプロセスのCPU優先度と同様です。

manページから:

ionice-プロセスI / Oスケジューリングクラスと優先度を設定または取得します

説明
このプログラムは、I / Oスケジューリングクラスと優先度を設定または取得します。
プログラム。引数が指定されていない場合、または-pのみが指定されている場合、ioniceは
そのプロセスの現在のI / Oスケジューリングクラスと優先順位。

コマンドが与えられると、ioniceは与えられたコマンドでこのコマンドを実行します
引数。クラスが指定されていない場合、コマンドが実行されます
「ベストエフォート」スケジューリングクラスを使用します。デフォルトの優先度レベルは4です。

5
CFQI / Oスケジューラでのみ機能することを覚えておいてください。最新のシステムの多くはdeadline、デフォルトで有効になっています。
ハイステイカー

8

systemdは、cgroupが操作するプロセスの呼び出しのラッパーを提供します。systemd-run(1)のマニュアルページから:

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

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


7

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

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

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

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

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

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

リンク:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.