0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

テストのため、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の動作をより深く理解することができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?