Linuxの/proc/cpuinfoを初めてまともに読もうとしたのでメモを残しておきます。複数コアを搭載したCPUや、HT(ハイパースレッディング)により、論理プロセッサ数と物理CPU数が一致しないことがよくあります。cpuinfoを読み解いていけば、いずれも判別可能となるようです。
シンプルな構造
下記はあるサーバでcpuinfoを覗いた例です。キーワードはgrepにかけている通りです。まずは生で見てみるのも良いでしょう。コロン以降は私が説明を追記したものです。
# cat /proc/cpuinfo | grep -E "physical id|cpu cores|siblings|processor" | sort | uniq
cpu cores : 4 ←1個の物理CPUに搭載されている"物理"コア数
physical id : 0 ←物理CPU(1個目)
physical id : 1 ←物理CPU(2個目)
processor : 0 ←論理プロセッサ(=合計論理コア数:1個目)
processor : 1 ←論理プロセッサ(=合計論理コア数:2個目)
processor : 2 ←論理プロセッサ(=合計論理コア数:3個目)
processor : 3 ←論理プロセッサ(=合計論理コア数:4個目)
processor : 4 ←論理プロセッサ(=合計論理コア数:5個目)
processor : 5 ←論理プロセッサ(=合計論理コア数:6個目)
processor : 6 ←論理プロセッサ(=合計論理コア数:7個目)
processor : 7 ←論理プロセッサ(=合計論理コア数:8個目)
siblings : 4 ←1個の物理CPUに搭載されている"論理"コア数
上記を読み解くと、本サーバは物理CPUを2個搭載しており、CPUには1個あたり4個の物理コア(合計8個)搭載されていることがわかります。1コアを仮想的に2コアに見せるintelのHTが適用されないCPUであるため、物理コア=論理プロセッサとなっており、前述したとおりシンプルな構成となります。
模式図にしてみました。
シンプルなCPU
HTが有効となっている構造
HTの環境を用意できなかったため、下記の実行結果は手で作りました。現状販売されているモデルでは、あり得ないと思います。また、不整合等あったら申し訳ないです。
# cat /proc/cpuinfo | grep -E "physical id|cpu cores|siblings|processor" | sort | uniq
cpu cores : 1 ←1個の物理CPUに搭載されている"物理"コア数
physical id : 0 ←物理CPU(1個目)
physical id : 1 ←物理CPU(2個目)
processor : 0 ←論理プロセッサ(=合計論理コア数:1個目)
processor : 1 ←論理プロセッサ(=合計論理コア数:2個目)
processor : 2 ←論理プロセッサ(=合計論理コア数:3個目)
processor : 3 ←論理プロセッサ(=合計論理コア数:4個目)
siblings : 2 ←1個の物理CPUに搭載されている"論理"コア数
物理CPUを2個搭載しており、CPUには1個あたり1個の物理コア(合計2個)が搭載されており、HTにより仮想的に2個の論理コア/プロセッサ(合計4個)となることがわかります。ポイントは、cpu coresとsiblingsの差に着目する点です。この場合、物理コア×2=論理プロセッサとなります。
HT有効モデル