完全な画像を取得するには、コアあたりのスレッド数、ソケットあたりのコア数、およびソケット数を調べる必要があります。これらの数値を掛けると、システム上のCPUの数が得られます。
CPU =コアあたりのスレッドXソケットあたりのコアXソケット
CPUは、実行時に表示されるものですhtop
(これらは物理CPUと同じではありません)。
デスクトップマシンの例を次に示します。
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
そしてサーバー:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
の出力はnproc
からのCPUカウントに対応しlscpu
ます。上記のデスクトップマシンの場合、これは次によって報告される8つのCPUと一致する必要がありますlscpu
。
$ nproc --all
8
の出力は/proc/cpuinfo
この情報と一致する必要があります。たとえば、上記のデスクトップシステムでは、8つのプロセッサ(CPU)と4つのコア(コアID 0〜3)があることがわかります。
$ grep -E 'processor|core id' /proc/cpuinfo
processor : 0
core id : 0
processor : 1
core id : 0
processor : 2
core id : 1
processor : 3
core id : 1
processor : 4
core id : 2
processor : 5
core id : 2
processor : 6
core id : 3
processor : 7
core id : 3
cpu cores
報告/proc/cpuinfo
への対応Core(s) per socket
によって報告lscpu
。上記のデスクトップマシンの場合、これはlscpuによって報告されるソケットごとの4つのコアと一致する必要があります。
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
具体的に質問に答えるには、ソケットあたりのコア数にソケット数を掛けて、コア数を伝えます。
コア=ソケットごとのコアXソケット
デスクトップの上のサンプルシステムでは、4つのコアがあります。
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
サーバーには16個ありますが、
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
別の便利なユーティリティはdmidecode
、ソケットごとの情報を出力するものです。上記のサーバーシステムの場合、ソケットごとに8コア、ソケットごとに16スレッドが表示されます。
$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
Socket Designation: CPU1
Core Count: 8
Thread Count: 16
Socket Designation: CPU2
Core Count: 8
Thread Count: 16
このlscpu
コマンドには、チェックアウトしたい便利なオプションがいくつかあります。例えば:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
詳細man lscpu
をご覧ください。
要約すれば:
- ソケット、コア、スレッドに注意する必要があります
- CPUという用語は異なるコンテキストで異なるものを意味するため、注意する必要があります