- 1 CPUQuotaとは?
- 2 検証環境
- 3 事前準備(stress-ngパッケージのインストール)
- 4 動作確認(CPUQuotaを設定しない場合)
- 5 動作確認(CPUQuota=10%を設定した場合)
- 6 まとめ
- Y 参考図書
- Z 参考情報
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 |
Y 参考図書
TECHNICAL MASTER はじめてのAlmaLinux 9 & Rocky Linux 9 Linuxサーバエンジニア入門編
TECHNICAL MASTER はじめてのAlmaLinux 9 & Rocky Linux 9 Linuxサーバエンジニア入門編 (TECHNICAL MASTER 100) 単行本
Rocky Linux & AlmaLinux実践ガイド impress top gearシリーズ
Rocky Linux & AlmaLinux実践ガイド (impress top gear) 単行本
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ