DdコマンドのCPU使用率にハードリミットを設定しようとしています。以下のユニットファイルを作成しました
[Unit]
Description=Virtual Distributed Ethernet
[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%
[Install]
WantedBy=multi-user.target
次の簡単なスクリプトを呼び出します
#!/bin/sh
dd if=/dev/zero of=/dev/null bs=1024k
私が見てきたように このガイドで 、私のdd
サービスのCPU使用率は10%を超えるべきではありません。しかし、system-cgtop
コマンドを実行すると、使用率は約70〜75%です。
私が間違っていることのアイデアとそれをどのように修正できますか?
systemctl show dd
を実行すると、CPUに関して次の結果が得られます
CPUShares=18446744073709551615
StartupCPUShares=18446744073709551615
CPUQuotaPerSecUSec=100ms
LimitCPU=18446744073709551615
あなたの解決策は正しいものであり、実際には非常に将来性があるはずです。 systemdを使用してサービスのcgroup設定を制御する。 CPUQota。
[Unit]
Description=Virtual Distributed Ethernet
[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%
[Install]
WantedBy=multi-user.target
man systemd.resource-control
systemdでのより便利なcgroup設定。
ただし、これには2つの注意点があります。私(およびおそらく他のいくつか)は踏みにじっています。これらの警告は本当にこれを追跡することは困難です。これについては簡単に見つけられる情報がないため、これがこの回答の主な理由です。
CPUQuota
設定はsystemd 213以降でのみ使用できます。 https://github.com/systemd/systemd/blob/master/NEWS を参照してください
* The CFS CPU quota cgroup attribute is now exposed for
services. The new CPUQuota= switch has been added for this
which takes a percentage value. Setting this will have the
result that a service may never get more CPU time than the
specified percentage, even if the machine is otherwise idle.
これは、たとえばsystemd 208にのみ付属するDebian Jessieの問題です。別の方法として、cpu.cfs_period_us
およびcpu.cfs_quota_us
手動でcgcreate
とcgset
を使用してcgroup-binパッケージから、例えば.
Sudo cgcreate -g cpu:/cpulimited
Sudo cgset -r cpu.cfs_period_us=50000 cpulimited
Sudo cgset -r cpu.cfs_quota_us=10000 cpulimited
Sudo cgexec -g cpu:cpulimited /usr/bin/ddcommand
設定についてcpu.cfs_period_us
およびcpu.cfs_quota_us
を使用するには、カーネルをconfig-flagでコンパイルする必要がありますCONFIG_CFS_BANDWIDTH
。悲しいことに、Debian Jessieの3.16.xカーネルは、デフォルトでこのフラグを使用してコンパイルされていません。この 機能リクエスト を参照してください。
これはDebian Stretchでも利用できます。 jessie-backportsのカーネルを使用することもできます。これはフラグを有効にする必要があります。
この答えが私と同じ問題を抱えている数人の人に役立つことを願っています...
PS:CPUquotaが環境で機能しているかどうかをテストする簡単な方法は次のとおりです。
$ apt-get install stress
$ systemd-run -p CPUQuota=25% --slice=stress -- stress -c <your cpu count>
top
またはhtop
で監視すると、負荷はすべてのCPU /コアに(均等に)分散され、合計で25%になります。
代替ツールとして、ほとんどのディストリビューションで利用できるcpu-limitを使用できます。
$ apt-get install cpulimit
$ cpulimit -l 10 -P /usr/bin/ddcommand
添付のコマンドにSIGSTOP
およびSIGCONT
を送信して、動作を一時停止および再開します。
私の知る限り、これと同時に複数の独立した/スタンドアロンプロセスを制御することは困難でしたそれらを一緒にグループ化しましたが、これに対する解決策もあるかもしれません...