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のコア数を確認するには、いくつかの方法があります。
lscpuコマンドを使用するnprocコマンドを使用する/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)も確認しましょう。
