प्रस्तावना:
-Bbed उत्तरों के साथ समस्या/proc/cpuinfo
यह है कि वे उन सूचनाओं को पार्स करते हैं जो मानव उपभोग के लिए थी और इस प्रकार मशीन पार्सिंग के लिए डिज़ाइन किए गए एक स्थिर प्रारूप का अभाव है : आउटपुट स्वरूप प्लेटफ़ॉर्म और रनटाइम स्थितियों में भिन्न हो सकते हैं; का उपयोग करते हुए lscpu -p
लिनक्स (और पर sysctl
पर MacOS) है कि समस्या को नजरअंदाज ।
getconf _NPROCESSORS_ONLN
/ तार्किक और भौतिक CPU के getconf NPROCESSORS_ONLN
बीच अंतर नहीं करता है ।
यहाँ sh
(POSIX-compliant) स्निपेट है, जो लिनक्स पर काम करता है और macOS - ऑनलाइन - तार्किक या भौतिक सीपीयू की संख्या निर्धारित करता है ; विवरण के लिए टिप्पणियाँ देखें।
lscpu
लिनक्स के लिए, और sysctl
macOS के लिए उपयोग करता है ।
शब्दावली नोट : सीपीयू ओएस द्वारा देखी गई सबसे छोटी प्रसंस्करण इकाई को संदर्भित करता है। गैर-हाइपर-थ्रेडिंग कोर प्रत्येक सीपीयू के अनुरूप होते हैं, जबकि हाइपर-थ्रेडिंग कोर में 1 से अधिक होते हैं (आमतौर पर: 2) - तार्किक - सीपीयू।
लिनक्स निम्न वर्गीकरण का उपयोग करता है [1] , सबसे छोटी इकाई से शुरू होता है:
सीपीयू < कोर < सॉकेट < बुक < नोड
प्रत्येक स्तर के साथ अगले निचले स्तर के 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 sysctl (3)
प्रलेखन
ध्यान दें कि बीएसडी-व्युत्पन्न सिस्टम macOS के अलावा - उदाहरण के लिए, FreeBSD - केवल उस hw.ncpu
कुंजी का समर्थन करते sysctl
हैं, जो macOS में अपग्रेड किए जाते हैं; मैं स्पष्ट नहीं कर रहा हूँ नई चाबियों का है जिस पर hw.npu
से मेल खाती है: hw.(logical|physical)cpu_[max]
।
शारीरिक-सीपीयू-गिनती lscpu
कमांड को सही करने में मदद के लिए @teambob को टोपी की टिप ।
कैविएट : lscpu -p
आउटपुट में "पुस्तक" कॉलम ( man
पृष्ठ में "पुस्तकों" का उल्लेख नहीं किया गया है, जो कि टैक्सोनोमिक पदानुक्रम में सॉकेट और नोड के बीच एक इकाई के रूप में है)। यदि "पुस्तकें" किसी दिए गए लिनक्स सिस्टम पर चलती हैं ( क्या किसी को पता है कि कब और कैसे? ), भौतिक-सीपीयू-गिनती कमांड अंडर -पोर्ट हो सकता है (यह इस धारणा पर आधारित है कि lscpu
आईडी जो उच्चतर गैर-अद्वितीय हैं, रिपोर्ट करती है -वेले एंटिटीज़ ; उदाहरण: 2 अलग-अलग सॉकेट्स से 2 अलग-अलग कोर में एक ही आईडी हो सकती है)।
यदि आप ऊपर दिए गए कोड को सहेजते हैं, जैसे कि शेल स्क्रिप्टcpus
, इसे निष्पादन योग्य बनाते हैं chmod +x cpus
और इसे अपने फ़ोल्डर में रखते हैं $PATH
, तो आपको निम्न जैसे आउटपुट दिखाई देंगे:
$ cpus
logical 4
physical 4
[1] एक पुस्तक क्या है, इस पर Xaekai प्रकाश डालती है: "एक पुस्तक एक मॉड्यूल है जिसमें सीपीयू सॉकेट, रैम सॉकेट, किनारे के साथ आईओ कनेक्शन और शीतलन प्रणाली एकीकरण के लिए एक हुक के साथ एक सर्किट बोर्ड होता है। इनका उपयोग आईबीएमफ्रेम में किया जाता है। । आगे की जानकारी: http://ewh.ieee.org/soc/cpmt/pretations/cpmt0810a.pv "
cat
इससे पहलेawk
, वैसे भी: बसawk '<script>' /proc/cpuinfo
, उस तरह की आवश्यकता नहीं हैawk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
:। और आप "माइनस वन" के बिना मिलता है।