ITエンジニアによるITエンジニアのためのブログ

CPUの論理、物理コア数とLoad Average、CPU使用率の関係

Linuxでシステム反応が低下した際、多くの場合はLoad averageをまず確認します。

しかし、そもそもLoad averageはいくつを超えたらシステムパフォーマンスが低下するのでしょうか。また、他に見るべき指標はあるのでしょうか。

結論からお伝えすると、パフォーマンスが低下し始めるのは以下の場合です。

  • Load Averageが持続的に論理コア数を超えた場合
  • %Cpu(CPU使用率)のアイドルタイム(%id)が継続的に 0% に近づき、かつユーザータイム(us)やシステムタイム(sy)の割合が多い場合

この記事では、Load averageとCPUの物理コア数、論理コア数の関係、及びCPU使用率について解説します。

目次

  • CPUの物理・論理コア数の確認
  • Load averageの目安
  • CPU使用率の目安
  • まとめ

CPUの物理・論理コア数の確認

Load averageの適切な数値はコア数によって変化するため、まずはシステムの物理コア数と論理コア数を把握します。

CPUのコア数を確認するには、いくつかの方法があります。

  1. lscpu コマンドを使用する
  2. nproc コマンドを使用する
  3. /proc/cpuinfo ファイルを確認する

1. lscpu コマンドを使用する

lscpu コマンドは、CPUアーキテクチャに関する情報を表示します。

# Bash
lscpu

このコマンドの出力の中で、以下の項目を確認します。

  • CPU:システムが認識している論理コアの総数(同時マルチスレッディングが有効な場合、物理コア数の2倍などになることがあります)。
  • ソケットあたりのコア数:ソケットごとの物理コア数
  • ソケット数:システム内の物理CPUソケット(CPUとマザーボードを接続するための接続部品の数
  • コアあたりのスレッド数:コアごとのスレッド数(同時マルチスレッディングが有効な場合は2など)。

多くの場合、論理コアの総数を知りたい場合はCPUの値を、物理コアの総数を知りたい場合はソケットあたりのコア数 x ソケット数を計算します。

例えば、lscpuが以下のような出力だったとします。

$ lscpu
CPU:                                  8
オンラインになっている CPU のリスト:  0-7
コアあたりのスレッド数:               2
ソケットあたりのコア数:               4
ソケット数:                           1

この場合、CPUの論理コア数と物理コア数は以下の通りです。

論理コア数: 8 (CPUの値)

物理コア数:4 (ソケットあたりのコア数4 x ソケット数1)

論理コアの値が物理コアの値の2倍となっていますが、これは同時マルチスレッディング(SMT: Simultaneous Multi-Threading、Intel系CPUではハイパースレッディングとも呼ぶ)が有効になっているためです。同時マルチスレッディングとは、一つの物理的なCPUコアをオペレーティングシステム (OS) に対して二つの論理コア(スレッド)として認識させる技術です。つまり、一つの物理コアで2つのスレッドを同時実行できます。

ただし、同時マルチスレッディングによる性能向上は、1つの物理コアを2つの物理コアにするほどではありません。一般的には、処理能力は1.2倍〜1.3倍程度の向上に留まると言われています。このことは、Load averageの適正値を知る上で重要になります。

2. nproc コマンドを使用する

論理コアの総数のみを素早く知りたい場合は、nprocコマンドが最も簡単です。

# Bash
nproc
# 例:8

このコマンドは、利用可能な論理プロセッサの数を直接出力します。

3. /proc/cpuinfo ファイルを確認する

CPUの詳細な情報が記載されている特殊なファイル/proc/cpuinfoの内容をgrepと組み合わせて確認する方法もあります。

論理コアの総数

/proc/cpuinfo内でprocessorの行を数えます。

# Bash
grep -c ^processor /proc/cpuinfo
# 例:8

物理コアの総数

/proc/cpuinfo内でcpu coresの行を見つけ、一意の値(通常は一つ)を取得します。複数の物理CPUがある場合は、その値にソケット数を掛けます。

# 物理コア数を表示(重複する可能性あり)
grep 'cpu cores' /proc/cpuinfo | uniq
# 例:cpu cores	: 4

# 物理CPUソケットの数
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
# 例:1

したがって、物理コアの総数は、grep 'cpu cores' /proc/cpuinfo | uniq の値 × grep 'physical id' /proc/cpuinfo | sort -u | wc -l の計算で求められます。

論理・物理コアの数を求めたら、Load averageを確認します。

Load Average(ロードアベレージ)の目安

LinuxのLoad averageは、1. CPUの処理待ちか実行中、2.ディスクなどI/O待ちのタスクの数の平均を示します。つまり、単位は〜個です。

Load averageはuptimeもしくはtopコマンドで確認できます。

# Bash
uptime
# 例:12:10:35 up 2 days, 21:20,  1 user,  load average: 0.68, 0.66, 0.56

行の一番最後に3つの数字が表示され、それぞれ直近1分間、5分間、15分間のLoad averageの平均です。

同じ情報はtopコマンドでも確認できます。

# Bash
top
# 例:top - 12:10:35 up 2 days, 21:20,  1 user,  load average: 0.68, 0.66, 0.56

平均はシステムが処理できる論理CPU(コア)の総数を基準として判断します。

例えば論理コア数が8であれば、Load averageが8.00を下回っていれば、CPUの待ち行列はほぼ発生していないことになります。

項目数値意味
論理コア数 8物理コア4 x コアあたりスレッド数2
理想的な限界8.00論理コアすべてが100%利用されている状態(飽和点)。これを超えると待ち行列が発生します。
キャパシティオーバー8.00 を超える継続的に8.00を超えると、タスクがCPUの割り当てを待つ状態(待ち行列)が発生し、システムの応答速度が低下し始めます。

ただしこれは理想論であり、前述の通り同時マルチスレッディング(論理コア)は物理コアの約20〜30%増しの性能と言われています。そのため、システムの応答性を重視する場合、実際にはLoad averageが物理コア数を超えたあたりから注意し、物理コア数の150%(物理コア数4ならLoad average 6.00)前後で対策を検討し始めるのが一般的です。

物理コア数4、論理コア数8の場合のLoad averageの目安

Load Average状態
4.00物理コア4つが100%利用されている状態です。
8.00論理コア8つすべてが100%利用されている状態です。
8.00以上8つの論理コアが完全に埋まり、新しいタスクがCPUの処理を待っている状態です。キャパシティオーバーであり、継続する場合は性能問題となります。

ただ、Load averageはCPUリソースが飽和状態にある時にも上昇しますが、CPUが使われていなくてもディスクI/O待ち(割り込み不可能なI/O待ち)のタスクが多いときにも上昇します(注:ネットワークI/O待ちのときは計算に含みませんので上昇しません)。

そのため、実際にCPUが使われているかどうかは、次項の%Cpu(CPU使用率)で確認します。

%Cpu(CPU使用率)の目安

topコマンドのCPU使用率(%Cpu(s)の行)は、システム全体の論理コアの平均活動を示し、CPUが実際にどれだけ忙しいかをCPU時間の割合で表します。

# top出力例
%Cpu(s): 3.1 us, 0.9 sy, 0.0 ni, 95.9 id, 0.0 wa, ...
項目意味
us (User)ユーザープロセスが費やしているCPU時間の割合(niceなし)。
sy (System)カーネルが費やしているCPU時間の割合。
ni (Nice)niceされたユーザープロセスが費やしているCPU時間の割合。
id (Idle)CPUがアイドル(何もしていない)であるCPU時間の割合。
wa (Wait)ディスクI/O(ブロックI/O)待ちにより、CPUがアイドル状態だった時間の割合。*ネットワークI/O待ちは計算に含まれません。

すべての項目を合計すると100%になります。

デフォルトではシステム全体の割合ですが、キーボードの”1″(数字の1)を押すと個別論理コア表示と切り替えることができます。

%Cpu0  :  2.3 us,  1.0 sy,  0.0 ni, 96.3 id,  0.0 wa..
%Cpu1  :  6.1 us,  1.4 sy,  0.0 ni, 92.5 id,  0.0 wa..
...

CPUが計算処理で限界に達しているかを知るには、%id (アイドル)0%に張り付いているかどうかを見ます。この状態では、%usと%syの合計が非常に高い値になっていることが多いため、上記2つはほぼ同義です。

  • %id が継続的に 0% に近い:CPUの処理能力が完全に使い切られています。
  • %us と %sy の合計が高い:CPUが集中的に使われています。

例えば、以下のtop画面では論理コアごとの%Cpuを表示していますが、idがほぼ0%で、usとsyの合計がほぼ100%になっています。これがCPUの処理能力がほぼ使い切られた状態です。

なお、%Cpu(s)は使用状況を把握するには向いていますが、これだけではタスクの待ち行列の有無がわからないため、Load averageと一緒に使うのがおすすめです。

まとめ

Linuxのシステム反応が遅くなっているときはまずLoad averageの値を確認しますが、その値を正しく解釈するためにはまずCPUが何個の物理、論理コアを持っているかを把握する必要があります。

また、Load averageが高い原因はCPUリソースが飽和状態にある時に加え、I/O待ちのこともありますので、どちらが原因かを特定するためには%CPU(s)も確認しましょう。