コマンドラインのプロセッサー/コア数

Linuxのプロセッサー/コア数を取得するために以下のコマンドを実行しています。

cat /proc/cpuinfo | grep processor | wc -l

動作はしますが、エレガントには見えません。どのように改善すればよいのでしょうか?

質問へのコメント (1)
ソリューション

nproc`は、あなたが探しているものです。

詳しくはこちら : http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

解説 (2)

最も単純なツールにはglibcが付属しており、「getconf」と呼ばれます。

$ getconf _NPROCESSORS_ONLN
4
解説 (5)

あなたがあげた方法が、Linuxでは最も移植性が高いと思います。 不必要な catwc プロセスを生成する代わりに、少し短縮することができます。

$ grep --count ^processor /proc/cpuinfo
2
解説 (0)

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

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

新しいカーネルでは、sys/devices/system/cpu/インターフェイスを使用して、もう少し多くの情報を得ることも可能です。

$ ls /sys/devices/system/cpu/
cpu0  cpufreq  kernel_max  offline  possible  present  release
cpu1  cpuidle  modalias    online   power     probe    uevent
$ cat /sys/devices/system/cpu/kernel_max 
255
$ cat /sys/devices/system/cpu/offline 
2-63
$ cat /sys/devices/system/cpu/possible 
0-63
$ cat /sys/devices/system/cpu/present 
0-1
$ cat /sys/devices/system/cpu/online 
0-1

これらの意味については、公式ドキュメントを参照してください。

解説 (2)

誰かが「プロセッサ/コアの数」を要求すると、2つの回答が要求されます。 「プロセッサ」の数は、マシンのソケットにインストールされている物理数です。

「コア」の数は物理的なコアになります。 (少なくとも私の心には)ハイパースレッド(仮想)コアは含まれません。 スレッドプールで多くのプログラムを書く人として、あなたは本当に物理的なコア対コア/ハイパースレッドの数を知る必要があります。 とはいえ、次のスクリプトを変更して、必要な回答を得ることができます。

#!/bin/bash

MODEL=`cat /cpu/procinfo | grep "model name" | sort | uniq`
ALL=`cat /proc/cpuinfo | grep "bogo" | wc -l`
PHYSICAL=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
CORES=`cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | cut -d':' -f2`
PHY_CORES=$(($PHYSICAL * $CORES))
echo "Type $MODEL"
echo "Processors $PHYSICAL"
echo "Physical cores $PHY_CORES"
echo "Including hyperthreading cores $ALL"

2つのモデルXeon X5650物理プロセッサを搭載したマシンの結果。それぞれ6つの物理コアがあり、ハイパースレッドもサポートしています。

Type model name : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24

2 mdeol Xeon E5472プロセッサを搭載したマシンで、ハイパースレッディングをサポートしない4つの物理コアを備えています。

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
解説 (1)
  • util-linux *プロジェクトによって提供される lscpu(1)コマンドも役立つ場合があります。
$ 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:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Model name:            Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
Stepping:              9
CPU MHz:               3406.253
CPU max MHz:           3600.0000
CPU min MHz:           1200.0000
BogoMIPS:              5787.10
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K
NUMA node0 CPU(s):     0-3
解説 (0)

これは、 bsd、 nix、またはsolarisでCPUコアをカウントするポータブルな方法が必要な人向けです(aixおよびhp-uxではテストされていませんが、動作するはずです)。 それはいつも私のために働いてきました。

dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '

solaris grep& egrepには -oオプションがないため、代わりに sedが使用されます。

解説 (0)

別のワンライナー、なしカウント超ねじ込みコア:

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
解説 (0)

osに依存しないメソッドが必要な場合は、WindowsおよびLinux全体で機能します。 pythonを使用します。

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
解説 (0)