システムのコア数を知りたいので、Googleで同じ質問を検索しました。 lscpu
コマンドなどのコマンドを取得しました。このコマンドを試したところ、次の結果が得られました。
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 23
Stepping: 10
CPU MHz: 1998.000
BogoMIPS: 5302.48
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 2048K
NUMA node0 CPU(s): 0-3
特に、この出力は次のことを示しています。
Linuxシステムのコアを示すものはどれですか。
コアの数を伝える他のコマンドはありますか、それとも完全に間違っていると思いますか?
ソケットとソケットごとのコアを調べる必要があります。この場合、4つのコア(ソケットごとのコア)を持つ1つの物理CPU(ソケット)があります。
全体像を把握するには、コアごとの threads 、ソケットごとの cores 、および sockets の数を調べる必要があります。これらの数値を掛けると、システム上の CPUs の数が得られます。
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
の出力は、lscpu
のCPUカウントに対応しています。上記のデスクトップマシンの場合、これはlscpu
によって報告された8つのCPUと一致する必要があります。
_$ 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
_は、lscpu
によって報告されたCore(s) per socket
に対応します。上記のデスクトップマシンの場合、これは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内の決定ロジックは、異なる命令を異なるハードウェアユニットにディスパッチします。たとえば、算術命令は実際には[〜#〜] alu [〜#〜](算術/論理ユニット)によって実行されますが、メモリからロード/ストアする命令はある種の- メモリユニット。
coreは、実際の実行ハードウェアのセットを指します(つまり、すべてのコアにALU、メモリユニットなどがあります)。
1つのコアを共有する複数のCPUを持つことができます-これはハイパースレッディングと呼ばれます。
socketは、チップが挿入されるマザーボード上の物理スロットです。このチップには、一定数のコアが搭載されています。
OPの例:
CPU(s): 4
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
もう一つの例:
CPU(s): 16
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 2
それぞれが4つの物理コアを持つチップを含む2つの物理ソケット、合計8コア。 2つのスレッドが各コアに命令を発行します(このマシンにはハイパースレッディングがあります)。つまり、各コアに2つのCPUが接続されている必要があり、合計で8 * 2 = 16 CPUになります。
最初のマシンは、任意の時間、期間に正確に4つの命令を実行できます。 2番目のマシンは、いつでも8〜16の命令を実行できます。16は、CPUの各ペアが異なるタイプの命令を実行しているときにのみ達成されるため、待機せずにコアを共有できます。
各コアのデータのチャンクを出力するコマンドcat /proc/cpuinfo
を使用することもできます。各チャンクはこの情報で始まります:
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)
コアには0から始まる番号が付けられているため、この場合のように最後のチャンクがprocessor : 3
を示している場合、マシンには4つのコアがあります。
getconf _NPROCESSORS_ONLN
(getconfはglibcの一部です)
$ grep -c processor /proc/cpuinfo
8
それで十分です。ハイパースレッディングがオンかオフかに関係なく、オンラインのコアの数です。
$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8
別の簡単な方法。
[root@xxxxx ~]# dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
Socket Designation: CPU1
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
Socket Designation: CPU2
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
私はこの方法を見つけました:
echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
@htaccessの回答に情報を追加したいだけです。
CentOS 6.xでは、dmidecodeはコア/スレッド数情報を出力せず、実際には「CPU」を「ソケット」ではなくlscpuの「CPU」または「コア」と見なします。