วิธีการค้นหาจำนวน * ลอจิก * แกนบน Mac OS X


381

คุณจะบอกได้อย่างไรจากบรรทัดคำสั่งว่ามีคอร์จำนวนเท่าใดบนเครื่องเมื่อคุณใช้ Mac OS X บน Linux ฉันใช้:

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

มันไม่สมบูรณ์แบบ แต่ใกล้กัน นี่มีวัตถุประสงค์เพื่อให้ได้รับการป้อนmakeซึ่งเป็นสาเหตุที่ทำให้ได้ผลลัพธ์ 1 สูงกว่าจำนวนที่แท้จริง และฉันรู้ว่าโค้ดข้างต้นสามารถเขียนได้หนาแน่นขึ้นใน Perl หรือสามารถเขียนได้โดยใช้ grep, wc และ cut แต่ฉันตัดสินใจว่าข้างต้นเป็นข้อตกลงที่ดีระหว่างความกระชับและความสามารถในการอ่าน

แก้ไข LATE มากเพียงเพื่อชี้แจง: ฉันถามจำนวนแกนตรรกะที่มีอยู่เพราะสิ่งนี้สอดคล้องกับงานพร้อมกันจำนวนมากที่ฉันต้องการmakeวางไข่ คำตอบ JKP ของการกลั่นต่อไปโดยคริสลอยด์เป็นว่าสิ่งที่ฉันต้องการ YMMV


สำหรับ linux ฉันหลีกเลี่ยงการเพิ่มโดยใช้:grep ^processor /proc/cpuinfo | wc -l
courtlandj

3
ดูstackoverflow.com/questions/6481005/…หมายเหตุnprocคำสั่ง
Mike DeSimone

ขอโทษถ้าเป็นคำถาม noob แต่เมื่อคุณหมายถึงแกนตรรกะคุณหมายถึงแกนร่างกายหรือไม่ เงื่อนไขต่างกันอย่างไร (หรือไม่) เพียงเข้าใจสิ่งที่คุณขอให้ดีขึ้น
Charlie Parker

ไม่ฉันไม่ได้หมายถึงแกนกลางทางกายภาพ ฟิสิคัลคอร์คือกลุ่มของทรานซิสเตอร์บนชิปที่ใช้คอร์ ตรรกะหลักคือสิ่งที่ดูเหมือนจะเป็นแกนหลักของระบบปฏิบัติการและโปรแกรมผู้ใช้ ในกรณีจำนวนมากสิ่งเหล่านี้เหมือนกัน อย่างไรก็ตามเทคโนโลยี Hyperthreading ของ Intel (และอื่น ๆ ) ทำให้แต่ละคอร์ทางกายภาพปรากฏเป็นสองแกนตรรกะ
Mike DeSimone

คำตอบ:


796

คุณสามารถทำได้โดยใช้ยูทิลิตีsysctl :

sysctl -n hw.ncpu

6
ในกลางปี ​​2011 MacBook Air 1.7GHz คำสั่งนี้บอกว่า 4 อย่างไรก็ตามฉันสงสัยว่ามันมีแค่ 2 คอร์เท่านั้นและ system_profiler SPHardwareDataType ดูเหมือนจะเห็นด้วย คุณสามารถอธิบายความแตกต่างได้หรือไม่?
Joshua Flanagan

13
@JoshuaFlanagan มีเครื่องฟิสิคัลคอร์กี่เครื่องและชิพคืออะไร ถ้าเป็นคอร์ i7 ที่มีฟิสิคัลคอร์ 2 คอร์มันจะแสดงเป็น 4 เพราะชิพรองรับไฮเปอร์เธรดและนำเสนอตัวเองไปยังระบบปฏิบัติการราวกับว่ามันมี 4 คอร์แอดเดรส
jkp

142
ถ้าคุณสนใจลองsysctl hw.physicalcpuหรือsysctl hw.logicalcpuโดยทั่วไปsysctl hwสำหรับตัวเลือกทั้งหมด
Coder ความยาวแปรผัน

23
บรรณาธิการ: โปรดอย่าเปลี่ยนคำตอบปีหลังจากฉันได้รับการยอมรับ
Mike DeSimone

2
ไม่ทำงานในช่วงต้นปี 2015 Mac ที่ใช้ El Capitan ฉันได้รับ "ข้อผิดพลาด:" hw.ncpu "เป็นรหัสที่ไม่รู้จัก" ไม่มีรายการที่เกี่ยวข้องกับ cpu ใน /etc/sysctl.conf เช่นกัน คำตอบของ Frozen Flame ทำงานแล้ว
TheGT

130

ง่ายยิ่งขึ้น:

sysctl -n hw.ncpu

2
จำนวนที่รายงานโดยสิ่งนี้จริง ๆ แล้วเป็นสองเท่าของจำนวนแกนประมวลผลที่คุณรองรับโปรเซสเซอร์ไฮเปอร์เธรด
mikeazo

3
สิ่งนี้ให้ฉัน 4 แต่เมื่อฉันใช้system_profiler SPHardwareDataTypeซึ่งฉันเชื่อได้ว่า `ตัวระบุรุ่น: MacBookPro9,2 ชื่อหน่วยประมวลผล: Intel Core i5 ความเร็วหน่วยประมวลผล: 2.5 GHz จำนวนโปรเซสเซอร์: 1 จำนวนแกนทั้งหมด:
2`


18

ในการทำเช่นนี้ใน C คุณสามารถใช้ฟังก์ชัน 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.

ไมค์ขอบคุณสำหรับการแก้ไขไม่ทราบว่า oldplen เป็นพารามิเตอร์เข้า
alfwatt

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 ทั้งหมดฉันเห็นโปรแกรมนี้ใช้เวลา CPU เกือบ 800% (ในtop):

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

3
คุณเห็น Hyperthreading ในที่ทำงาน สิ่งนี้ทำให้แต่ละคอร์จัดการกับสองเธรดการทำงาน (ไม่จำเป็นต้องเหมือนกับเธรด OS เช่น pthreads) ดังนั้น MacOS จึงถือว่าแต่ละคอร์เป็นฟิสิคัลคอร์สองคอร์
Mike DeSimone

สวัสดี @MikeDeSimone คุณสามารถแสดงวิธีการตรวจสอบว่าเธรดไฮเปอร์ที่ทำงานในกรณีของ CentOS หรือไม่?
Ciasto piekarz


@Ciastopiekarz ฉันค่อนข้างแน่ใจว่าเธรดไฮเปอร์เป็นคุณสมบัติของสถาปัตยกรรม CPU (Intel) มากกว่าสิ่งที่ระบบปฏิบัติการทำฉันคิดว่าจุดทั้งหมดคือการทำให้ระบบปฏิบัติการคิดว่ามันมี cpu ทางกายภาพ: sx 2 แกนตรรกะโดยไม่ต้องทำอะไรเลย พิเศษในการเข้าถึงพวกเขา ดังนั้นหาก CPU ของคุณเป็น Intel (Mac ทุกเครื่องมาพร้อมกับ Intel) ใช่คุณมีเธรดมากเกินไป อย่างไรก็ตามหากคุณใช้งาน CentOS บนพีซีคุณอาจมีโปรเซสเซอร์ AMD พวกเขาไม่มีเธรดไฮเปอร์ แต่เนื่องจากพวกเขามักจะมาพร้อมกับสองแกนเป็นจำนวนมากในราคาเดียวกัน (หรือต่ำกว่า) ฉันไม่แน่ใจว่ามีความแตกต่างในทางปฏิบัติ
Erk

@Erk ระบบปฏิบัติการรู้ถึงความแตกต่างที่จริงแล้วมันรู้ถึงความแตกต่างระหว่าง CPU และ Cores รวมถึงหลายเธรดที่ทำงานบนฟิสิคัล sysctl hw.physicalcpuจะแสดงจำนวนซีพียูฟิสิคัลคอร์ที่พร้อมใช้งานสำหรับคุณsysctl hw.logicalcpuจะแสดงจำนวนซีพียูเชิงตรรกะที่มีให้คุณ ระบบปฏิบัติการเช่น Windows / OSX / Linux ทำทุกอย่างเพื่อให้ดูเหมือนว่าคุณมี CPU หลายตัว (ไม่ว่ามันจะเป็นประเภทใด) ระบบปฏิบัติการเช่น linux อนุญาตให้คุณตั้งค่า cpu, แกน, เธรดที่สามารถใช้ได้
Rahly

10
$ system_profiler | grep 'Total Number Of Cores'

2
เร็วกว่า: $ system_profiler SPHardwareDataType | grep 'จำนวนของแกน'
เคนท์

6
ช้าลงหากคุณรวมเวลาในการพิมพ์
เครื่องหมายประสิทธิภาพสูง

2
มันอยู่ในสคริปต์ทุบตี; เวลาในการพิมพ์ไม่เกี่ยวข้อง
Mike DeSimone

3
ดูเหมือนว่า Apple ได้เปลี่ยนการจัดรูปแบบของผลลัพธ์ สังเกตว่าตัวพิมพ์ใหญ่: ก่อนหน้านี้คือ 'จำนวนรวมของคอร์' ตอนนี้มันเป็น 'จำนวนรวมของคอร์' ... ไม่ว่าจะเป็นหรือฉันเพิ่งพิมพ์ผิดก่อนหน้านี้ ... ขอโทษด้วย!
kent

3
คุณสามารถใช้grep -i
Skylar Saveland

8

ใช้system_profiler | grep "Cores"คำสั่ง

ฉันมี:

MacBook Pro Retina กลางปี ​​2555

หน่วยประมวลผล: 2.6 GHz Intel Core i7

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

user$ sysctl -n hw.ncpu
8

อ้างอิงจาก Wikipedia ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) ไม่มี Core i7 ที่มี 8 คอร์ทางกายภาพดังนั้นแนวคิดHyperthreadingจะต้องเป็นจริง ละเว้นsysctlและใช้system_profilerค่าเพื่อความถูกต้อง คำถามจริงคือคุณสามารถรันแอปพลิเคชั่นได้อย่างมีประสิทธิภาพด้วย 4 คอร์ (งานคอมไพล์แบบยาวหรือไม่) โดยไม่ขัดจังหวะกระบวนการอื่น ๆ

การเรียกใช้คอมไพเลอร์แบบขนานที่มี 4 คอร์จะไม่ส่งผลกระทบต่อการทำงานของระบบปฏิบัติการปกติอย่างมาก ดังนั้นบางทีการรักษามันเป็น 8 คอร์ก็ไม่เลว


1
การวางไข่จำนวนกระบวนการเท่ากับจำนวนแกนตรรกะ (สองเท่าของจำนวนฟิสิคัลคอร์ในกรณีของ HyperThreading ตามที่คุณทราบ) มีประสิทธิภาพค่อนข้างดีสำหรับฉัน
Mike DeSimone

7

อย่างที่ jkp พูดในคอมเม้นว่านั่นไม่แสดงจำนวนจริงของแกนประมวลผล เพื่อรับจำนวนฟิสิคัลคอร์คุณสามารถใช้คำสั่งต่อไปนี้:

system_profiler SPHardwareDataType

เป้าหมายคือเพื่อกำหนดจำนวนกระบวนการที่จะวางไข่makeดังนั้นคำตอบของ jkp (จำนวนแกนตรรกะ) จึงเหมาะสมที่สุด
Mike DeSimone

3

คำสั่งต่อไปนี้ให้ข้อมูลทั้งหมดเกี่ยวกับ CPU ของคุณ

$ sysctl -a | sort | grep cpu

ดี แต่ไม่ใช่สิ่งที่ถูกถาม
Mike DeSimone

1

ชี้แจง

เมื่อคำถามนี้ถูกถาม OP ไม่ได้พูดว่าเขาต้องการจำนวนตรรกะแกนมากกว่าที่เกิดขึ้นจริงจำนวนแกนดังนั้นคำตอบนี้มีเหตุผล (ไม่มีเล่นสำนวนเจตนา) คำตอบด้วยวิธีการที่จะได้รับที่เกิดขึ้นจริงจำนวนแกนทางกายภาพจริงไม่ได้ หมายเลขที่ระบบปฏิบัติการพยายามทำเวอร์ชวลไลเซชันผ่านไฮเปอร์เธรด voodoo

อัปเดตเพื่อจัดการข้อบกพร่องในโยเซมิตี

เนื่องจากข้อผิดพลาดแปลก ๆใน 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บน Mac Pro ของฉันและไม่มีปัญหาเหล่านั้น
Mike DeSimone

เห็นได้ชัดว่าฉันไม่ได้ทดสอบกับ Mac ทุกประเภท แต่ฉันจะเชื่อว่าบางครั้งมันก็แม่นยำ อย่างไรก็ตามsysctlไม่ได้ให้ผลลัพธ์ที่ถูกต้องในเครื่องของฉันและคนอื่น ๆ ก็รายงานสิ่งเดียวกัน หากไม่สามารถเชื่อถือได้เพื่อให้ได้ผลลัพธ์ที่ถูกต้องอยู่เสมอก็ไม่สามารถพิจารณาได้ว่าน่าเชื่อถือและแม่นยำ
iconoclast

คุณสามารถอธิบายพฤติกรรมที่ผิดพลาดที่คุณเห็นได้และแพลตฟอร์มใดที่คุณเห็นบนดังนั้นขอบเขตของsysctlการดำเนินการที่เหมาะสมนั้นเป็นที่รู้จักกันดีกว่าเช่นที่ผู้ใช้ทำ 1706991
Mike DeSimone

คนอื่น ๆ แนะนำว่าสิ่งนี้เกิดจากการทำเกลียวมากเกินไปดังนั้นจำนวนที่คุณเห็นด้วย sysctl คือจำนวนแกนประมวลผลที่ระบบพยายามจำลองแม้ว่ามันจะไม่ได้มีจำนวนมากก็ตาม หากคุณต้องการตัวเลขที่แม่นยำให้ใช้วิธีการของฉัน หากคุณต้องการทราบว่าคอมพิวเตอร์มีแกนจำนวนเท่าใดที่กำลังแกล้งทำให้ใช้ sysctl
iconoclast

@iconoclast ในการทดสอบพบว่า 'จำนวนรวมของคอร์' เป็นภาษาท้องถิ่น หาก OS X ถูกตั้งค่าเป็นอะไรยกเว้นภาษาอังกฤษโซลูชันของคุณล้มเหลว ลงเอยด้วยการใช้:sysctl -n hw.physicalcpu_max
CO

1

บนMacBook Pro ทำงาน Mavericks , 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 Mac Pro ของฉันที่ให้ฉัน 4 จำนวนแกนที่แท้จริงคือ 8 เนื่องจากมีชิปซีพียูแบบ quad-core สองตัว
Mike DeSimone

sysctl machdep.cpu ยังทำงานแทนการอ่านข้อมูลที่ไม่จำเป็นอื่น ๆ ทั้งหมด
hsn

1

ไม่ได้ระบุไว้ในคำถามเดิม (แม้ว่าฉันจะเห็นโพสต์ OP ในความคิดเห็นว่านี่ไม่ใช่ตัวเลือก) แต่นักพัฒนาซอฟต์แวร์จำนวนมากใน macOS ได้ติดตั้งตัวจัดการแพคเกจ Homebrew

สำหรับนักพัฒนาในอนาคตที่สะดุดกับคำถามนี้ตราบใดที่มีข้อสันนิษฐาน (หรือข้อกำหนด) ของ Homebrew ที่ติดตั้งอยู่ (เช่นในองค์กรวิศวกรรมใน บริษัท ) nprocเป็นหนึ่งในไบนารี GNU ทั่วไปที่รวมอยู่ในcoreutilsแพ็คเกจ

brew install coreutils

หากคุณมีสคริปต์ที่คุณต้องการเขียนหนึ่งครั้ง (สำหรับ Linux + macOS) แทนที่จะเป็นสองครั้งหรือเพื่อหลีกเลี่ยงการifบล็อกที่คุณต้องตรวจสอบระบบปฏิบัติการเพื่อให้ทราบว่าจะเรียกnprocvs หรือไม่sysctl -n hw.logicalcpuนี่อาจเป็นตัวเลือกที่ดีกว่า


0

ความคิดเห็นสำหรับ 2 คำตอบที่ดีด้านบน:

1) การตอบกลับที่ยอมรับ (และความคิดเห็น) โดย jkp: hw.ncpu เห็นได้ชัดว่าเลิกใช้แล้วในความโปรดปรานของ hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) การอัปเดต 2014 อีกครั้งโดย Karl Ehr: บนคอมพิวเตอร์ของฉัน (ด้วย 2.5 ghz intel core 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 และ Linux


2
nprocดูเหมือนจะไม่สามารถใช้งานได้บน macOS Mojave
Mike DeSimone

ขอบคุณที่ให้ฉันรู้ไมค์ nprocเป็นการติดตั้งเล็กน้อยผ่าน homebrew
Jay Taylor

ระบบที่ฉันเรียกใช้นั้นถูกตัดการเชื่อมต่อจากอินเทอร์เน็ตดังนั้น homebrew จึงไม่ช่วยอะไร ไม่สามารถใช้สิ่งที่ต้องการ "เว็บไซต์ curl | sudo bash"
Mike DeSimone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.