このスクリプトはありますが、印刷出力の最後の要素を取得する方法がわかりません。
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最後の要素は、CPUの数から1を引いた数です。
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
を返すでしょう)
/proc/cpuinfo
の内容を処理することは不必要にバロックです。 coreutilsの一部である nproc を使用するので、ほとんどのLinuxインストールで利用可能です。
コマンドnproc
は、現在のプロセスで使用可能な処理装置の数を表示します。これはオンラインプロセッサの数より少ない場合があります。
インストールされているすべてのコア/プロセッサの数を調べるには、nproc --all
を使用します。
私の8コアマシンで:
$ nproc --all
8
私が見つけた最も移植性の高い解決策はgetconf
コマンドです。
getconf _NPROCESSORS_ONLN
これはLinuxとMac OS Xの両方で動作します。他の方法のいくつかに対するこの利点のもう1つの利点は、getconfが長い間使われてきたことです。私が開発しなければならない古いLinuxマシンの中には、利用可能なnproc
やlscpu
コマンドを持っていないものもありますが、getconf
を持っています。
編集者注: getconf
ユーティリティ はPOSIXで義務付けられている ですが、特定の_NPROCESSORS_ONLN
および_NPROCESSORS_CONF
values はそうではありません。そうは言っても、前述のように、彼らはLinuxプラットフォームとmacOSの両方で動作します。 FreeBSD/PC-BSDでは、先頭の_
を省略しなければなりません。
序文:
/proc/cpuinfo
- based answerの問題は、humanの消費を目的とした情報を解析するため、lacks aマシン解析用に設計された安定した形式:出力形式はプラットフォームやランタイム条件によって異なる場合があります。 Linuxではlscpu -p
(macOSではsysctl
を使用)はその問題を回避します。
getconf _NPROCESSORS_ONLN
/getconf NPROCESSORS_ONLN
は、logicalとphysicalCPUを区別しません。
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
MacOS以外のBSD派生システム-たとえばFreeBSD-は、sysctl
のhw.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
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 も参照してください。
これは私のために働きました。 tail -nX
を使用すると、最後のX行だけを取得できます。
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
ハイパースレッディングを持っているなら、これは physical coreの数をつかむために働くべきです。
grep "^core id" /proc/cpuinfo | sort -u | wc -l
物理コアの総数については、
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を使用した以下の非常に優れた回答があります。私はコメントでより簡潔なバージョンを書きました
Pythonも使えます。物理コアの数を取得するには
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
ハイパースレッドコアの数を取得するには
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
実際、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()を使用します。
Linux、MacOS、Windows用のクロスプラットフォームソリューション:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")
LinuxとOS Xで動作するようにこれを行いたい場合は、次のようにします。
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
以下は、ハイパースレッドシステムと非ハイパースレッドシステムの両方における「実際の」コアの数を示しています。少なくとも私のすべてのテストでうまくいった。
awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 }; END { print CORES*P }' /proc/cpuinfo
以下のいずれかの方法を使用して、 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
の出力を解析します。
これが、Linux上でオンラインになっている物理コアの数を数えるための方法です。
lscpu --online --parse=Core,Socket | grep --invert-match '^#' | sort --unique | wc --lines
または要するに:
lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
私はまた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
どのコアがオフラインかを確認します。 online
、offline
、およびpresent
sysfsエントリはCPUSのインデックスを返すので、戻り値0
はコア0を意味するだけで、戻り値1-3
はコア1、2、および3を意味します。
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu を参照してください。
物理コアを数えたいだけであれば、このコマンドは私に代わってそれを行いました。
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)
あなたが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())"
とても簡単です。次のコマンドを使用してください。
lscpu
これはalmsost all Shell で動作します。
ncore=0
while read line ;do
[ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
done </proc/cpuinfo
echo $ncore
4
Shell 、 dash 、 busybox などとの互換性を保つために、((ncore++))
の代わりにncore=$((ncore+1))
を使用しました。
ncore=0
while read -a line ;do
[ "$line" = "processor" ] && ((ncore++))
done </proc/cpuinfo
echo $ncore
4
cat /proc/cpuinfo | grep processor
これはうまくいきました。私が最初の答えを試みたとき、私は出力として3つのCPUを手に入れました。システム上に4つのCPUがあることを私は知っているので、私はプロセッサのためにgrep
をしただけで、出力はこのように見えました:
[root@theservername ~]# cat /proc/cpuinfo | grep processor
processor : 0
processor : 1
processor : 2
processor : 3
要約: 物理CPUを取得する これを行います。
grep 'core id' /proc/cpuinfo | sort -u
physical および logical CPUを取得するには、次のようにします。
grep -c ^processor /proc/cpuinfo
/proc
<<これはあなたがプロセスについて必要な情報の黄金の源です
/proc/cpuinfo
<<は、あらゆるCPU情報の最も重要な情報源です。
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
になります。
コアの詳細を取得するには、以下のクエリを使用してください
[Oracle@orahost](TESTDB)$ grep -c ^processor /proc/cpuinfo
8
私の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
Python 3はそれを得るためのいくつかの簡単な方法も提供します。
$ python3 -c "import os; print(os.cpu_count());"
4
$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"
4