認識される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数を用いる場面は色々あるので、前述した数を渡すように記述することで、最適な指定をハードウェア環境によらない表現で記述できる。
(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
Linuxでは物理CPU,CPUコア,論理CPUの構成は/proc/cpuinfo
から確認できる。この中には、processor
以外に
physical id
core id
cpu cores
といった項目があり、以下のようになる。
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 id
とcore id
については、値の異なるものが存在する場合はそれが分かれていることになる。
$ 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
physical id
の値が0
)cpu cores
の値が3
)processor
の行の数)とコア数(cpu cores
の値)が一致し、また、core id
の値がprocessor
の値と対応していることから、論理CPUで分かれてはいない$ 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
physical id
の値が0
)cpu cores
の値が2
)core id
の値が0
のprocessor
が2つあり、1
のものが2つ)util-linux
という基本ツール群に含まれるlscpu
コマンドでは
などの情報を簡単に表示できる。
下は手元の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
GNOMEの “システムモニター” のようなシステム状態監視ツールで認識CPU数が確認できる他、各CPU(論理含む個別のもの)の使用率が視覚的に表示される。GKrellMでは内蔵機能 “CPU” の “オプション” タブで
という設定をするとCPUごとにCPU使用率グラフが表示される。
関連URL
/proc/cpuinfo
を含む/proc/cpuinfo
を含む使用したバージョン