web-dev-qa-db-ja.com

Linuxのシステムのコア数を知る方法は?

システムのコア数を知りたいので、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

特に、この出力は次のことを示しています。

  • CPU:4
  • ソケットあたりのコア:4
  • CPUファミリ:6

Linuxシステムのコアを示すものはどれですか。

コアの数を伝える他のコマンドはありますか、それとも完全に間違っていると思いますか?

254
Mr ASquare

ソケットとソケットごとのコアを調べる必要があります。この場合、4つのコア(ソケットごとのコア)を持つ1つの物理CPU(ソケット)があります。

124
user1403360

全体像を把握するには、コアごとの 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という用語は、状況によって意味が異なるため、注意が必要です。
251
htaccess

この情報は nproc(1) コマンドで取得できます

$ nproc --all
12

Root権限は必要ありません。

61
Anthony Ananich

答えが混乱しないように、いくつかの単純なコンピュータアーキテクチャの概念を理解する必要があります。

  • Linuxシステムでprocesses( "programs")を実行します。各プロセスは、1つ以上のthreadsで構成されます
  • threadは、個別のシーケンスinstructionsです。 2つのスレッドを並行して実行できます。
  • 命令[〜#〜] cpu [〜#〜]に渡されて実行されます。 CPUには、命令のビットの意味を理解し、それをどうするかを決定するロジックがあります。
  • 指示にはさまざまなタイプがあります。 CPU内の決定ロジックは、異なる命令を異なるハードウェアユニットにディスパッチします。たとえば、算術命令は実際には[〜#〜] alu [〜#〜](算術/論理ユニット)によって実行されますが、メモリからロード/ストアする命令はある種の- メモリユニット

  • coreは、実際の実行ハードウェアのセットを指します(つまり、すべてのコアにALU、メモリユニットなどがあります)。

  • 1つのコアを共有する複数のCPUを持つことができます-これはハイパースレッディングと呼ばれます。

    • アイデア:スレッドAは現在演算を行っており、スレッドBはメモリから何かをロードしています。それが真実である場合、スレッドAとBは、お互いの邪魔をせずに単一のコアを効率的に共有できます(AはALUを使用し、Bはメモリユニットを使用します)。もちろん、両方のプログラムがALUを必要とする場合もあり、その場合はお互いを待たなければなりません...
  • socketは、チップが挿入されるマザーボード上の物理スロットです。このチップには、一定数のコアが搭載されています。

例:

OPの例:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • チップを含む1つの物理ソケット
  • 4つの物理コア(合計4つのALUと4つのメモリユニットを考える)
  • コアに命令を発行できるスレッドは1つだけです(ハイパースレッディングはありません)。つまり、
  • コアごとに1 CPU、または4 * 1 = 4 CPU

もう一つの例:

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の各ペアが異なるタイプの命令を実行しているときにのみ達成されるため、待機せずにコアを共有できます。

23
stochastic

各コアのデータのチャンクを出力するコマンド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つのコアがあります。

14
dr01
getconf _NPROCESSORS_ONLN

(getconfはglibcの一部です)

7
L.R.
$ grep -c processor /proc/cpuinfo
8

それで十分です。ハイパースレッディングがオンかオフかに関係なく、オンラインのコアの数です。

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

別の簡単な方法。

4
jwc
[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
4
reli

私はこの方法を見つけました:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
1
Serge Roussak

@htaccessの回答に情報を追加したいだけです。

CentOS 6.xでは、dmidecodeはコア/スレッド数情報を出力せず、実際には「CPU」を「ソケット」ではなくlscpuの「CPU」または「コア」と見なします。

0
PickBoy