Linux上で認識されるCPU(物理CPU/物理コア/論理CPU)数を確認

Last modified: 2021-10-06

CPUの認識数を調べる

認識されるCPU(コアや論理CPU含む)が複数存在する場合、その数だけ/proc/cpuinfoの中にprocessor:の行が存在する。

手元のAthlon II X3 445(3コアCPU)では

$ grep -E "^processor\s:\s[0-9]+\$" /proc/cpuinfo
processor       : 0
processor       : 1
processor       : 2

このようになる。この出力の行数(改行数)を-lオプション付きのwcコマンドで調べると

$ grep -E "^processor\s:\s[0-9]+\$" /proc/cpuinfo | wc -l
3

カーネルが認識するCPU(コアや論理CPU含む)の数が得られる。

grep系コマンドの-cオプションを用いると同じ結果を単独で取得できる。

$ grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo
3

CPU数を自動検出してコマンドのオプション指定などで使用

プロセスの並列実行数など、コマンドのオプションとしてCPU数を用いる場面は色々あるので、前述した数を渡すように記述することで、最適な指定をハードウェア環境によらない表現で記述できる。

(makeコマンドの同時実行ジョブ数指定)
$ make -j $(grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo)

(sconsコマンドの同時実行ジョブ数指定)
$ scons -j $(grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo)

(FFmpegのスレッド数指定)
$ ffmpeg -threads $(grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo) [オプションや引数...]

FFmpegでは-threads 0指定によりスレッド数を自動で決まるようにでき、他のプログラムでも、スレッド数や並列実行数として0を指定することで自動検出された数を使用できるものがある。

認識されるCPU数より1だけ大きい値を使用したい場合には$(( ))またはexpr + 1を付けて加算を行ったもの(下のechoの右側の部分)で上の$( )内の内容を置き換える。

下は3コアCPUでの出力となる。

($(( ... )) で記述する例)
$ echo $(($(grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo) + 1))
4

(exprを用いる例)
$ echo $(expr $(grep -E -c "^processor\s:\s[0-9]+\$" /proc/cpuinfo) + 1)
4

物理CPU,CPUコア,論理CPUの数の扱い

Linuxでは物理CPU,CPUコア,論理CPUの構成は/proc/cpuinfoから確認できる。この中には、processor以外に

  • physical id
  • core id
  • cpu cores

といった項目があり、以下のようになる。

  • 同一の物理CPU(CPUソケット単位)ではphysical idの値が同じ(異なる値のものは物理CPUが分かれている)
  • core idはどのCPUコアかを示す値で、SMTが有効なAMDのZen系CPU/APUやHyper Threading Technology (HTTもしくはHT)が有効なIntel製CPUにおいてcore idが同一でprocessorが異なる2つの項目は物理コアが同じな論理CPUどうし
  • cpu coresの値は物理コアの数となる(ただし、AMD製のBulldozer系CPU/APUではコア2つ分のまとまりである “モジュール” 単位で数える)

physical idcore idについては、値の異なるものが存在する場合はそれが分かれていることになる。

Athlon II X3 445での情報

$ grep -E "processor|model name|physical id|core id|cpu cores|^\$" /proc/cpuinfo
processor       : 0
model name      : AMD Athlon(tm) II X3 445 Processor
physical id     : 0
core id         : 0
cpu cores       : 3

processor       : 1
model name      : AMD Athlon(tm) II X3 445 Processor
physical id     : 0
core id         : 1
cpu cores       : 3

processor       : 2
model name      : AMD Athlon(tm) II X3 445 Processor
physical id     : 0
core id         : 2
cpu cores       : 3
  • 物理CPUは全て同一(physical idの値が0)
  • 物理コアは3つ(cpu coresの値が3)
  • 認識されているCPU数(processorの行の数)とコア数(cpu coresの値)が一致し、また、core idの値がprocessorの値と対応していることから、論理CPUで分かれてはいない

Athlon 220GEでの情報

$ grep -E "processor|model name|physical id|core id|cpu cores|^\$" /proc/cpuinfo
processor	: 0
model name	: AMD Athlon 220GE with Radeon Vega Graphics
physical id	: 0
core id		: 0
cpu cores	: 2

processor	: 1
model name	: AMD Athlon 220GE with Radeon Vega Graphics
physical id	: 0
core id		: 1
cpu cores	: 2

processor	: 2
model name	: AMD Athlon 220GE with Radeon Vega Graphics
physical id	: 0
core id		: 0
cpu cores	: 2

processor	: 3
model name	: AMD Athlon 220GE with Radeon Vega Graphics
physical id	: 0
core id		: 1
cpu cores	: 2
  • 物理CPUは全て同一(physical idの値が0)
  • 物理コアは2つ(cpu coresの値が2)
  • 論理CPUは物理コアごとに2つ(core idの値が0processorが2つあり、1のものが2つ)

CPUとそのコア数やスレッド数を簡単に調べるコマンド

util-linuxという基本ツール群に含まれるlscpuコマンドでは

  • 認識CPU数
  • コアあたりのスレッド数
  • 物理CPU(CPUソケット)あたりのコア数

などの情報を簡単に表示できる。

下は手元のAthlon II X3 445での例。CPU MHzの部分は動作クロックによって変わる。

(通常の出力)
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                3
On-line CPU(s) list:   0-2
コアあたりのスレッド数:1
ソケットあたりのコア数:3
Socket(s):             1
NUMAノード:         1
ベンダーID:        AuthenticAMD
CPUファミリー:    16
モデル:             5
ステッピング:    3
CPU MHz:               3100.000
BogoMIPS:              6186.68
仮想化:             AMD-V
L1d キャッシュ:   64K
L1i キャッシュ:   64K
L2 キャッシュ:    512K
NUMA node0 CPU(s):     0-2

(解析してプログラムなどで使うのに便利な出力形式)
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2
0,0,0,0,,0,0,0
1,1,0,0,,1,1,1
2,2,0,0,,2,2,2

Athlon 220GEではコア数とスレッド数関係の表示が以下のようになっている。

コアあたりのスレッド数:              2
ソケットあたりのコア数:              2

関連:GUIツールによるCPU数やCPUごとの使用率の確認

GNOMEの “システムモニター” のようなシステム状態監視ツールで認識CPU数が確認できる他、各CPU(論理含む個別のもの)の使用率が視覚的に表示される。GKrellMでは内蔵機能 “CPU” の “オプション” タブで

  • “CPU のグラフを表示する” にチェック
  • “SMP グラフの選択” で “実際の CPU” “合成と実際"のいずれかを選択

という設定をするとCPUごとにCPU使用率グラフが表示される。