試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Linux上で認識されるCPU(物理CPU/物理コア/論理CPU)の数の確認について

(2014/9/18)情報を簡単に調べるコマンドについての記述の追加や、認識数の扱いに関する記述の一部追加・調整など内容を修正した。
本記事が書かれた当時のカーネルのバージョンは2.6系だが、3系でも扱いは同様となる。

  1. CPUの認識数を調べる
    1. 使用例
  2. 物理CPU,CPUコア,論理CPUの数の扱い
  3. CPUとそのコア数やスレッド数を簡単に調べるコマンド
  4. 関連:GUIツールによるCPU数やCPUごとの使用率の確認

CPUの認識数を調べる

認識されるCPU(コアや論理CPU含む)が複数存在する場合、その数だけ/proc/cpuinfoの中に「processor:」の行が存在する。
手元のAthlon II X3 445(3コアCPU)では

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

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

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

カーネルが認識するCPU(コアや論理CPU含む)の数が得られる。
(2011/1/31)grep系コマンドの-cオプションを用いると単独で動作することが分かった。

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

使用例

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

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

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

(2011/1/18)認識されるCPU数より1大きい値を使用したい場合には「$(())」もしくはexprで「 + 1」を付けて加算を行ったもの(下の「echo」の右側の部分)で上の「$()」内の内容を置き換える。下は3コアCPUでの出力となる。

$ echo $(($(egrep -c "^processor\s:\s[0-9]+$" /proc/cpuinfo) + 1))
4
$ echo $(expr $(egrep -c "^processor\s:\s[0-9]+$" /proc/cpuinfo) + 1)
4

(2011/1/31)wcを使用しないように修正

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

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

  • physical id
  • core id
  • cpu cores

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

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

「physical id」と「core id」については、値の異なるものが存在する場合はそれが分かれていることになる。手元のAthlon II X3 445では

$ egrep "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で分かれてはいない

ということが分かる。

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

(2014/9/18)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

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

(2011/4/12)GNOMEシステム・モニタのようなシステム状態監視ツールで認識CPU数が確認できる他、それぞれのCPUの使用率が視覚的に表示される。GKrellMでは内蔵機能「CPU」の「オプション」タブで

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

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

関連URL:

使用したバージョン:

  • Linux 2.6.35.8, 3.13.0
  • grep 2.6.3
  • coreutils 8.5
  • システム・モニタ 2.28.1
  • GKrellM 2.3.4