hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

CPUQuotaの使い方



1 CPUQuotaとは?

CPUQuotaは、プロセスに割り当てられるCPUリソースの割合を制限するための機能です。CPUQuotaを設定すると、特定のプロセスがシステム全体のCPUリソースのうち、一定の割合しか利用できなくなります。例えば、CPUQuotaに20%を設定すると、そのユニットファイルで指定されたプロセスは、システム上のCPUリソースのうち20%まで利用できるようになります。これにより、他の重要なプロセスが十分なCPUリソースを利用できるようになり、システム全体の安定性やパフォーマンスを向上させることができます。

本記事では、CPUQuotaにCPU使用率を設定して、その効果を検証してみます。

2 検証環境

AlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

仮想マシンに搭載しているCPU数は4個です。lscpuの使い方は、lscpuコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lscpu -ae
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
  0    0      0    0 0:0:0:0          yes
  1    0      1    1 1:1:1:1          yes
  2    0      2    2 2:2:2:2          yes
  3    0      3    3 3:3:3:3          yes

3 事前準備(stress-ngパッケージのインストール)

CPU負荷をかけるため、stress-ngパッケージをインストールします。stress-ngパッケージはepelリポジトリにあるので、まず、epel-releaseパッケージをインストールします。

[root@server ~]# yum -y install epel-release

次に、stress-ngパッケージをインストールします。

[root@server ~]# yum -y install stress-ng

stress-ngコマンドの版数を確認します。

[root@server ~]# stress-ng -V
stress-ng, version 0.15.00 (gcc 11.3, x86_64 Linux 5.14.0-284.11.1.el9_2.x86_64) ?諮

なお、stress-ngコマンドの使い方は、stress-ngコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

4 動作確認(CPUQuotaを設定しない場合)

4.1 実験1(1つのCPUに負荷をかけた場合)

1つのCPUにCPU使用率40%の負荷をかけるユニットファイルを作成します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 1 -l 40

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使ってstress-ngプロセスのCPU使用率を確認すると、CPU1の使用率が約40%であることがわかります。なお、psコマンドの使い方は、psコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2328       1   3  0.1 do_wait
stress-ng          2329    2328   1 39.7 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

4.2 実験2(2つのCPUに負荷をかけた場合)

2つのCPUにCPU使用率40%の負荷をかけるユニットファイルを作成します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 2 -l 40

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使ってstress-ngプロセスのCPU使用率を確認すると、CPU2,CPU3の使用率が約40%であることがわかります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          1378       1   0  0.1 do_wait
stress-ng          1379    1378   2 39.2 -
stress-ng          1380    1378   3 39.1 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

4.3 実験3(3つのCPUに負荷をかけた場合)

3つのCPUにCPU使用率40%の負荷をかけるユニットファイルを作成します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 3 -l 40

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使ってstress-ngプロセスのCPU使用率を確認すると、CPU1,CPU2,CPU3の使用率が約40%であることがわかります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          1416       1   0  0.0 do_wait
stress-ng          1417    1416   1 39.2 do_select
stress-ng          1418    1416   2 39.0 do_select
stress-ng          1419    1416   3 39.2 do_select

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

4.4 実験4(4つのCPUに負荷をかけた場合)

4つのCPUにCPU使用率40%の負荷をかけるユニットファイルを作成します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 4 -l 40

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使ってstress-ngプロセスのCPU使用率を確認すると、CPU0,CPU1,CPU2,CPU3の使用率が約40%であることがわかります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2365       1   1  0.0 do_wait
stress-ng          2366    2365   0 39.6 do_select
stress-ng          2367    2365   3 39.6 do_select
stress-ng          2368    2365   2 39.7 do_select
stress-ng          2369    2365   1 39.7 do_select

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

5 動作確認(CPUQuota=10%を設定した場合)

5.1 実験5(1つのCPUに負荷をかけた場合)

1つのCPUでCPU使用率が40%になるようにユニットファイルを作成します。このとき、CPUQuotaに10%を設定します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 1 -l 40
CPUQuota=10%

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使用して、stress-ngプロセスのCPU使用率を確認しました。CPU0のCPU使用率が8.8%であるため、stress-ngプロセスはシステム全体でCPUを8.8%使用しています。CPUQuotaとして10%を指定しているため、ほぼ期待どおりのCPU使用率であることが分かります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2105       1   3  0.0 do_wait
stress-ng          2106    2105   0  8.8 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

5.2 実験6(2つのCPUに負荷をかけた場合)

2つのCPUでCPU使用率が40%になるようにユニットファイルを作成します。このとき、CPUQuotaに10%を設定します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 2 -l 40
CPUQuota=10%

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使用して、stress-ngプロセスのCPU使用率を確認しました。各CPUの使用率は以下の通りです:CPU1=5.0%、CPU3=4.6%。したがって、stress-ngプロセスはシステム全体でCPUを合計で9.6%使用しています。CPUQuotaとして10%を設定しているため、ほぼ期待どおりのCPU使用率であることがわかります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2163       1   0  0.2 do_wait
stress-ng          2164    2163   3  4.6 -
stress-ng          2165    2163   1  5.0 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

5.3 実験7(3つのCPUに負荷をかけた場合)

3つのCPUでCPU使用率が40%になるようにユニットファイルを作成します。このとき、CPUQuotaに10%を設定します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 3 -l 40
CPUQuota=10%

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使用して、stress-ngプロセスのCPU使用率を確認しました。各CPUの使用率は以下の通りです:CPU0=3.2%、CPU2=3.3%、CPU3=3.3%。したがって、stress-ngプロセスはシステム全体でCPUを合計で9.8%使用しています。CPUQuotaとして10%を設定しているため、ほぼ期待どおりのCPU使用率であることが分かります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2198       1   2  0.0 do_wait
stress-ng          2199    2198   0  3.2 -
stress-ng          2200    2198   3  3.3 -
stress-ng          2201    2198   2  3.3 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

5.4 実験8(4つのCPUに負荷をかけた場合)

4つのCPUでCPU使用率が40%になるようにユニットファイルを作成します。このとき、CPUQuotaに10%を設定します。

[root@server ~]# vi /etc/systemd/system/stress-ng.service
[root@server ~]# cat /etc/systemd/system/stress-ng.service
[Unit]
Description=CPUQuotaTest

[Service]
ExecStart=stress-ng -k -c 4 -l 40
CPUQuota=10%

[Install]
WantedBy=multi-user.target

ユニットファイルを変更したので、Systemdに設定ファイルの再読み込みを指示します。

[root@server ~]# systemctl daemon-reload

stress-ngサービスを起動します。

[root@server ~]# systemctl start stress-ng.service

psコマンドを使用して、stress-ngプロセスのCPU使用率を確認しました。各CPUの使用率は以下の通りです:CPU0=2.4%、CPU1=2.4%、CPU2=2.1%、CPU3=2.2%。したがって、stress-ngプロセスはシステム全体でCPUを合計で9.1%使用しています。CPUQuotaとして10%を設定しているため、ほぼ期待どおりのCPU使用率であることが分かります。

[root@server ~]# ps -C stress-ng -o comm,pid,ppid,psr,%cpu,wchan
COMMAND             PID    PPID PSR %CPU WCHAN
stress-ng          2234       1   2  0.1 do_wait
stress-ng          2235    2234   3  2.2 -
stress-ng          2236    2234   2  2.1 -
stress-ng          2237    2234   1  2.4 -
stress-ng          2238    2234   0  2.4 -

stress-ngサービスを停止します。

[root@server ~]# systemctl stop stress-ng.service

6 まとめ

(1) CPUQuota未使用時のCPU使用率
CPUQuotaを指定していないため、stress-ngコマンドの引数で指定したCPU使用率(40%)までCPUが使用されていることが分かります。

CPU0 CPU1 CPU2 CPU3
実験1 - 39.7 - -
実験2 - - 39.2 39.1
実験3 - 39.2 39.0 39.2
実験4 39.6 39.7 39.7 39.6

(2) CPUQuota=10%を指定した時のCPU使用率
CPU使用率の合計がCPUQuotaで指定したCPU使用率(10%)未満になっていることがわかります。

CPU0 CPU1 CPU2 CPU3 CPU使用率の合計
実験5 8.8 - - - 8.8
実験6 - 5.0 - 4.6 9.6
実験7 3.2 - 3.3 3.3 9.8
実験8 2.4 2.4 2.1 2.2 9.1

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ