このスクリプトはありますが、出力の最後の要素を取得する方法がわかりません。
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最後の要素は、CPUの数から1を引いたものでなければなりません。
tail -n 1
には、最後の行を受け取り、それを出力するパイプを使用します。
このスクリプトはありますが、出力の最後の要素を取得する方法がわかりません。
cat /proc/cpuinfo | awk '/^processor/{print $3}'
最後の要素は、CPUの数から1を引いたものでなければなりません。
tail -n 1
には、最後の行を受け取り、それを出力するパイプを使用します。
回答:
grep -c ^processor /proc/cpuinfo
で「プロセッサ」で始まる行数をカウントします /proc/cpuinfo
ハイパースレッディングを備えたシステムの場合は、
grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}'
これは(たとえば)を返します(8
上記のコマンドはを返します16
)
grep -c '^processor' /proc/cpuinfo
zshで。
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
また、CPU番号が0ベースの場合、間違った番号を返します。
のコンテンツの処理/proc/cpuinfo
は不必要にバロックです。coreutilsの一部であるnprocを使用するので、ほとんどのLinuxインストールで使用できるはずです。
コマンドnproc
は、現在のプロセスで使用可能な処理ユニットの数を出力します。これは、オンラインプロセッサの数より少ない場合があります。
インストールされているすべてのコア/プロセッサの数を見つけるには nproc --all
私の8コアマシン:
$ nproc --all
8
nproc
boot2dockerの一部ではありません
私が見つけた最もポータブルなソリューションは次のgetconf
コマンドです:
getconf _NPROCESSORS_ONLN
これはLinuxとMac OS Xの両方で機能します。他のいくつかのアプローチに対するこの利点のもう1つは、getconfが長い間使用されていることです。私が開発をしなければならない古いLinuxマシンの中には、nproc
or lscpu
コマンドが利用できないものもありますが、がありgetconf
ます。
編集者注:ながらユーティリティは、 POSIXによって義務付けられている、具体的かつ値がありません。とはいえ、前述のように、これらはLinuxプラットフォームとmacOSで動作します。FreeBSD / PC-BSDでは、先頭のを省略する必要があります。getconf
_NPROCESSORS_ONLN
_NPROCESSORS_CONF
_
_NPROCESSORS_ONLN
POSIXでは見つかりませんでした。リンクできますか?
序文:
ベースの回答の問題は、/proc/cpuinfo
人間が消費するための情報を解析するため、マシンの解析用に設計された安定した形式が欠けていることです。出力形式はプラットフォームやランタイム条件によって異なる可能性があります。Linux(およびmacOS)で使用lscpu -p
するとsysctl
、その問題を回避できます。
getconf _NPROCESSORS_ONLN
/ getconf NPROCESSORS_ONLN
は論理 CPU と物理 CPUを区別しません。
LinuxとmacOSで動作するsh
(POSIX準拠の)スニペットを以下に示します。オンラインの論理 CPU または物理 CPUの数を決定します。詳細についてはコメントを参照してください。
lscpu
Linuxおよびsysctl
macOSで使用します。
用語の注記: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
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 "
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
これでうまくいきました。tail -nX
最後のX行のみを取得できます。
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
ハイパースレッディングがある場合、これは物理コアの数を取得するために機能するはずです。
grep "^core id" /proc/cpuinfo | sort -u | wc -l
cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -l
正しい番号が表示されます。
Pythonも使用できます。物理コアの数を取得するには:
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
ハイパースレッドコアの数を取得するには:
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
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
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()を使用します。
LinuxとOS Xで機能するようにこれを行う場合は、次のようにできます。
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
次のいずれかの方法を使用して、物理 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
。
私も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エントリは、CPUのインデックスを返すので、戻り値0
の戻り値一方だけ手段コア0、1-3
手段コア1,2、および3。
https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpuを参照してください
以下は、ハイパースレッドシステムと非ハイパースレッドシステムの両方での「実際の」コアの数を示します。少なくともそれは私のすべてのテストで機能しました。
awk -F: '/^physical/ && !ID[$2] { P++; ID[$2]=1 }; /^cpu cores/ { CORES=$2 }; END { print CORES*P }' /proc/cpuinfo
0
、Opteron 4170 HEを搭載したシングルコアで戻り4
ますが、Opteron 3280を搭載した8コアボックスで戻ります。
私の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
「コア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)
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 cores
間2 sockets
。
どこlscpu
に私を与えます20 CPUs
-これは完全に間違っています-理由はわかりません。(同じことが当てはまるcat /proc/cpu
-で終わる20
。
これはすべてのalmsostで動作します シェル。
ncore=0
while read line ;do
[ "$line" ] && [ -z "${line%processor*}" ] && ncore=$((ncore+1))
done </proc/cpuinfo
echo $ncore
4
と互換性を保つために シェル、 ダッシュ、 busyboxその他、ncore=$((ncore+1))
代わりに使用しました((ncore++))
。
ncore=0
while read -a line ;do
[ "$line" = "processor" ] && ((ncore++))
done </proc/cpuinfo
echo $ncore
4
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())"
cpu_count
は間違っています。コアの数は返されませんが、Intel CPUのハイパースレッドの数が返されるだけです
物理コアを数えるだけの場合は、このコマンドで計算できます。
lscpu -e | tail -n +2 | tr -s " " | cut -d " " -f 4 | sort | uniq | wc -w
かなり基本的ですが、論理的な数を無視して、実際の物理コアを数えるようです
Python 3には、いくつかの簡単な方法も用意されています。
$ python3 -c "import os; print(os.cpu_count());"
4
$ python3 -c "import multiprocessing; print(multiprocessing.cpu_count())"
4
cat
前にawk
とにかく、:ちょうどawk '<script>' /proc/cpuinfo
、そのよう:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
。そして、あなたは「マイナス1」なしで入ります。