web-dev-qa-db-ja.com

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

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

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

最後の要素は、CPUの数から1を引いた数です。

447
Richard
cat /proc/cpuinfo | awk '/^processor/{print $3}' | wc -l

あるいは単に

grep -c ^processor /proc/cpuinfo     

/proc/cpuinfoの "processor"で始まる行数を数えます。

ハイパースレッディングのあるシステムでは、

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

これは(例えば)8を返すはずです(上記のコマンドは16を返すでしょう)

534
unbeli

/proc/cpuinfoの内容を処理することは不必要にバロックです。 coreutilsの一部である nproc を使用するので、ほとんどのLinuxインストールで利用可能です。

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

インストールされているすべてのコア/プロセッサの数を調べるには、nproc --allを使用します。

私の8コアマシンで:

$ nproc --all
8
550
uckelman

私が見つけた最も移植性の高い解決策はgetconfコマンドです。

getconf _NPROCESSORS_ONLN

これはLinuxとMac OS Xの両方で動作します。他の方法のいくつかに対するこの利点のもう1つの利点は、getconfが長い間使われてきたことです。私が開発しなければならない古いLinuxマシンの中には、利用可能なnproclscpuコマンドを持っていないものもありますが、getconfを持っています。

編集者注: getconf ユーティリティ はPOSIXで義務付けられている ですが、特定の_NPROCESSORS_ONLNおよび_NPROCESSORS_CONF values はそうではありません。そうは言っても、前述のように、彼らはLinuxプラットフォームとmacOSの両方で動作します。 FreeBSD/PC-BSDでは、先頭の_を省略しなければなりません。

224
mshildt

序文:

  • /proc/cpuinfo- based answerの問題は、humanの消費を目的とした情報を解析するため、lacks aマシン解析用に設計された安定した形式:出力形式はプラットフォームやランタイム条件によって異なる場合があります。 Linuxではlscpu -p(macOSではsysctlを使用)はその問題を回避します

  • getconf _NPROCESSORS_ONLN/getconf NPROCESSORS_ONLNは、logicalphysicalCPUを区別しません。


LinuxおよびmacOSで動作するsh(POSIX準拠)スニペットは、number of-online-logicalまたはphysicalCPUs;詳細についてはコメントを参照してください。

Linuxではlscpuを使用し、macOSではsysctlを使用します。

用語の注記CPUは、OSから見た最小の処理ユニットを指します。非ハイパースレッディングコアはそれぞれ1つのCPUに対応しますが、ハイパースレッディングコアには複数(通常:2)-論理-CPUが含まれます。
Linuxは、最小単位から始まる次の分類法を使用します。CPU<core<socket<book<node、各レベルは次の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-は、sysctlhw.ncpuキーのみをサポートします。これはmacOSでは非推奨です。新しいキーhw.npuのどれがhw.(logical|physical)cpu_[max]に対応するか不明です。

物理CPUカウントlscpuコマンドの修正を支援してくれた@teambobの秘Tip。

警告lscpu -p出力には「book」列は含まれません(manページでは、分類階層内のソケットとノードの間のエンティティとして「books」に言及しています)。特定のLinuxシステムで「書籍」が動作している場合(いつ、どのように誰が知っているか)、physical-CPU-countコマンドは-report(これは、lscpuが上位レベルのエンティティ全体で一意でないIDを報告するという前提に基づいています;例:2つの異なるソケットからの2つの異なるコア同じIDを持つことができます)。


上記のコードを、たとえばシェルスクリプトcpusとして保存し、chmod +x cpusで実行可能にし、$PATHのフォルダーに配置すると、次のような出力が表示されます。

$ cpus
logical  4
physical 4
85
mklement0

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

https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu も参照してください。

29
Sh4msi

これは私のために働きました。 tail -nXを使用すると、最後のX行だけを取得できます。

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

ハイパースレッディングを持っているなら、これは physical coreの数をつかむために働くべきです。

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

物理コアの総数については、

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を使用した以下の非常に優れた回答があります。私はコメントでより簡潔なバージョンを書きました

8
teambob

Pythonも使えます。物理コアの数を取得するには

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

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

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

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

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

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

pythonでこれが必要な場合は、osモジュールをインポートすることでgetconfが使用するsyscallを使用できます。

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

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

7
mmu_man

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

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

LinuxとOS Xで動作するようにこれを行いたい場合は、次のようにします。

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

以下は、ハイパースレッドシステムと非ハイパースレッドシステムの両方における「実際の」コアの数を示しています。少なくとも私のすべてのテストでうまくいった。

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

以下のいずれかの方法を使用して、 physical 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の出力を解析します。

3
Six

これが、Linux上でオンラインになっている物理コアの数を数えるための方法です。

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

または要するに:

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

私はまた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、およびpresent sysfsエントリはCPUSのインデックスを返すので、戻り値0はコア0を意味するだけで、戻り値1-3はコア1、2、および3を意味します。

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

2
Aman Manchanda

物理コアを数えたいだけであれば、このコマンドは私に代わってそれを行いました。

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

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

"core id"が利用できない場合( "ラズベリー"のように) "プロセッサ"カウントにフォールバックしてawkを使って "physical id"メソッドごとに "core 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
Totaly FuRy

あなたがPythonを使うことができるのであれば、 numexpr moduleにこのための関数があります。

In [5]: import numexpr as ne

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

またこれ:

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

コマンドPromptからこの情報を問い合わせるには:

# 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() functionからこの情報を取得することも可能です。

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

あるいはもっと単純に os.cpu_count() を使ってください。

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

とても簡単です。次のコマンドを使用してください。

lscpu
1
bhanu mantri

より速く、フォークなし

これはalmsost all Shell で動作します。

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

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

bash version

ncore=0
while read -a line ;do
    [ "$line" = "processor" ] && ((ncore++))
  done </proc/cpuinfo
echo $ncore
4
1
F. Hauri
cat /proc/cpuinfo | grep processor

これはうまくいきました。私が最初の答えを試みたとき、私は出力として3つのCPUを手に入れました。システム上に4つのCPUがあることを私は知っているので、私はプロセッサのためにgrepをしただけで、出力はこのように見えました:

[[email protected] ~]# cat /proc/cpuinfo | grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3
1
Gary Liggons

要約: 物理CPUを取得する これを行います。

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

physical および logical CPUを取得するには、次のようにします。

grep -c ^processor /proc/cpuinfo

/proc <<これはあなたがプロセスについて必要な情報の黄金の源です

/proc/cpuinfo <<は、あらゆるCPU情報の最も重要な情報源です。

0
syed
 dmidecode  | grep -i cpu | grep Version

私にくれ

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

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

これは正しいソケット数です - E5-2667を調べると、各ソケットに8 coresがあることがわかります。したがって、16 coresをまたいで2 socketsになります。

lscpuが私に20 CPUsを与えるところ - これは全く間違っています - なぜかわかりません。 (同じことがcat /proc/cpuについても言えます - 結局20になります。

0
Hank42

コアの詳細を取得するには、以下のクエリを使用してください

[[email protected]](TESTDB)$ grep -c ^processor /proc/cpuinfo
8
0
Srikant Patra

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

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

0
Chaim Geretz

Python 3はそれを得るためのいくつかの簡単な方法も提供します。

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

4

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

4

0
Lê Tư Thành