मैक ओएस एक्स पर * तार्किक * कोर की संख्या की खोज कैसे करें?


381

जब आप Mac OS X को चला रहे हैं, तो कमांड लाइन से, आप बता सकते हैं कि मशीन पर कितने कोर हैं? लिनक्स पर, मैं उपयोग करता हूं:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)

यह सही नहीं है, लेकिन यह करीब है। यह करने के लिए तंग आ गया है make, यही वजह है कि यह वास्तविक संख्या की तुलना में 1 अधिक परिणाम देता है। और मुझे पता है कि उपरोक्त कोड पर्ल में सघन लिखा जा सकता है या grep, wc, और cut का उपयोग करके लिखा जा सकता है, लेकिन मैंने फैसला किया कि उपरोक्त संक्षिप्तता और पठनीयता के बीच एक अच्छा व्यापार था।

बहुत कम संपादित करें: बस स्पष्ट करने के लिए: मैं पूछ रहा हूँ कि कितने तार्किक कोर उपलब्ध हैं, क्योंकि यह मुझे एक साथ कितने नौकरियों के साथ makeजोड़ना चाहता है। jkp का जवाब, क्रिस लॉयड द्वारा और अधिक परिष्कृत, ठीक वैसा ही जैसा मुझे चाहिए था। YMMV।


: लिनक्स के लिए, मैं द्वारा का उपयोग कर एक जोड़ने करने से बचने मेंgrep ^processor /proc/cpuinfo | wc -l
courtlandj

3
देखें stackoverflow.com/questions/6481005/…nproc कमांड नोट करें ।
माइक डीमोन

क्षमा करें यदि यह एक नॉब प्रश्न है, लेकिन जब आप तार्किक कोर का अर्थ करते हैं तो आपका मतलब भौतिक कोर है? शब्द कैसे भिन्न हैं (या नहीं)? बस यह समझने के लिए कि आपका क्या पूछना बेहतर है।
चार्ली पार्कर

नहीं, मेरा मतलब शारीरिक कोर नहीं है। एक भौतिक कोर एक चिप पर ट्रांजिस्टर का एक समूह है जो एक कोर को लागू करता है। एक तार्किक कोर कुछ ऐसा है जो ऑपरेटिंग सिस्टम और उपयोगकर्ता कार्यक्रमों के लिए एक कोर प्रतीत होता है। बड़ी संख्या में मामलों में, ये समान हैं। हालांकि, इंटेल की हाइपरथ्रेडिंग तकनीक (और शायद अन्य) प्रत्येक भौतिक कोर को दो तार्किक कोर के रूप में प्रकट करती है।
माइक डीसिमोन

जवाबों:


796

आप इसे sysctl उपयोगिता का उपयोग करके कर सकते हैं :

sysctl -n hw.ncpu

6
2011 के मध्य में 1.7GHz मैकबुक एयर पर, यह कमांड 4. कहता है। हालांकि, मुझे संदेह था कि इसमें वास्तव में केवल 2 कोर हैं, और system_profiler SPHardwareDataType सहमत प्रतीत होता है। क्या आप विसंगति की व्याख्या कर सकते हैं?
जोशुआ फ्लैगनन

13
@JoshuaFlanagan मशीन में कितने भौतिक कोर हैं और यह किस चिप की है? यदि यह उदाहरण के लिए 2 भौतिक कोर के साथ एक कोर i7 है, तो यह 4 के रूप में दिखाएगा क्योंकि चिप हाइपर-थ्रेडिंग का समर्थन करता है और खुद को ओएस के रूप में प्रस्तुत करता है जैसे कि इसमें 4 पता योग्य कोर हैं।
jkp

142
यदि आप वास्तव में सभी विकल्पों के लिए देखभाल, प्रयास sysctl hw.physicalcpuया sysctl hw.logicalcpu, या सामान्य रूप sysctl hwसे करते हैं।
परिवर्तनीय लंबाई कोडर

23
संपादकों: कृपया इसे स्वीकार करने के बाद उत्तर वर्षों को न बदलें।
माइक डीस्मोन

2
जल्दी 2015 मैक एल Elitan चल रहा है पर काम नहीं करता है। मुझे "त्रुटि:" hw.ncpu "एक अज्ञात कुंजी है"। /Etc/sysctl.conf में कोई cpu संबंधित प्रविष्टि नहीं है। जमे हुए लौ के जवाब ने काम किया।
जीजीटी

130

और भी आसान:

sysctl -n hw.ncpu

2
इसके द्वारा रिपोर्ट की गई संख्या वास्तव में कोर की संख्या से दोगुनी है आपका प्रोसेसर हाइपर-थ्रेडिंग का समर्थन करता है।
मिकेज़ो

3
यह मुझे 4 देता है, लेकिन जब मैं उपयोग system_profiler SPHardwareDataTypeकरता हूं, तो मैं 'मॉडल आइडेंटिफायर:
मैकबुकप्रो 9,2

31

यह क्रॉस प्लेटफॉर्म होना चाहिए। कम से कम लिनक्स और मैक ओएस एक्स के लिए।

python -c 'import multiprocessing as mp; print(mp.cpu_count())'

थोड़ा धीमा लेकिन काम करता है।


18

सी में ऐसा करने के लिए आप कार्यों के sysctl (3) परिवार का उपयोग कर सकते हैं:

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

"Hw.logicalcpu" के स्थान पर उपयोग करने के लिए दिलचस्प मूल्य, जो कोर की गणना करते हैं:

hw.physicalcpu - The number of physical processors available in the current power management mode.

hw.physicalcpu_max - The maximum number of physical processors that could be available this boot.

hw.logicalcpu - The number of logical processors available in the current power management mode.

hw.logicalcpu_max - The maximum number of logical processors that could be available this boot.

माइक, एडिट के लिए धन्यवाद, महसूस नहीं किया कि ओल्डप्लेन इन-आउट पैरामीटर था।
अल्फवेट

14

system_profiler SPHardwareDataType शो मैं 1 प्रोसेसर और 4 कोर है।

[~] system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro9,1
      Processor Name: Intel Core i7
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 4

      <snip>

[~] 

हालांकि, sysctl असहमत:

[~] sysctl -n hw.logicalcpu
8
[~] sysctl -n hw.physicalcpu
4
[~] 

लेकिन sysctl सही प्रतीत होता है, जब मैं एक प्रोग्राम चलाता हूं जिसमें सभी CPU स्लॉट्स होने चाहिए, तो मुझे यह प्रोग्राम लगभग 800% CPU समय (इन top) ले रहा है:

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

3
आप काम में हाइपरथ्रेडिंग देख रहे हैं। यह प्रत्येक कोर को दो निष्पादन थ्रेड्स को संभालने देता है (जरूरी नहीं कि ओएस थ्रेड्स, जैसे कि थ्रेड्स)। नतीजतन, मैकओएस प्रत्येक भौतिक कोर को दो तार्किक कोर के रूप में मानता है।
माइक डीमोन

नमस्कार @MikeDeSimone क्या आप मुझे दिखा सकते हैं कि अगर CentOS के मामले में हाइपर थ्रेडिंग काम पर है तो कैसे जांचें?
Ciasto पीकरज़


@Ciastopiekarz मैं काफी कुछ हाइपर थ्रेडिंग कर रहा हूं जो कि OS के बजाय सीपीयू आर्किटेक्चर (इंटेल) की एक विशेषता है, मुझे लगता है कि पूरे बिंदु ओएस को लगता है कि इसमें भौतिक सीपीयू है: sx 2 तार्किक कोर कुछ भी किए बिना। उन तक पहुँचने के लिए विशेष। तो अगर आपका सीपीयू इंटेल है (सभी मैक इंटेल के साथ आते हैं) तो हां, आपके पास हाइपर थ्रेडिंग है। हालाँकि, यदि आप PC पर CentOS चलाते हैं, तो आपके पास AMD प्रोसेसर हो सकता है। उनके पास हाइपर थ्रेडिंग नहीं है, लेकिन चूंकि वे आमतौर पर एक ही (या कम) कीमत पर दो बार के साथ आते हैं, मुझे यकीन नहीं है कि व्यावहारिक अंतर है।
Erk

@ ईआरके अंतर को जानता है, वास्तव में, यह सीपीयू और कोरेस के साथ-साथ एक भौतिक पर चलने वाले कई थ्रेड्स के बीच का अंतर जानता है। sysctl hw.physicalcpuदिखाएगा कि कितने भौतिक सीपीयू कोर आपके लिए उपलब्ध हैं, sysctl hw.logicalcpuयह दिखाएगा कि आपके लिए कितने तार्किक सीपी उपलब्ध हैं। OS की तरह Windows / OSX / Linux इसे बनाने के सभी काम करता है जैसे कि आपके पास कई सीपीयू हैं (चाहे वह किस प्रकार का हो)। OS की तरह linux आपको कॉन्फ़िगर करने की अनुमति देता है कि किस सीपीयू, कोर, थ्रेडिंग का उपयोग किया जा सकता है।
राही

10
$ system_profiler | grep 'Total Number Of Cores'

2
तेज: $ system_profiler SPHardwareDataType | grep 'कुल की संख्या'
kent

6
धीमी हालांकि अगर आप टाइपिंग टाइम शामिल करते हैं
उच्च प्रदर्शन मार्क

2
यह बैश स्क्रिप्ट में है; टाइपिंग का समय अप्रासंगिक है।
माइक डीसिमोन

3
ऐसा प्रतीत होता है जैसे कि Apple ने आउटपुट के स्वरूपण को बदल दिया है। कैपिटलाइज़ेशन पर ध्यान दें: पहले 'टोटल नंबर ऑफ़ कोर्स' था, अब यह 'टोटल नंबर ऑफ़ कोर्स' है ... या तो मैंने या उसने इसे पहले गलत लिखा था ... इसके बारे में खेद है!
केंट

3
आप का उपयोग कर सकते हैंgrep -i
Skylar Saveland

8

system_profiler | grep "Cores"कमांड का उपयोग करें ।

मेरे पास एक:

मैकबुक प्रो रेटिना, मिड 2012।

प्रोसेसर: 2.6 गीगाहर्ट्ज़ इंटेल कोर i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

विकिपीडिया के अनुसार, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) 8 भौतिक कोर के साथ कोई कोर i7 नहीं है, इसलिए हाइपरथ्रेडिंग विचार होना चाहिए। सटीकता के लिए मूल्य पर ध्यान न दें sysctlऔर उपयोग करें system_profiler। असली सवाल यह है कि क्या आप अन्य प्रक्रियाओं को बाधित किए बिना 4 कोर (लंबी संकलन वाली नौकरियां?) के साथ कुशलता से आवेदन कर सकते हैं या नहीं।

4 कोर के साथ संकलित एक संकलक को चलाना नियमित रूप से ओएस संचालन को नाटकीय रूप से प्रभावित नहीं करता है। तो शायद 8 कोर के रूप में इसका इलाज करना इतना बुरा नहीं है।


1
तार्किक कोर की संख्या के बराबर कई प्रक्रियाओं को पैदा करना (हाइपरथ्रेडिंग के मामले में भौतिक कोर की दोगुनी संख्या, जैसा कि आप ध्यान दें) ने मेरे लिए काफी अच्छा प्रदर्शन किया है।
माइक डीमोन जू

7

जैसा कि jkp ने एक टिप्पणी में कहा, कि भौतिक कोर की वास्तविक संख्या नहीं दिखाई देती है। आप निम्नलिखित कमांड का उपयोग कर सकते हैं भौतिक कोर की संख्या प्राप्त करने के लिए:

system_profiler SPHardwareDataType

लक्ष्य यह निर्धारित करना था कि कितने प्रक्रियाओं के साथ स्पॉन करना है make, इसलिए jkp का उत्तर (तार्किक कोर की संख्या) सबसे अच्छा बैठता है।
माइक डेसिमोन

3

निम्न कमांड आपको अपने सीपीयू के बारे में सारी जानकारी देता है

$ sysctl -a | sort | grep cpu

अच्छा लगा, लेकिन जो नहीं पूछा गया।
माइक डेमिसोन

1

स्पष्टीकरण

जब यह सवाल पूछा गया कि ओपी ने यह नहीं कहा कि वह कोर की वास्तविक संख्या के बजाय तार्किक कोर की संख्या चाहता है , तो यह उत्तर तार्किक रूप से (कोई दंडित इरादा नहीं) वास्तविक भौतिक कोर की वास्तविक संख्या प्राप्त करने के तरीके से उत्तर देता है , नहीं वह संख्या जिसे OS हाइपरथ्रेडिंग वूडू के माध्यम से वर्चुअलाइज करने की कोशिश करता है।

YOSEMITE में हाथापाई फ्लाव के लिए अद्यतन

OS X Yosemite (और संभवतः नए संस्करण, जैसे आगामी El Capitan) में एक अजीब बग के कारण , मैंने एक छोटा संशोधन किया है। (पुराना संस्करण अभी भी पूरी तरह से अच्छी तरह से काम करता है यदि आप सिर्फ STDERR को अनदेखा करते हैं, जो आपके लिए सभी संशोधन करता है।)


यहां दिए गए हर दूसरे जवाब

  1. गलत जानकारी देता है
  2. कमांड कार्यान्वयन में त्रुटि के कारण कोई जानकारी नहीं देता है
  3. अविश्वसनीय रूप से धीरे-धीरे चलता है ( पूरा होने के लिए एक मिनट का बेहतर हिस्सा ), या
  4. बहुत अधिक डेटा देता है, और इस तरह यह इंटरएक्टिव उपयोग के लिए उपयोगी हो सकता है, लेकिन यदि आप डेटा को प्रोग्रामेटिक रूप से उपयोग करना चाहते हैं तो बेकार है (उदाहरण के लिए, एक कमांड के इनपुट के रूप में, bundle install --jobs 3जहां आप चाहते हैं कि नंबर की जगह संख्या 3से कम हो। आपके द्वारा प्राप्त कोर, या कम से कम कोर की संख्या से अधिक नहीं)

बस कोर की संख्या प्राप्त करने का तरीका, मज़बूती से, सही ढंग से, यथोचित रूप से जल्दी, और अतिरिक्त जानकारी के बिना या उत्तर के आसपास अतिरिक्त वर्णों के बिना, यह है:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '

3
मैं बस sysctl -n hw.ncpuअपने मैक प्रो पर भागा और उन समस्याओं में से कोई भी नहीं था ।
माइक डेसिओन

मैंने स्पष्ट रूप से सभी प्रकार के मैक पर परीक्षण नहीं किया है, लेकिन मैं आपको विश्वास दिलाता हूं कि यह कभी-कभी सटीक होता है। हालांकि, sysctlमेरी मशीन पर सटीक परिणाम नहीं देता है, और दूसरों ने भी यही बात बताई है। यदि इसे हमेशा सटीक परिणाम देने के लिए भरोसा नहीं किया जा सकता है , तो इसे विश्वसनीय और सटीक नहीं माना जा सकता है।
आइकनोकॉस्ट

आप अपने द्वारा देखे गए गलत व्यवहार की व्याख्या भी कर सकते हैं, और आप इसे किस प्लेटफॉर्म पर देखते हैं, इसलिए उपयोगकर्ता के sysctlउचित संचालन की सीमाएं बेहतर ज्ञात हैं, जैसे user1706991 ने किया था।
माइक डीस्मोन

दूसरों ने सुझाव दिया है कि यह हाइपर थ्रेडिंग के कारण है, इसलिए आप जिस नंबर को sysctl के साथ देखते हैं वह कोर की संख्या है जिसे सिस्टम अनुकरण करने की कोशिश कर रहा है, भले ही यह वास्तव में ऐसा न हो। यदि आप सटीक संख्याएँ चाहते हैं, तो मेरी विधि का उपयोग करें। यदि आप जानना चाहते हैं कि कंप्यूटर कितने कोर का नाटक कर रहा है, तो sysctl का उपयोग करें।
आइकनोकॉस्ट 20

@ परीक्षण में मुझे यह पता चला कि 'कुल संख्या करोड़ों' में स्थानीय है। यदि OS X कुछ भी करने के लिए सेट है, लेकिन अंग्रेजी आपका समाधान विफल रहता है। अंत का उपयोग कर समाप्त:sysctl -n hw.physicalcpu_max
CO

1

एक पर मैकबुक प्रो चल मावेरिक्स , sysctl -a | grep hw.cpuकेवल कुछ गुप्त जानकारी के वापस आ जाएगी। बहुत अधिक विस्तृत और सुलभ जानकारी machdep.cpuअनुभाग में सामने आई है , अर्थात:

sysctl -a | grep machdep.cpu

विशेष रूप से, HyperThreading(HT) वाले प्रोसेसर के लिए , आपको कुल एनुमेटेड CPU गणना ( logical_per_package) भौतिक कोर काउंट ( cores_per_package) की तुलना में दोगुनी दिखाई देगी ।

sysctl -a | grep machdep.cpu  | grep per_package

मेरे प्रारंभिक 2008 मैक प्रो पर, जो मुझे 4 देता है। कोर की वास्तविक संख्या 8 है, क्योंकि इसमें दो क्वाड-कोर सीपीयू चिप्स हैं।
माइक डीमोन

sysctl machdep.cpu अन्य सभी अनावश्यक सूचनाओं को पढ़ने के बजाय काम करता है।
एचएनएस

1

यह मूल प्रश्न में निर्दिष्ट नहीं था (हालांकि मैंने टिप्पणियों में ओपी पोस्ट को देखा कि यह एक विकल्प नहीं था), लेकिन मैकओएस पर कई डेवलपर्स ने होमब्रे पैकेज प्रबंधक स्थापित किया है।

भविष्य के डेवलपर्स के लिए जो इस सवाल पर ठोकर खाते हैं, जब तक कि Homebrew स्थापित होने की धारणा (या आवश्यकता) मौजूद है (जैसे, एक कंपनी में इंजीनियरिंग संगठन), nprocसामान्य GNU बायनेरिज़ में से एक है जो coreutilsपैकेज में शामिल है ।

brew install coreutils

यदि आपके पास ऐसी स्क्रिप्ट्स हैं, जिन्हें आप दो बार के बजाय एक बार (Linux + macOS के लिए) लिखना पसंद करेंगे, या उन ifब्लॉक्स से बचने के लिए जहां आपको ओएस का पता लगाने की आवश्यकता है , तो nprocबनाम कॉल करने के लिए या नहीं sysctl -n hw.logicalcpu, यह एक बेहतर विकल्प हो सकता है।


0

ऊपर 2 अच्छे उत्तरों के लिए टिप्पणियाँ:

1) jkp द्वारा स्वीकार किए गए उत्तर (और टिप्पणियाँ) को पुनः भेजें: hw.ncpu को hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 ) के पक्ष में स्पष्ट रूप से चित्रित किया गया है

२) २०१४ का अपडेट कार्ल एह्र द्वारा: मेरे कंप्यूटर पर (२.५ ghz इंटेल कोर i7 के साथ), sysctl -a | grep machdep.cpu | grep per_packageअलग-अलग नंबर देता है:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

वांछित मूल्य हैं:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

कौन सा मैच:

hw.physicalcpu: 4

hw.logicalcpu: 8


0

यह अधिक पोर्टेबल तरीके से किया जा सकता है:

$ nproc --all
32

MacOS और लिनक्स के साथ संगत।


2
nprocMacOS Mojave पर उपलब्ध नहीं लगता है।
माइक डीमोन

मुझे बताने के लिए धन्यवाद, माइक। nprocहोमब्रे के माध्यम से एक तुच्छ स्थापित है।
जे टेलर टेलर

मेरे द्वारा चलाए जा रहे सिस्टम को इंटरनेट से डिस्कनेक्ट कर दिया गया था, इसलिए होमब्रेव मदद नहीं करता है। "कर्ल साइट" की आवश्यकता वाली किसी भी चीज़ का उपयोग नहीं किया जा सकता है
माइक डीस्मोन सेप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.