コマンドラインからLinuxのCPU /コアの数を取得する方法


540

このスクリプトはありますが、出力の最後の要素を取得する方法がわかりません。

cat /proc/cpuinfo | awk '/^processor/{print $3}'

最後の要素は、CPUの数から1を引いたものでなければなりません。


9
あなたはする必要はありませんcat前にawkとにかく、:ちょうどawk '<script>' /proc/cpuinfo、そのよう:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo。そして、あなたは「マイナス1」なしで入ります。
Tomasz Gandor 2014

質問に直接回答するtail -n 1には、最後の行を受け取り、それを出力するパイプを使用します。
ファビオ・サントス

unix.stackexchange.com/q/564494/5132も参照してください。
JdeBP

回答:


659
grep -c ^processor /proc/cpuinfo     

で「プロセッサ」で始まる行数をカウントします /proc/cpuinfo

ハイパースレッディングを備えたシステムの場合は、

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}' 

これは(たとえば)を返します(8上記のコマンドはを返します16


42
ハイパースレッディング(P4、Core i7など)を備えたシステムを使用している場合、これらの両方が実際に存在するコアの2倍の数になることに注意してください。
duskwuff -inactive-

24
@duskwuff:ほとんどの場合、まさにこれが必要です。
Frank Kusters 2013年

8
grep -c '^processor' /proc/cpuinfozshで。
Steven Lu

40
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1また、CPU番号が0ベースの場合、間違った番号を返します。
Phazor

3
最初の行は、既存のものより1コア少ない数を返します。より良い猫/ proc / cpuinfo | awk '/ ^ processor / {print $ 3}' | wc -l
Mirko Ebert

650

のコンテンツの処理/proc/cpuinfoは不必要にバロックです。coreutilsの一部であるnprocを使用するので、ほとんどのLinuxインストールで使用できるはずです。

コマンドnprocは、現在のプロセスで使用可能な処理ユニットの数を出力します。これは、オンラインプロセッサの数より少ない場合があります。

インストールされているすべてのコア/プロセッサの数を見つけるには nproc --all

私の8コアマシン:

$ nproc --all
8

8
仮想コアと物理コアを区別しますか?
Richard

12
物理コアの数が必要な場合、これはハイパースレッディングでは機能しません。クアッドコアi7ボックスで8を返します。
プラトナラ2013

1
@pratnala- teambobの答えは、物理コアの数を提供することを目的としています。
Nick Chammas 2014年

1
私の古いubuntu(10.10)では、nprocを使用できません。それは、新しさを加えたものでなければなりません。
bukzor 2014年

3
残念ながら、nprocboot2dockerの一部ではありません
kgadek

269

私が見つけた最もポータブルなソリューションは次のgetconfコマンドです:

getconf _NPROCESSORS_ONLN

これはLinuxとMac OS Xの両方で機能します。他のいくつかのアプローチに対するこの利点のもう1つは、getconfが長い間使用されていることです。私が開発をしなければならない古いLinuxマシンの中には、nprocor lscpuコマンドが利用できないものもありますが、がありgetconfます。

編集者注:ながらユーティリティは、 POSIXによって義務付けられている、具体的かつ値がありません。とはいえ、前述のように、これらはLinuxプラットフォームとmacOSで動作します。FreeBSD / PC-BSDでは、先頭のを省略する必要があります。getconf _NPROCESSORS_ONLN_NPROCESSORS_CONF _


11
これは、Red Hat Entreprise Linux 5.4、Centos 6.5&7、およびMac OSX 10.9(Mavericks)で動作しました。これらのシステムにはデフォルトでlscpuがインストールされていないため、これは最も移植性が高いようです。ありがとう!
big_gie 14

1
同意する。これは非常に移植性があります。
bukzor 2014年

8
移植性が高いのでPOSIXにあります:) pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html
BCran

1
@BCran _NPROCESSORS_ONLNPOSIXでは見つかりませんでした。リンクできますか?
Ciro Santilli郝海东冠状病六四事件法轮功

3
@CiroSantilli六四事件法轮功纳米比亚威视からgithub.com/gstrauss/plasma/blob/master/plasma_sysconf.c私が間違っていたように見えます:それが唯一のオプションです。「sysconf _SC_NPROCESSORS_ONLNおよび_SC_NPROCESSORS_CONFは標準では必要ありませんが、多くのUNIXプラットフォームで提供されており、Open Groupによってオプションとして文書化されています。」
BCran、2015年

100

序文:

  • ベースの回答問題は、/proc/cpuinfo人間が消費するための情報を解析するため、マシンの解析用に設計された安定した形式欠けていることです。出力形式はプラットフォームやランタイム条件によって異なる可能性があります。Linux(およびmacOS)で使用lscpu -pするとsysctl、その問題を回避できます

  • getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLN論理 CPU と物理 CPUを区別しません。


LinuxとmacOSで動作するsh(POSIX準拠の)スニペットを以下に示しますオンラインの論理 CPU または物理 CPUのを決定します。詳細についてはコメントを参照してください。

lscpuLinuxおよびsysctlmacOSで使用します。

用語の注記CPUは、OSから見た最小の処理装置を指します。非ハイパースレッディングコアはそれぞれ1 CPUに対応しますが、ハイパースレッディングコアは複数(通常:2)-論理-CPUを含みます。
Linuxは最小単位から始めて、次の分類法[1]を使用します
。CPU < コア < ソケット < < ノード <
各レベルは、次に低いレベルの1つ以上のインスタンスで構成されます。

#!/bin/sh

# macOS:           Use `sysctl -n hw.*cpu_max`, which returns the values of 
#                  interest directly.
#                  CAVEAT: Using the "_max" key suffixes means that the *maximum*
#                          available number of CPUs is reported, whereas the
#                          current power-management mode could make *fewer* CPUs 
#                          available; dropping the "_max" suffix would report the
#                          number of *currently* available ones; see [1] below.
#
# Linux:           Parse output from `lscpu -p`, where each output line represents
#                  a distinct (logical) CPU.
#                  Note: Newer versions of `lscpu` support more flexible output
#                        formats, but we stick with the parseable legacy format 
#                        generated by `-p` to support older distros, too.
#                        `-p` reports *online* CPUs only - i.e., on hot-pluggable 
#                        systems, currently disabled (offline) CPUs are NOT
#                        reported.

# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
  # Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, 
  # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.logicalcpu_max || 
                       lscpu -p | egrep -v '^#' | wc -l)

# Number of PHYSICAL CPUs (cores).
  # Linux: The 2nd column contains the core ID, with each core ID having 1 or
  #        - in the case of hyperthreading - more logical CPUs.
  #        Counting the *unique* cores across lines tells us the
  #        number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.physicalcpu_max ||
                       lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)

# Print the values.
cat <<EOF
# of logical CPUs:  $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF

[1] macOSのsysctl (3)ドキュメント

macOS以外のBSD派生システム(FreeBSD など)は、macOSでは非推奨であるのhw.ncpuキーのみをサポートすることに注意してくださいsysctl。新しいキーのどれにhw.npu対応するかは不明です:hw.(logical|physical)cpu_[max]

physical-CPU-count lscpuコマンドの修正に役立つ@teambobのヒント。

警告lscpu -p出力には「book」列が含まれていません(このmanページでは、分類階層のソケットとノードの間のエンティティとして「books」について言及しています)。「本は」与えられたLinuxシステム上でプレイしている場合は(誰でも知っていたときに、どのように?)、物理CPU-countコマンドがあり -report(これは仮定に基づいているlscpu非ユニークであるレポートのIDが高い間レベルのエンティティ ;例:2つの異なるソケットの2つの異なるコアが同じIDを持つ可能性があります)。


あなたがいる場合、シェルスクリプト、たとえば上記のようにコードを保存cpus、とそれが実行可能にchmod +x cpusして入れてフォルダ内の自分の中に$PATH、次のような出力が表示されます:

$ cpus
logical  4
physical 4

[1] Xaekai本の内容に光を当てています:「は、CPUソケット、RAMソケット、エッジに沿ったIO接続、および冷却システム統合用のフックを備えた回路基板を収容するモジュールです。これらはIBMメインフレームで使用されます。詳細情報:http : //ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "


1
はい、申し訳ありませんが、sortコマンドについて正しいです。lscpuマニュアル以外の本に関する情報は見つかりません。NUMA en.wikipedia.org/wiki/Non-uniform_memory_accessに
teambob

2
ここでのほとんどのソリューションは、これとは異なり、マルチソケットマシンを無視すると思います。ありがとう!
dividebyzero 2018年

1
Linuxに関しては、インストーラーイメージなど、lscpuを使用できない多くのコンテキストがあります。私はそれが好きです。
ブライアンクリスマン

43

lscpu CPUアーキテクチャ情報を/ proc / cpuinfonから人間が読み取り可能な形式で収集します。

# lscpu


Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              7
CPU MHz:               1866.669
BogoMIPS:              3732.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7

/unix/468766/understanding-output-of-lscpuも参照してください


13

これでうまくいきました。tail -nX最後のX行のみを取得できます。

cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1

ハイパースレッディングがある場合、これは物理コアの数を取得するために機能するはずです。

grep "^core id" /proc/cpuinfo | sort -u | wc -l

1
物理コアの合計の「^ core id」ですか、または1つのプロセッサーのpコアだけですか?
リチャード

1
システムの一意の物理コアごとに1つのコアID行があります。ただし、2番目の物理プロセッサの数値がゼロから始まるかどうかはわかりませんが...
lunixbochs

1
複数の物理プロセッサがある場合は、「物理ID」も確認する必要があります。
アン

最初の行は私にとってはうまくいきませんでした。これでうまくいきます。cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -l正しい番号が表示されます。
jaylweb 2017

11

物理コアの総数:

grep '^core id' /proc/cpuinfo |sort -u|wc -l

複数ソケットマシン(または常に)では、上記の結果にソケット数を掛けます。

echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1)+1))

@ mklement0は、lscpuを使用して以下のかなり良い答えを持っています。私はコメントでより簡潔なバージョンを書きました


10

Pythonも使用できます。物理コアの数を取得するには:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4

ハイパースレッドコアの数を取得するには:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8

Python 2.7.15では、これらのコマンドは何も出力しません。REPLではそうします。
Vytenis Bivainis 2018

1
@VytenisBivainisありがとう、私は私の答えを修正しました!
ostrokach

9

Linux、MacOS、Windows向けのクロスプラットフォームソリューション:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")

9

Linuxでオンラインになっている物理コアの数を数える方法は次のとおりです。

lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines

要するに:

lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l

例(1ソケット):

> lscpu
...
CPU(s):                28
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             1
....
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14

例(2ソケット):

> lscpu
...
CPU(s):                56
Thread(s) per core:    2
Core(s) per socket:    14
Socket(s):             2
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28

例(4ソケット):

> lscpu
...
CPU(s):                64
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             4
...
> lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32

複数のソケットで機能および処理
jbo5112

これが最良の答えです。
Jorma Rebane、

7

getconfの使用は確かに最も移植性の高い方法ですが、変数はBSDとLinuxではgetconfで異なる名前になっているため、この要旨が示唆するように、両方をテストする必要があります:https : //gist.github.com/jj1bdx/5746298 ( kshを使用したSolaris修正)

私は個人的に使用します:

$ getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1

そして、これをpythonで必要な場合は、osモジュールをインポートして、sysconf getconfが使用するだけです。

$ python -c 'import os; print os.sysconf(os.sysconf_names["SC_NPROCESSORS_ONLN"]);'

についてはnproc、GNU Coreutilsの一部であるため、デフォルトではBSDでは使用できません。他のいくつかのメソッドの後に同様にsysconf()を使用します。


6

LinuxとOS Xで機能するようにこれを行う場合は、次のようにできます。

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)

私の場合、これはハイパースレッドの数を返します。物理コアの数とソケットの数も知る必要があります。
user2465201

OK-hw.physicalcpuを使用したまったく同じコマンドでコア数が得られます。ソケット数についてはまだわかりません...「論理」と「アクティブ」のCPU数もありますが、それが何を意味するのかはわかりません。
user2465201

クイックアップデート-これはそれほど移植性がないようです。Linuxボックスで試してみたところ、/ procディレクトリを読み取っているように見えます。これは、LinuxシステムではMacとはすべて異なります。たとえば、hwサブディレクトリはありません。そうは言っても、/ proc / cpuinfoを解析することができます
user2465201


3

次のいずれかの方法を使用して、物理 CPUコアの数を決定できます。

  • 一意のコアIDの数を数えます(とほぼ同じですgrep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l)。

    awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo

  • 「ソケットあたりのコア」の数にソケットの数を掛けます。

    lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'

  • Linuxカーネルで使用される一意の論理CPUの数を数えます。この-pオプションは、解析が容易な出力を生成し、以前のバージョンのと互換性がありlscpuます。

    lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'


他の人が言ったことを繰り返すために、関連するプロパティがいくつかあります。

利用可能なプロセッサの数を確認するには:

getconf _NPROCESSORS_ONLN
grep -cP '^processor\t' /proc/cpuinfo

使用可能なプロセッシングユニットの数を決定するため(コアの数と同じである必要はありません)。これはハイパースレッディング対応です。

nproc

私はうさぎの穴の奥まで行きたくありませんが、を介して(単に利用可能な/オンラインのプロセッサではなく)構成されたプロセッサの数を決定することもできますgetconf _NPROCESSORS_CONF。CPUの合計数(オフラインとオンライン)を確認するには、の出力を解析しますlscpu -ap


これは、物理コアが必要な場合の正解です。
Dinesh

3

私もcat /proc/cpuinfo正しい答えが得られると思いましたが、最近、ARMクアッドコアのCortex A53システムはシングルコアしか表示しないことがわかりました。/ proc / cpuinfoはアクティブなコアのみを表示するようですが、

cat /sys/devices/system/cpu/present

そこにあるもののより良い尺度です。あなたもすることができます

cat /sys/devices/system/cpu/online

オンラインのコアを確認する

cat /sys/devices/system/cpu/offline

オフラインになっているコアを確認します。onlineoffline、およびpresentSYSFSエントリは、CPUのインデックスを返すので、戻り値0の戻り値一方だけ手段コア0、1-3手段コア1,2、および3。

https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpuを参照してください


2

以下は、ハイパースレッドシステムと非ハイパースレッドシステムの両方での「実際の」コアの数を示します。少なくともそれは私のすべてのテストで機能しました。

awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 };  END { print CORES*P }' /proc/cpuinfo

-1は0、Opteron 4170 HEを搭載したシングルコアで戻り4ますが、Opteron 3280を搭載した8コアボックスで戻ります。
zamnuts 2014

1

私のWebページではありませんが、http: //www.ixbrian.com/blog/?p = 64&cm_mc_uid = 89402252817914508279022&cm_mc_sid_50200000 = 1450827902 からのこのコマンドは、centosではうまく機能します。ハイパースレッディングが有効な場合でも、実際のCPUが表示されます。

cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l


+1、「lscpu -p = Core、Socket」を使用したソリューションよりも長いが、/ proc / cpuinfoを直接解析して機能するため、lscpuは不要。
Fravadona

1

「コアID」が使用できない場合(ラズベリーなど)は、「プロセッサー」カウントでawkを使用して「物理ID」メソッドごとに「コアID」をカウントします。

echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }' /proc/cpuinfo)

1
cat /proc/cpuinfo | grep processor

これはうまくいきました。最初の回答を試したところ、出力として3つのCPUが得られました。私はシステムに4つのCPUがあることを知っているのでgrep、プロセッサに対してforを実行すると、出力は次のようになります。

[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

1
 dmidecode  | grep -i cpu | grep Version

くれます

バージョン:Intel(R)Xeon(R)CPU E5-2667 v4 @ 3.20GHz

バージョン:Intel(R)Xeon(R)CPU E5-2667 v4 @ 3.20GHz

どちらが正しいソケット数である-見上げE5-2667各ソケットが持っている私に語った8 coresので、乗算、およびで終わる16 cores2 sockets

どこlscpuに私を与えます20 CPUs-これは完全に間違っています-理由はわかりません。(同じことが当てはまるcat /proc/cpu-で終わる20


1

より速く、フォークなし

これはすべてのalmsostで動作します

ncore=0
while read line ;do
    [ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
  done </proc/cpuinfo
echo $ncore
4

と互換性を保つために その他、ncore=$((ncore+1))代わりに使用しました((ncore++))

バージョン

ncore=0
while read -a line ;do
    [ "$line" = "processor" ] && ((ncore++))
  done </proc/cpuinfo
echo $ncore
4


1

Pythonを使用できる場合は、numexprモジュールに次の関数があります。

In [5]: import numexpr as ne

In [6]: ne.detect_number_of_cores()
Out[6]: 8

これも:

In [7]: ne.ncores
Out[7]: 8

コマンドプロンプトからこの情報を照会するには、次のコマンドを使用します。

# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8

または単にmultiprocessing.cpu_count()関数からこの情報を取得することが可能です

$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"

またはさらに簡単に使用する os.cpu_count()

$ python -c "import os; print(os.cpu_count())"

1
これをPythonのコマンドとして機能させる方法はありますか?たとえば、python -m numexpr.ncoresを試しましたが、うまくいきません。
MonsieurBeilto

1
@MonsieurBeilto更新された回答をご覧ください!
kmario23

によって返されるカウントcpu_countは間違っています。コアの数は返されませんが、Intel CPUのハイパースレッドの数が返されるだけです
Antti Haapala

1

物理コアを数えるだけの場合は、このコマンドで計算できます。

lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w

かなり基本的ですが、論理的な数を無視して、実際の物理コアを数えるようです


0

Python 3には、いくつかの簡単な方法も用意されています。

$ python3 -c "import os; print(os.cpu_count());"

4

$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"

4


これは、それぞれに2つのスレッドを持つ4つのコアがある場合、8を返します...
Antti Haapala


0

概要:物理CPUを取得するには、次のようにします。

grep 'core id' /proc/cpuinfo | sort -u

物理および論理 CPU を取得するには、次のようにします。

grep -c ^processor /proc/cpuinfo

/proc <<これは、プロセスおよび

/proc/cpuinfo <<は、あらゆるCPU情報の根源です。


物理CPUカウントは、マルチソケットコンピュータでは機能しません。そのためには、各「コアID」をその「物理ID」に関連付ける必要があります。
Fravadona
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.