はじめに
テストのため、LinuxサーバにCPU負荷をかけたい場面がありました。
手っ取り早く実施したく、以下のようにyesコマンドを実行しました。
yes > /dev/null
yesコマンドは"y"を無限に出力し続けるコマンドです。
「無限ループなのでCPU使用率は100%になるはず」というのが私の想定でしたが、
確認したところ異なる結果になりました。
今回検証した環境は2コアのLinuxサーバです。
topコマンドを見てみる
topコマンドで確認したところあることに気付きました。
%Cpu(s): 29.8 us, 20.2 sy, 0.0 ni, 49.4 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 64.1 us, 35.9 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2095 root 20 0 221388 1836 1712 R 100.0 0.2 3:42.71 yes
yesプロセスは100%使っているのに、CPU全体では50%しか使用されていませんでした。
CPUごとの使用率をみると、CPU1だけが100%近く使われCPU0はほぼアイドル状態でした。
yesコマンドはシングルスレッドで動作する
yes はシングルスレッドのプロセスです。
そのため、CPU0とCPU1のどちらかで実行される可能性はありますが、
同時に両方のCPUで実行されることはありません。
CPU使用率100%の意味
top のプロセス一覧に表示される %CPU は、
「1つのCPUコアを100%使用している」という意味です。
そのため、2コア環境で yes を1つだけ実行すると
- CPU0: 0%
- CPU1:100%
となり、プロセス一覧では yes が100%、CPU全体では約50%となります。
CPU使用率を100%にするには?
CPU全体へ負荷をかけるには、CPUコア数と同程度の実行可能なプロセスが必要になります。
というわけで以下のコマンドを実行すればよいです。
for i in $(seq $(nproc)); do yes > /dev/null & done
テストが終わった後はpkill yesを忘れずに。
コアを増やしても早くはならない
yesコマンドはシングルスレッドのため、処理性能は1コア分の性能に依存します。
そのため、CPUを32コアなどに増やしてもyes単体の処理速度は基本的に向上しません。
一方でソフトウェアのビルドやデータ解析など複数スレッドで動作できる処理については
CPUコアが増えるほど性能向上が期待できます。
コア数ではなく、ソフトウェアがそのコアを活用できるかが重要だということですね。
まとめ
今回の調査で分かったことは次のとおりです。
- yes はシングルスレッドで動作する。
- シングルスレッドは同時に1つのCPUコアしか利用できない。
-
yesを1つ実行しても、CPU全体の使用率は100%にならない。 - CPU全体へ負荷をかけるには、CPUコア数に応じて複数のプロセス(またはスレッド)が必要になる。
何気なく見ているCPU使用率ですが、裏側で何が起きているのかは実際に調査してみないとわかりません。
単純なコマンドで検証してみることで、LinuxやOSの動作をより深く理解することができました。