web-dev-qa-db-ja.com

systemdでのCPUQuotaの使用

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
8
SteveGr2015

いいもの

あなたの解決策は正しいものであり、実際には非常に将来性があるはずです。 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つの注意点があります。私(およびおそらく他のいくつか)は踏みにじっています。これらの警告は本当にこれを追跡することは困難です。これについては簡単に見つけられる情報がないため、これがこの回答の主な理由です。

警告1:

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手動でcgcreatecgsetを使用して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

警告2

設定について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を送信して、動作を一時停止および再開します。

私の知る限り、これと同時に複数の独立した/スタンドアロンプ​​ロセスを制御することは困難でしたそれらを一緒にグループ化しましたが、これに対する解決策もあるかもしれません...

13
TomKeegasi