Kata pengantar:
The masalah dengan /proc/cpuinfojawaban 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 -pdi Linux (dan sysctldi macOS) melewati masalah itu .
getconf _NPROCESSORS_ONLNSaya getconf NPROCESSORS_ONLNtidak membedakan antara CPU logis dan fisik .
Berikut shcuplikan (POSIX-compliant) yang berfungsi di Linux dan macOS untuk menentukan jumlah - online - logis atau CPU fisik ; lihat komentar untuk detailnya.
Penggunaan lscpuuntuk Linux, dan sysctluntuk 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.ncpukunci untuk sysctl, yang tidak digunakan lagi pada macOS; Aku tidak jelas di mana kunci baru hw.npusesuai dengan: hw.(logical|physical)cpu_[max].
Ujung topi untuk @teambob untuk membantu memperbaiki perintah fisik-CPU-count lscpu.
Peringatan : lscpu -poutput TIDAK menyertakan kolom "buku" ( manhalaman 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 lscpuID 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 cpusdan 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 "
catsebelumawk, anyway: hanyaawk '<script>' /proc/cpuinfo, seperti itu:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo. Dan Anda masuk tanpa "minus satu".