लिनक्स में एक सिस्टम के कोर की संख्या कैसे ज्ञात करें?


231

मैं यह जानना चाहता था कि मेरे सिस्टम में कितने कोर हैं, इसलिए मैंने Google में यही सवाल खोजा। मुझे कुछ कमांड्स मिलीं जैसे कि lscpuकमांड। जब मैंने इस कमांड को आजमाया, तो इसने मुझे निम्न परिणाम दिए:

$ 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:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5302.48
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3

विशेष रूप से, यह आउटपुट दिखाता है:

  • CPU (s): 4
  • कोर (एस) प्रति सॉकेट: 4
  • सीपीयू परिवार: 6

उनमें से कौन एक लिनक्स सिस्टम के कोर को इंगित करता है?

क्या कोर की संख्या बताने के लिए कोई अन्य आदेश है, या क्या मैं इसे पूरी तरह से गलत मान रहा हूं?


1
सभी उपयोगकर्ताओं के लिए मेरी सरल कमांड: $ grep प्रीसेसर / proc / cpuinfo | WC -l
สมหวัง แนวหน้า

6
पाठ की आपकी छवि बहुत उपयोगी नहीं है । इसे एक संपादक में कॉपी नहीं किया जा सकता है, और यह बहुत अच्छी तरह से इंडेक्स नहीं करता है, जिसका अर्थ है कि एक ही समस्या वाले अन्य उपयोगकर्ताओं को यहां उत्तर खोजने की संभावना कम है। कृपया संबंधित पाठ को सीधे शामिल करने के लिए अपनी पोस्ट को संपादित करें (अधिमानतः प्रतिलिपि + पेस्ट का उपयोग प्रतिलेखन त्रुटियों से बचने के लिए)।
टोबे स्पाइट

जवाबों:


117

आपको सॉकेट और कोर प्रति सॉकेट को देखना होगा। इस स्थिति में आपके पास 1 भौतिक सीपीयू (सॉकेट) है जिसमें 4 कोर (कोर प्रति सॉकेट) है।


1
मेरे पास एक सॉकेट, दो सीपीयू प्रति सॉकेट है, इसलिए इसका मतलब कुल 2. होगा। हालांकि, यह 4 सीपीयू कहता है। अगर मैं कोशिश nprocकरूं तो मुझे 4 वापस मिलेंगे। उपयोग करने से cat /proc/cpuinfoमुझे 4 मिलता है, और इस प्रकार ऐसा लगता है कि यह उत्तर गलत है, मेरी स्थिति के लिए कम से कम।
एसपीआरबीआरएन

14
नहीं अगर आपको हाइपर थ्रेडिंग है। आपके पास अभी भी 2 भौतिक कोर हैं, लेकिन प्रत्येक कोर शो / proc / cpuinfo में दो बार दिखाता है। यदि आप कोरीड के नीचे ध्यान से देखते हैं तो आप देख सकते हैं कि आपके पास प्रत्येक कोरिड दो बार सूचीबद्ध है। इसके अलावा झंडे के नीचे आप ht ध्वज देख सकते हैं।
user1403360

237

एक पूरी तस्वीर आप की संख्या को देखने की जरूरत है पाने के लिए धागे प्रति कोर, कोर सॉकेट और प्रति सॉकेट । यदि आप इन संख्याओं को गुणा करते हैं तो आपको अपने सिस्टम पर सीपीयू की संख्या मिल जाएगी ।

सीपीयू = थ्रेड्स प्रति कोर X कोर प्रति सॉकेट X सॉकेट्स

सीपीयू वे होते हैं जो आप देखते हैं जब आप चलाते हैं htop(ये भौतिक सीपीयू के बराबर नहीं होते हैं)।

यहाँ एक डेस्कटॉप मशीन से एक उदाहरण दिया गया है:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

और एक सर्वर:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

nprocसीपीयू से मेल खाती है के उत्पादन से मेल खाती है lscpu। इसके ऊपर डेस्कटॉप मशीन के लिए 8 सीपीयू (एस) से मेल खाना चाहिए lscpu:

$ nproc --all
8

आउटपुट को /proc/cpuinfoइस जानकारी से मेल खाना चाहिए, उदाहरण के लिए डेस्कटॉप सिस्टम पर ऊपर हम देख सकते हैं कि 8 प्रोसेसर (सीपीयू) और 4 कोर (कोर आईडी 0-3) हैं:

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3

cpu coresद्वारा रिपोर्ट /proc/cpuinfoसे मेल खाती Core(s) per socketद्वारा रिपोर्ट lscpu। इसके ऊपर डेस्कटॉप मशीन के लिए lscpu द्वारा सूचित 4 कोर (एस) प्रति सॉकेट से मेल खाना चाहिए:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

आपके प्रश्न का विशेष रूप से उत्तर देने के लिए, आप बताएं कि आपके पास कितने सॉरे हैं जो आपके पास प्रति सॉकेट की संख्या से सॉकेट की संख्या से गुणा करते हैं।

कोर = प्रति सॉकेट X सॉकेट्स

उदाहरण के लिए डेस्कटॉप के ऊपर सिस्टम में 4 कोर हैं:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

जबकि सर्वर में 16 है:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

एक अन्य उपयोगी उपयोगिता है dmidecodeजो प्रति सॉकेट जानकारी के लिए आउटपुट है। ऊपर सूचीबद्ध सर्वर प्रणाली के मामले में हम प्रति सॉकेट में 8 कोर और प्रति सॉकेट 16 धागे देखने की उम्मीद करते हैं:

$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16

lscpuआदेश उपयोगी विकल्प है कि आप, बाहर की जाँच करने के लिए उदाहरण के लिए पसंद कर सकते हैं की एक संख्या है:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

man lscpuविवरण के लिए देखें।

संक्षेप में:

  • आपको सॉकेट्स, कोर और थ्रेड्स के बारे में पता होना चाहिए
  • आपको सीपीयू शब्द से सावधान रहने की आवश्यकता है क्योंकि इसका अर्थ अलग-अलग संदर्भों में अलग-अलग चीजें हैं

12
यह स्वीकृत उत्तर होना चाहिए
गन्सब

2
मैं सहमत हूँ। यह स्वीकृत उत्तर होना चाहिए क्योंकि यह विषय को बेहतर ढंग से समझाता है।
राफेल

मुझे लगता है कि जोड़ना lscpu --all --extendedएक उपयोगी जोड़ होगा लेकिन मेरे पास अब इन विशेष मशीनों तक पहुंच नहीं है।
htaccess

आप awk और एक स्पष्ट गुणा से भी बच सकते हैं:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@ जाकूब किलिकोवस्की, इस ओर इशारा करने के लिए धन्यवाद, लेकिन इस मामले में मैं वास्तव में गुणा का प्रदर्शन करना चाहता हूं Socket(s) * Core(s) per socket। यह देखते हुए कि मैंने जो कुछ कहा वह मुझे echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))बेहतर लगता है ताकि लोग देख सकें कि वास्तव में क्या गुणा किया जा रहा है ...
htaccess

61

आप यह जानकारी nproc(1)कमांड द्वारा प्राप्त कर सकते हैं

$ nproc --all
12

इसके लिए रूट विशेषाधिकारों की आवश्यकता नहीं है।


10
यह गलत है, nproc का आउटपुट lscpu से CPU काउंट से मेल खाता है। यदि आपके पास मल्टीथ्रेडेड कोर है तो nproc का आउटपुट आपके पास कोर की संख्या से मेल नहीं खाएगा।
htaccess

2
एक गैर-रूट समाधान के लिए, एक हैक शीर्ष और हिट का उपयोग करना होगा। यह उपलब्ध कोर की संख्या दिखाएगा । मैंने "उपलब्ध" क्यों देखा क्योंकि अंतर्निहित हार्डवेयर में क्लाउड इन्फ्रा की तरह अधिक कोर हो सकते हैं।
बनी

@htaccess कम से कम Ubuntu पर, इस की सही संख्या आउटपुट ऑनलाइन तार्किक सीपीयू
Wil

1
@htaccess ठीक है मुझे मिल गया। आमतौर पर जब एक लिनक्स डफर पूछता है कि कितने कोर का मतलब है कि कितने तार्किक धागे उपलब्ध हैं। तकनीकी रूप से, लिनक्स को हार्डवेयर थ्रेड्स 'cpus' कहना गलत है। आपकी मशीन में 2 सीपीयू और 4 श्रीमती हार्डवेयर थ्रेड्स के साथ 1 सीपीयू है। परिणामस्वरूप CPU और Cores में भारी मात्रा में अस्पष्टता है। लेकिन मुझे वही मिलता है जिसका अब आपको मतलब है, ty।
विल्ह

1
@Wil yea मैं इसे अपने उत्तर में ऊपर कहता हूं: "आपको सीपीयू शब्द से सावधान रहने की आवश्यकता है क्योंकि इसका मतलब अलग-अलग संदर्भों में अलग-अलग चीजों से है"। व्यक्तिगत रूप से मैं "कोर" को तार्किक प्रसंस्करण इकाइयों के लिए नहीं बल्कि प्रोसेसर में भौतिक कोर (यानी भौतिक प्रसंस्करण इकाइयों) के बराबर करता हूं।
htaccess

19

उत्तर भ्रमित न करने के लिए, आपको सरल कंप्यूटर आर्किटेक्चर अवधारणाओं के एक जोड़े को समझने की आवश्यकता है:

  • आप अपने लिनक्स सिस्टम पर प्रक्रियाएं ("प्रोग्राम") चलाते हैं । प्रत्येक प्रक्रिया में एक या अधिक धागे होते हैं
  • प्रत्येक धागा निर्देशों का एक अलग अनुक्रम है । दो धागे को समानांतर में निष्पादित किया जा सकता है।
  • प्रत्येक निर्देश को सीपीयू को निष्पादित करने के लिए दिया जाता है। एक सीपीयू में तर्क होता है जो यह बताता है कि एक निर्देश के बिट्स का क्या मतलब है और यह तय करता है कि इसके साथ क्या करना है।
  • विभिन्न प्रकार के निर्देश हैं। सीपीयू के अंदर निर्णय तर्क अलग-अलग हार्डवेयर इकाइयों को अलग-अलग निर्देश भेजेगा । उदाहरण के लिए, अंकगणितीय निर्देश वास्तव में एक ALU (अंकगणित / तर्क इकाई) द्वारा किए जाते हैं, जबकि निर्देश जो कि मेमोरी से लोड / स्टोर को किसी प्रकार की मेमोरी यूनिट द्वारा निष्पादित करते हैं ।

  • एक कोर वास्तविक निष्पादन हार्डवेयर के सेट को संदर्भित करता है (अर्थात हर कोर में एक ALU, एक मेमोरी यूनिट, आदि है ...)

  • आपके पास कई सीपीयू हो सकते हैं जो एक कोर साझा करते हैं - इसे हाइपरथ्रेडिंग कहा जाता है।

    • विचार: थ्रेड ए वर्तमान में अंकगणित कर रहा है, जबकि थ्रेड बी मेमोरी से कुछ लोड कर रहा है। जब यह सच होता है, तो थ्रेड A और B कुशलता से एक-दूसरे के रास्ते में आए बिना एक कोर साझा कर सकते हैं (A, ALU का उपयोग करता है, B मेमोरी यूनिट का उपयोग करता है)। बेशक, कभी-कभी दोनों कार्यक्रम ALU चाहते हैं, और फिर उन्हें एक-दूसरे के लिए इंतजार करना होगा ...
  • एक सॉकेट मदरबोर्ड जिसमें एक चिप डाला जाता है पर शारीरिक स्लॉट है। इस चिप पर कोर की एक निश्चित संख्या है।

उदाहरण:

ओपी का उदाहरण:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • एक भौतिक सॉकेट, जिसमें एक चिप होती है
  • 4 भौतिक कोर (4 एएलयू और कुल 4 मेमोरी यूनिट सोचें)
  • केवल 1 थ्रेड एक कोर (कोई हाइपरथ्रेडिंग) को निर्देश जारी कर सकता है, जिसका अर्थ है
  • एक सीपीयू प्रति कोर, या 4 * 1 = 4 सीपीयू

एक और उदाहरण:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

दो भौतिक सॉकेट, प्रत्येक में 4 भौतिक कोर के साथ एक चिप होता है, जो कुल 8 कोर बनाता है। दो धागे प्रत्येक कोर को निर्देश जारी करने के लिए मिलते हैं (इस मशीन का हाइपरथ्रेडिंग होता है), जिसका अर्थ है कि प्रत्येक कोर से दो सीपीयू जुड़े होने चाहिए, जिससे कुल 8 * 2 = 16 सीपीयू बनते हैं।

पहली मशीन किसी भी समय, अवधि में ठीक चार निर्देशों को निष्पादित कर सकती है। दूसरी मशीन किसी भी समय 8 और 16 निर्देशों के बीच निष्पादित कर सकती है: 16 को केवल तभी प्राप्त किया जाएगा जब सीपीयू की प्रत्येक जोड़ी विभिन्न प्रकार के निर्देशों को निष्पादित कर रही हो और इसलिए इंतजार किए बिना एक कोर साझा कर सके।


14

आप उस कमांड का भी उपयोग कर सकते हैं cat /proc/cpuinfoजो प्रत्येक कोर के लिए डेटा का एक हिस्सा आउटपुट करेगा। प्रत्येक जानकारी इस जानकारी से शुरू होती है:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

कोर्स 0 से शुरू होते हैं, इसलिए यदि अंतिम चंक कहता है processor : 3कि इस मामले में, आपकी मशीन में 4 कोर हैं।


जानकारी को विस्तार से वर्णन करने वाले इस आदेश का धन्यवाद। :)
श्री अस्क्वेयर जुले

एक एक लाइनर आदेश के लिए, आप उपयोग कर सकते हैंgrep -c ^processor /proc/cpuinfo
वाइल्डकार्ड

5
getconf _NPROCESSORS_ONLN

(getconf glibc का हिस्सा है)


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

और getconf _NPROCESSORS_CONFआपको कॉन्फ़िगर किए गए प्रोसेसर की संख्या प्राप्त होती है। आप sysconf()फ़ंक्शन का उपयोग करके इन दोनों मैक्रोज़ का मूल्य C स्रोत कोड के अंदर भी प्राप्त कर सकते हैं । man sysconfअधिक जानकारी के लिए टाइप करें।
गैलेक्सी

4
[root@xxxxx ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12

t 4Dmid timecode के लिए क्या करना है? काउंट्स और इनेबल्ड लाइनें कैसे गुणा करें? क्या आपका उदाहरण 2 कोर, या 6, या 12, या 24, या कुछ अन्य संख्या दिखाता है?
Xen2050

@ Xen2050 4है processor, linux.die.net/man/8/dmidecode देखें । लेकिन 4तर्क के रूप में उपयोग करना एक बुरा अभ्यास है।
जॉनकॉच

bash: dmidecode: command not found
कैमरन हडसन

3
$ grep -c processor /proc/cpuinfo
8

बस इतना ही चाहिए। यह ऑनलाइन की संख्या है, भले ही हाइपरथ्रेडिंग चालू या बंद हो।

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

एक और आसान तरीका।


2
यह सरल है, लेकिन मुझे यकीन नहीं है कि यह सवाल के लिए सटीक है। उन्होंने कोर की संख्या के लिए कहा: (कोर! = Cpus) यदि हाइपरथ्रेडिंग सक्षम है। हाइपर-थ्रेडेड होने पर मेरी प्रणाली में 24 कोर हैं: 48 सीपीयू। इसके अलावा, प्रदान की गई दूसरी कमांड का उपयोग करते हुए 49ls -d /sys/devices/system/cpu/cpu* | wc -l दिखाया गया क्योंकि निर्देशिकाओं के बीच एक निर्देशिका है। cpuidlecpuN
एंड्रयू फेलंगा


0

बस @htaccess के उत्तर में कुछ जानकारी जोड़ना चाहते हैं।

CentOS 6.x में, dmidecode कोर / थ्रेड काउंट जानकारी को आउटपुट नहीं करता है, और यह वास्तव में 'CPU' को lscpu में 'CPU' या 'Core' के रूप में मानता है, न कि 'सॉकेट' के रूप में।


यदि यह उत्तर नहीं है, तो टिप्पणी के रूप में इसे जोड़ें।
मोंगरेल

@Mongrel मैं टिप्पणी के रूप में जोड़ना चाहता था, लेकिन टिप्पणी करने के लिए 50 प्रतिष्ठा की आवश्यकता है
पिकबॉय

-2

सीपीयू परिवार यहां अप्रासंगिक है।

  • CPU (s) = भौतिक सॉकेट
  • कोर (एस) प्रति सॉकेट - जैसा कि यह कहता है
  • इसलिए कोर की कुल संख्या = सीपीयू (एस) * कोर (एस) प्रति सॉकेट

आपके मामले में, आपके पास कुल 4 पूर्ण कोर हैं।

जो भी महत्वपूर्ण हो सकता है, वह है "थ्रेड (ओं) प्रति कोर"। लेकिन आपके पास 1 है, इसलिए आपके मामले में नहीं।


1
आप अपने विवरण में CPU (s) को सॉकेट के साथ भ्रमित कर रहे हैं।
जलीगरे

1
जैसा कि jlliagre का कहना है कि यह गलत है। Cores = Cores per socket X Sockets, मेरी प्रतिक्रिया में विवरण देखें।
htaccess

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