Kata pengantar:
The masalah dengan /proc/cpuinfo
jawaban berbasis adalah bahwa mereka informasi mengurai yang dimaksudkan untuk manusia konsumsi dan dengan demikian tidak memiliki format yang stabil dirancang untuk mesin parsing : format output dapat berbeda di seluruh platform dan kondisi runtime; menggunakan lscpu -p
di Linux (dan sysctl
di macOS) melewati masalah itu .
getconf _NPROCESSORS_ONLN
Saya getconf NPROCESSORS_ONLN
tidak membedakan antara CPU logis dan fisik .
Berikut sh
cuplikan (POSIX-compliant) yang berfungsi di Linux dan macOS untuk menentukan jumlah - online - logis atau CPU fisik ; lihat komentar untuk detailnya.
Penggunaan lscpu
untuk Linux, dan sysctl
untuk macOS.
Catatan terminologi : CPU mengacu pada unit pemrosesan terkecil seperti yang terlihat oleh OS. Core non-hyper-threading masing-masing sesuai dengan 1 CPU, sedangkan core hyper-threading mengandung lebih dari 1 (biasanya: 2) - logical - CPU.
Linux menggunakan taksonomi berikut [1] , dimulai dengan unit terkecil: simpul
CPU < core < socket < book <
dengan masing-masing level terdiri dari 1 atau lebih instance dari level bawah berikutnya.
#!/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] dokumentasi macOSsysctl (3)
Perhatikan bahwa sistem yang diturunkan BSD selain macOS - misalnya, FreeBSD - hanya mendukung hw.ncpu
kunci untuk sysctl
, yang tidak digunakan lagi pada macOS; Aku tidak jelas di mana kunci baru hw.npu
sesuai dengan: hw.(logical|physical)cpu_[max]
.
Ujung topi untuk @teambob untuk membantu memperbaiki perintah fisik-CPU-count lscpu
.
Peringatan : lscpu -p
output TIDAK menyertakan kolom "buku" ( man
halaman menyebutkan "buku" sebagai entitas antara soket dan simpul dalam hierarki taksonomi). Jika "buku" dalam bermain pada sistem Linux tertentu ( apakah ada yang tahu kapan dan bagaimana? ), Perintah fisik-CPU-hitung mungkin di bawah -Laporan (ini didasarkan pada asumsi bahwa lscpu
ID laporan yang non-unik di seluruh lebih tinggi entitas -level ; misalnya: 2 core yang berbeda dari 2 soket yang berbeda dapat memiliki ID yang sama).
Jika Anda menyimpan kode di atas sebagai, misalnya, skrip shellcpus
, membuatnya dapat dieksekusi dengan chmod +x cpus
dan meletakkannya di folder di Anda $PATH
, Anda akan melihat output seperti berikut:
$ cpus
logical 4
physical 4
[1] Xaekai menjelaskan apa itu buku : " buku adalah modul yang menampung papan sirkuit dengan soket CPU, soket RAM, koneksi IO di sepanjang tepinya, dan pengait untuk integrasi sistem pendingin. Buku tersebut digunakan dalam mainframe IBM Info lebih lanjut: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
cat
sebelumawk
, anyway: hanyaawk '<script>' /proc/cpuinfo
, seperti itu:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. Dan Anda masuk tanpa "minus satu".