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


231

システムのコア数を知りたいので、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システムのコアを示すものはどれですか?

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


1
すべてのユーザー向けの単純なコマンド:$ grep precessor / proc / cpuinfo | wc -l
สมหวังแนวหน้า

6
テキストの画像はあまり役に立ちません。エディターにコピーすることはできず、インデックスもあまり作成されません。つまり、同じ問題を持つ他のユーザーがここで答えを見つける可能性は低くなります。投稿を編集して、関連するテキストを直接組み込んでください(転写エラーを避けるために、コピーと貼り付けを使用することをお勧めします)。
トビーSpeight

回答:


117

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


1
ソケットが1つあり、ソケットごとに2 cpusであるため、合計2になります。ただし、4 cpusと表示されます。試した場合nproc、4が返されます。使用するcat /proc/cpuinfoと4が得られるため、少なくとも私の状況では、この答えは間違っているようです。
SPRBRN

14
ハイパースレッディングがある場合ではありません。まだ2つの物理コアがありますが、各コアは/ proc / cpuinfoに2回表示されます。coreidの下を注意深く見ると、各coreidが2回リストされていることがわかります。また、フラグの下にhtフラグが表示されます。
user1403360

237

完全な画像を取得するには、コアあたりのスレッド数、ソケットあたりのコア数、およびソケット数を調べる必要があります。これらの数値を掛けると、システム上の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という用語は異なるコンテキストで異なるものを意味するため、注意する必要があります

12
これは受け入れられた答えであるはずです
ガンサブ

2
同意する。主題をよりよく説明するので、これは受け入れられた答えであるべきです。
ラファエル

追加lscpu --all --extendedは便利な追加になると思いますが、これらの特定のマシンにはアクセスできなくなりました。
htaccess

:あなたはまた、awkの明示的な乗算を避けることができますlscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
ヤクブKlinkovský

@JakubKlinkovský、それを指摘してくれてありがとう、しかしこの場合、実際にの乗算を実演したいと思いSocket(s) * Core(s) per socketます。私が言ったことを考えると、何echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))が乗算されているかを人々が正確に見ることができるようになると思います...
htaccess

61

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

$ nproc --all
12

ルート権限は必要ありません。


10
これは誤りです。nprocの出力は、lscpuからのCPUカウントに対応しています。マルチスレッドコアを使用している場合、nprocの出力は、使用しているコアの数と一致しません。
htaccess

2
非ルートソリューションの場合、ハックはtopを使用して1を押すことです。これにより、使用可能なコアの数が表示されます。「使用可能」と表示された理由は、基盤となるハードウェアがクラウドインフラストラクチャのようなコアをより多く備えている可能性があるためです。
ホッピングバニー

@htaccess少なくともUbuntuでは、これは正しい数のオンライン論理CPUを出力します
Wil

1
@htaccess OKわかった。通常、Linux Dufferがコアの数を尋ねる場合、使用可能な論理スレッドの数を意味します。技術的に言えば、Linuxはハードウェアスレッドを「cpus」と呼ぶのは間違っています。マシンには、2つのコアと4つのSMTハードウェアスレッドを備えた1つのCPUがあります。結果としてCPUとコアが意味することには、非常に多くのあいまいさがあります。しかし、私はあなたが今意味するものを得る、ty。
ウィル

1
@Wil yea上記の私の答えでこれを呼び出します:「CPUという用語は、異なるコンテキストで異なるものを意味するため、注意する必要があります」。個人的に、私は「コア」を論理処理ユニットではなく、プロセッサ内の物理コア(つまり、物理処理ユニット)と同一視しています。
htaccess

19

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

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

  • コアは、実際の実行ハードウェアのセットを指す(すなわち、すべてのコアは、ALU、メモリユニットを有しているなど)

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

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

例:

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

2つの物理ソケット。それぞれに4つの物理コアを持つチップが含まれ、合計で8つのコアになります。2つのスレッドが各コアに命令を発行します(このマシンにはハイパースレッディングがあります)。つまり、各コアに2つのCPUが接続されている必要があり、合計で8 * 2 = 16 CPUになります。

最初のマシンは、任意の時間、期間で正確に4つの命令を実行できます。2番目のマシンは、任意の時点で8〜16の命令を実行できます。16は、CPUの各ペアが異なる種類の命令を実行しているときにのみ達成されるため、待機せずにコアを共有できます。


14

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つのコアがあります。


情報を詳細に記述しているこのコマンドに感謝します。:)
ASquare氏15

1行のコマンドの場合、次のように使用できますgrep -c ^processor /proc/cpuinfo
ワイルドカード

5
getconf _NPROCESSORS_ONLN

(getconfはglibcの一部です)


1
これはわずかに異なります(一部のニーズに役立ちます)。現在オンラインになっている(つまり、プロセスの実行に使用できる)プロセッサの数です。1つまたは複数がオフラインになっている場合(休止状態中やプロセッサの追加/削除中など)、CPUの総数より少ない場合があります。
トビースパイト

そしてgetconf _NPROCESSORS_CONF、構成されたプロセッサーの数を取得します。sysconf()関数を使用して、Cソースコード内でこれらのマクロの両方の値を取得することもできます。詳細を入力しman sysconfてください。
ギャラクシー

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

t 4dmidecodeのために何が?カウントと有効な行はどのように増加しますか?あなたの例は2つのコア、または6、12、24、または他の数を示していますか?
Xen2050

@ Xen2050が4あるprocessor参照、linux.die.net/man/8/dmidecodeを。しかし4、引数として使用することは悪い習慣です。
JohnKoch

bash: dmidecode: command not found
キャメロンハドソン

3
$ grep -c processor /proc/cpuinfo
8

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

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

別の簡単な方法。


2
これは簡単ですが、質問に対して正確かどうかはわかりません。彼は、コアの数を尋ねました:(cores!= cpus)ハイパースレッディングが有効になっている場合。私のシステムには24個のコアがあります:ハイパースレッドの場合は48 cpusです。また、設けられた第二のコマンドを使用してls -d /sys/devices/system/cpu/cpu* | wc -l示した49のディレクトリがあるのでcpuidlecpuNのディレクトリが。
アンドリューファラン


0

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

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


これが答えではない場合は、コメントとして追加してください。
雑種

@Mongrelコメントとして追加したかったが、コメントするには50の評価が必要
-PickBoy

-2

CPUファミリはここでは無関係です。

  • CPU =物理ソケット
  • ソケットごとのコア-それが言うように
  • 従ってコアの総数ソケットあたり= CPU(S)*コア(S)

あなたの場合、合計4つのフルコアがあります。

また重要なのは、「コアごとのスレッド」です。しかし、あなたは1を持っているので、あなたの場合ではありません。


1
説明でCPUとソケットを混同しています。
jlliagre

1
jlliagreが言うように、これは間違っています。Cores = Cores per socket X Sockets、私の回答の説明をご覧ください。
-htaccess

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.