回答:
それは確かに、ユーザースペースで実行できない簡単なタスクではありません。幸いなことに、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
他のオペレーティングシステムでこれを実行できるかどうか/どのように実行できるかはわかりません。
dd ... oflag=direct
機能します。期待どおりに機能します。ファイルシステムがサポートしている場合、cgroup v2はこれを処理できます。詳細:cgroupを使用してI / Oを制限する
ionice
からutil-linux
あなたが望むものに似た何かをします。
絶対的なIO制限を設定するのではなく、IO優先度と「ナイスネス」を設定します- nice
プロセスのCPU優先度と同様です。
manページから:
ionice-プロセスI / Oスケジューリングクラスと優先度を設定または取得します 説明 このプログラムは、I / Oスケジューリングクラスと優先度を設定または取得します。 プログラム。引数が指定されていない場合、または-pのみが指定されている場合、ioniceは そのプロセスの現在のI / Oスケジューリングクラスと優先順位。 コマンドが与えられると、ioniceは与えられたコマンドでこのコマンドを実行します 引数。クラスが指定されていない場合、コマンドが実行されます 「ベストエフォート」スケジューリングクラスを使用します。デフォルトの優先度レベルは4です。
CFQ
I / Oスケジューラでのみ機能することを覚えておいてください。最新のシステムの多くはdeadline
、デフォルトで有効になっています。
fcheの答えは非常に良いヒントです。そのおかげで、質問がプロセスを特定の帯域幅に制限することになったため、問題を実際に解決することはできません。
私はこのような何かを提案します:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
または非推奨バージョン:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
それでも、これはすでに実行中のプロセスに使用できないため、質問に適合しませんが、他の場合には役立つかもしれません。
リンク:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
、あなたはすなわちによってXとYを得るls -l /dev/sda