จะทราบจำนวนคอร์ของระบบใน Linux ได้อย่างไร?


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: 4
  • หลักต่อซ็อกเก็ต: 4
  • ตระกูล CPU: 6

ข้อใดที่บ่งบอกถึงแกนหลักของระบบ Linux?

มีคำสั่งอื่นใดที่จะบอกจำนวนแกนหรือฉันคิดว่ามันผิดทั้งหมด?


1
คำสั่งง่ายๆสำหรับผู้ใช้ทั้งหมด: $ grep precessor / proc / cpuinfo | wc -l
สมหวังแนวหน้า

6
ภาพของข้อความไม่เป็นประโยชน์มาก ไม่สามารถคัดลอกไปยังตัวแก้ไขได้และไม่สามารถจัดทำดัชนีได้ดีซึ่งหมายความว่าผู้ใช้รายอื่นที่มีปัญหาเดียวกันมีโอกาสน้อยกว่าที่จะหาคำตอบได้ที่นี่ โปรดแก้ไขโพสต์ของคุณเพื่อรวมข้อความที่เกี่ยวข้องโดยตรง (ควรใช้คัดลอก + วางเพื่อหลีกเลี่ยงข้อผิดพลาดในการถอดความ)
Toby Speight

คำตอบ:


117

คุณต้องดูที่ซ็อกเก็ตและแกนต่อซ็อกเก็ต ในกรณีนี้คุณมี 1 ฟิสิคัล CPU (ซ็อกเก็ต) ซึ่งมี 4 คอร์ (แกนต่อซ็อกเก็ต)


1
ฉันมีหนึ่งซ็อกเก็ตสองซีพียูต่อซ็อกเก็ตดังนั้นนั่นจะหมายถึงจำนวน 2 อย่างไรก็ตามมันบอกว่า 4 ซีพียู ถ้าฉันลองnprocฉันจะได้ 4 กลับ ใช้cat /proc/cpuinfoฉันได้ 4 และดูเหมือนว่าคำตอบนี้ผิดสำหรับสถานการณ์ของฉันอย่างน้อย
SPRBRN

14
ไม่ใช่ถ้าคุณมีเธรดที่มากเกินไป คุณยังมีฟิสิคอล 2 คอร์ แต่แต่ละคอร์แสดงใน / proc / cpuinfo สองครั้ง หากคุณดูอย่างละเอียดภายใต้แกนกลางคุณจะเห็นว่าคุณมีแกนกลางแต่ละรายการอยู่สองครั้ง ภายใต้ธงคุณสามารถเห็นธง ht
user1403360

237

เพื่อให้ได้ภาพที่สมบูรณ์แบบที่คุณต้องดูที่จำนวนของหัวข้อต่อหลักแกนต่อซ็อกเก็ตและซ็อกเก็ต หากคุณคูณตัวเลขเหล่านี้คุณจะได้รับจำนวนCPUในระบบของคุณ

CPUs = เธรดต่อ core X แกนต่อซ็อกเก็ต X ซ็อกเก็ต

ซีพียูคือสิ่งที่คุณเห็นเมื่อคุณเรียกใช้htop(สิ่งเหล่านี้ไม่เท่ากับ CPU จริง)

นี่คือตัวอย่างจากเครื่องเดสก์ท็อป:

$ 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สอดคล้องกับจำนวนของ CPU lscpuจาก สำหรับเครื่องเดสก์ท็อปด้านบนสิ่งนี้ควรตรงกับ 8 CPU ที่รายงานโดยlscpu:

$ nproc --all
8

ผลลัพธ์ของ/proc/cpuinfoควรตรงกับข้อมูลนี้ตัวอย่างเช่นในระบบเดสก์ท็อปด้านบนเราจะเห็นว่ามีโปรเซสเซอร์ 8 ตัว (CPUs) และ 4 คอร์ (คอร์ id 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สำหรับเครื่องเดสก์ท็อปด้านบนสิ่งนี้ควรตรงกับ 4 คอร์ต่อซ็อกเก็ตที่รายงานโดย lscpu:

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

ในการตอบคำถามของคุณโดยเฉพาะคุณบอกจำนวนคอร์ที่คุณมีโดยการคูณจำนวนคอร์ที่คุณมีต่อซ็อกเก็ตด้วยจำนวนซ็อกเก็ตที่คุณมี

แกน = แกนต่อซ็อกเก็ต X Sockets

สำหรับตัวอย่างระบบด้านบนเดสก์ท็อปมี 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รายละเอียดที่

สรุป:

  • คุณต้องระวังซ็อกเก็ตคอร์และเธรด
  • คุณต้องระวังคำว่า CPU เนื่องจากมันหมายถึงสิ่งต่าง ๆ ในบริบทที่แตกต่างกัน

12
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
gansub

2
ฉันเห็นด้วย. นี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะอธิบายเรื่องได้ดีกว่า
Rafael

ฉันคิดว่าการเพิ่มlscpu --all --extendedจะเป็นการเพิ่มที่มีประโยชน์ แต่ฉันไม่สามารถเข้าถึงเครื่องเหล่านี้ได้อีกต่อไป
htaccess

นอกจากนี้คุณยังสามารถหลีกเลี่ยง awk และการคูณที่ชัดเจน:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@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 สอดคล้องกับจำนวน CPU จาก lscpu หากคุณมีแกนหลายเธรดผลลัพธ์ของ nproc จะไม่ตรงกับจำนวนแกนที่คุณมี
htaccess

2
สำหรับวิธีการที่ไม่ใช่รูทแฮ็คจะใช้อันดับต้น ๆ แล้วกด 1 ซึ่งจะแสดงจำนวนคอร์ที่มีอยู่ ทำไมฉันเห็น "ว่าง" เพราะฮาร์ดแวร์พื้นฐานอาจมีแกนเพิ่มเติมเช่น cloud infra
Hopping Bunny

@htaccess อย่างน้อยบน Ubuntu นี้ออกผลลัพธ์เป็นตัวเลขที่ถูกต้องของ on-line ของซีพียูตรรกะ
Wil

1
@htaccess ตกลงฉันเข้าใจแล้ว โดยปกติเมื่อ linux duffer ถามจำนวนแกนประมวลผลซึ่งหมายถึงจำนวนเธรดเชิงตรรกะที่พร้อมใช้งาน ในทางเทคนิคแล้ว linux ผิดที่จะเรียกว่า 'cpus' เธรดฮาร์ดแวร์ เครื่องของคุณมี 1 CPU พร้อม 2 คอร์และเธรดฮาร์ดแวร์ 4 เธรด มีความคลุมเครือจำนวนมากในความหมายของ CPU และ Cores แต่ฉันเข้าใจในสิ่งที่คุณต้องการแล้ว
Wil

1
@ ใช่ฉันเรียกสิ่งนี้ในคำตอบของฉันด้านบน: "คุณต้องระวังคำว่า CPU เพราะมันหมายถึงสิ่งต่าง ๆ ในบริบทที่แตกต่างกัน" โดยส่วนตัวฉันไม่เทียบเท่า "แกน" กับหน่วยประมวลผลเชิงตรรกะ แต่เป็นหน่วยประมวลผลทางกายภาพในตัวประมวลผล (เช่นหน่วยประมวลผลทางกายภาพ)
htaccess

19

เพื่อให้คำตอบไม่สับสนคุณต้องเข้าใจแนวคิดสถาปัตยกรรมคอมพิวเตอร์อย่างง่าย ๆ สองประการ:

  • คุณเรียกใช้กระบวนการ ("โปรแกรม") บนระบบ linux ของคุณ แต่ละกระบวนการประกอบด้วยหนึ่งหรือหลายเธรด
  • แต่ละหัวข้อเป็นลำดับที่แยกต่างหากจากคำแนะนำ สองเธรดสามารถดำเนินการแบบขนาน
  • แต่ละคำสั่งจะมอบให้กับCPUที่จะดำเนินการ ซีพียูมีตรรกะที่ระบุว่าบิตของคำสั่งหมายถึงอะไรและตัดสินใจว่าจะทำอย่างไรกับมัน
  • คำแนะนำมีหลายประเภท ตรรกะการตัดสินใจภายใน CPU จะส่งคำสั่งต่าง ๆ ไปยังฮาร์ดแวร์ต่างๆ ยกตัวอย่างเช่นคำแนะนำทางคณิตศาสตร์จะดำเนินการจริงโดยALU (คณิตศาสตร์ / หน่วยตรรกะ) ในขณะที่คำสั่งที่โหลด / ร้านจากหน่วยความจำจะดำเนินการโดยการจัดเรียงของบางหน่วยหน่วยความจำ

  • หลักหมายถึงชุดของฮาร์ดแวร์ปฏิบัติจริง (เช่นทุกหลักมี ALU หน่วยหน่วยความจำ ฯลฯ ... )

  • คุณสามารถมี CPU หลายตัวที่ใช้หนึ่งคอร์ซึ่งเรียกว่าไฮเปอร์เธรด

    • แนวคิด: เธรด A กำลังทำเลขคณิตขณะที่เธรด B กำลังโหลดบางอย่างจากหน่วยความจำ เมื่อเป็นจริงเธรด A และ B สามารถแชร์แกนเดี่ยวได้อย่างมีประสิทธิภาพโดยไม่ต้องไปต่อกัน (A ใช้ ALU, B ใช้หน่วยความจำ) แน่นอนว่าบางครั้งทั้งสองโปรแกรมจะต้องการ ALU แล้วพวกเขาต้องรอกันและกัน ...
  • ซ็อกเก็ตเป็นช่องทางกายภาพบนเมนบอร์ดเป็นที่ชิปจะถูกแทรก ชิปนี้มีจำนวนคอร์ที่แน่นอน

ตัวอย่าง:

ตัวอย่างของ OP:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • ซ็อกเก็ตทางกายภาพหนึ่งซ็อกเก็ตซึ่งมีชิปอยู่ด้วย
  • 4 ฟิสิคัลคอร์ (คิด 4 ALU และหน่วยความจำรวม 4 ยูนิต)
  • มีเพียง 1 เธรดเท่านั้นที่สามารถออกคำสั่งให้กับคอร์ (ไม่มีไฮเปอร์เธรด) ซึ่งหมายความว่ามี
  • หนึ่ง CPU ต่อคอร์หรือ 4 * 1 = 4 ซีพียู

ตัวอย่างอื่น:

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

ซ็อกเก็ตฟิสิคัลสองซ็อกเก็ตแต่ละตัวบรรจุชิปที่มี 4 คอร์ฟิสิคัลรวม 8 คอร์ สองเธรดได้รับคำแนะนำเกี่ยวกับแต่ละคอร์ (เครื่องนี้มีไฮเปอร์เธรด) หมายความว่าต้องมี CPU สองตัวต่อกับแต่ละคอร์ทำให้มีทั้งหมด 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 แกน


ขอบคุณคำสั่งนี้อธิบายข้อมูลในรายละเอียด :).
นาย ASQUARE

สำหรับคำสั่งแบบใช้สายเดียวคุณอาจใช้grep -c ^processor /proc/cpuinfo
Wildcard

5
getconf _NPROCESSORS_ONLN

(getconf เป็นส่วนหนึ่งของ glibc)


1
มันแตกต่างกันเล็กน้อย (และมีประโยชน์สำหรับความต้องการบางอย่าง) เป็นจำนวนตัวประมวลผลที่ออนไลน์อยู่ (เช่นมีให้สำหรับกระบวนการทำงาน) อาจน้อยกว่าจำนวน CPU ทั้งหมดหากมีหนึ่งออฟไลน์ได้รับออฟไลน์ (เช่นระหว่างการไฮเบอร์เนตหรือขณะที่เพิ่ม / ลบโปรเซสเซอร์)
Toby Speight

และgetconf _NPROCESSORS_CONFทำให้คุณได้รับจำนวนโปรเซสเซอร์ที่กำหนดค่า คุณสามารถรับค่าของมาโครทั้งสองนี้ในซอร์สโค้ด C ด้วยเช่นกันโดยใช้sysconf()ฟังก์ชัน พิมพ์man sysconfเพื่อรับข้อมูลเพิ่มเติม
Galaxy

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 4สิ่งที่ต้องทำสำหรับ dmidecode? จำนวน & บรรทัดที่เปิดใช้งานคูณออกมาเป็นอย่างไร ตัวอย่างของคุณแสดง 2 คอร์หรือ 6 หรือ 12 หรือ 24 หรือจำนวนอื่น ๆ หรือไม่?
Xen2050

@ Xen2050 4คือprocessorดูlinux.die.net/man/8/dmidecode แต่การใช้4อาร์กิวเมนต์เป็นวิธีปฏิบัติที่ไม่ดี
JohnKoch

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 cpus เมื่อไฮเปอร์เธรด นอกจากนี้การใช้คำสั่งที่สองที่ให้ไว้ls -d /sys/devices/system/cpu/cpu* | wc -lแสดงให้เห็นว่า49เพราะมีไดเรกทอรีcpuidleอยู่ในcpuNไดเรกทอรี
Andrew Falanga


0

เพียงแค่ต้องการเพิ่มข้อมูลลงในคำตอบของ @htaccess

ใน CentOS 6.x dmidecode จะไม่ส่งออกข้อมูลการนับ Core / Thread และจริง ๆ แล้วถือว่า 'CPU' เป็น 'CPU' หรือ 'Core' ใน lscpu ไม่ใช่ 'socket'


หากนี่ไม่ใช่คำตอบให้เพิ่มนี่เป็นความคิดเห็น
Mongrel

@Mongrel ฉันต้องการเพิ่มเป็นความคิดเห็น แต่การแสดงความคิดเห็นต้องมี 50 ชื่อเสียง
PickBoy

-2

ตระกูล CPU ไม่เกี่ยวข้องที่นี่

  • CPU (s) = ฟิสิคัลซ็อกเก็ต
  • แกน (s) ต่อซ็อกเก็ต - ตามที่ระบุไว้
  • จำนวนคอร์ทั้งหมดดังนั้น= CPU (s) * Core (s) ต่อซ็อกเก็ต

ในกรณีของคุณคุณมีทั้งหมด 4 คอร์

สิ่งที่อาจมีความสำคัญก็คือ "กระทู้ต่อแกน" แต่คุณมี 1 ไม่ใช่ในกรณีของคุณ


1
คุณกำลังสับสน CPU กับซ็อกเก็ตในคำอธิบายของคุณ
jlliagre

1
อย่างที่ jlliagre บอกว่ามันไม่ถูกต้อง Cores = Cores per socket X Socketsดูคำอธิบายในคำตอบของฉัน
htaccess

-3

วิธีง่ายๆในการคำนวณจำนวน CPU คือการออกคำสั่งด้านล่าง:

cat /proc/interrupts | egrep -i 'cpu'

1
อินเตอร์รัปต์หรือ cpuinfo
Jeff Schaller

และนับด้วยตัวเลือก -c?
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.