Làm cách nào để khám phá số lõi * logic * trên Mac OS X?


382

Làm thế nào bạn có thể biết, từ dòng lệnh, có bao nhiêu lõi trên máy khi bạn đang chạy Mac OS X? Trên Linux, tôi sử dụng:

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

Nó không hoàn hảo, nhưng nó gần. Điều này được dự định để được cho ăn make, đó là lý do tại sao nó cho kết quả cao hơn 1 so với con số thực tế. Và tôi biết đoạn mã trên có thể được viết dày hơn bằng Perl hoặc có thể được viết bằng grep, wc và cut, nhưng tôi đã quyết định ở trên là một sự đánh đổi tốt giữa sự đồng nhất và dễ đọc.

EDIT RẤT LỚN: Chỉ cần làm rõ: Tôi đang hỏi có bao nhiêu lõi logic , bởi vì điều này tương ứng với bao nhiêu công việc đồng thời tôi muốn makesinh ra. Câu trả lời của jkp, được tinh chỉnh thêm bởi Chris Lloyd, chính xác là những gì tôi cần. YMMV.


Đối với linux, tôi tránh phải thêm một cái bằng cách sử dụng:grep ^processor /proc/cpuinfo | wc -l
Courtlandj


xin lỗi nếu đây là một câu hỏi không nhưng khi bạn nói lõi hợp lý thì bạn có nghĩa là lõi vật lý? Làm thế nào là các điều khoản khác nhau (hoặc không)? Chỉ để hiểu những gì bạn yêu cầu tốt hơn.
Charlie Parker

Không, tôi không có nghĩa là lõi vật lý. Lõi vật lý là một nhóm các bóng bán dẫn trên chip thực hiện lõi. Lõi logic là thứ dường như là lõi đối với hệ điều hành và chương trình người dùng. Trong số lượng lớn các trường hợp, đây là như nhau. Tuy nhiên, công nghệ Hyperthreading của Intel (và có thể cả những người khác) làm cho mỗi lõi vật lý xuất hiện dưới dạng hai lõi logic.
Mike DeSimone

Câu trả lời:


797

Bạn có thể làm điều này bằng cách sử dụng tiện ích sysctl :

sysctl -n hw.ncpu

6
Trên MacBook Air 1.7GHz giữa năm 2011, lệnh này cho biết 4. Tuy nhiên, tôi nghi ngờ nó thực sự chỉ có 2 lõi và system_profiler SPHardwareDataType dường như đồng ý. Bạn có thể giải thích sự khác biệt?
Joshua Flanagan

13
@JoshuaFlanagan Máy có bao nhiêu lõi vật lý và nó là con chip gì? Ví dụ, nếu đó là lõi i7 với 2 lõi vật lý, nó sẽ hiển thị là 4 vì chip hỗ trợ siêu phân luồng và tự hiển thị cho HĐH như thể nó có 4 lõi có thể định địa chỉ.
jkp

142
Nếu bạn thực sự quan tâm, hãy thử sysctl hw.physicalcpuhoặc sysctl hw.logicalcpu, và nói chung sysctl hwcho tất cả các tùy chọn.
chiều dài thay đổi

23
Biên tập viên: Xin đừng thay đổi câu trả lời nhiều năm sau khi tôi chấp nhận nó.
Mike DeSimone

2
Không hoạt động trên Mac đầu năm 2015 chạy El Capitan. Tôi nhận được "lỗi:" hw.ncpu "là một khóa không xác định". Không có mục liên quan đến cpu trong /etc/sysctl.conf. Câu trả lời của Frozen Flame đã có hiệu quả.
TheGT

130

Thậm chí dễ dàng hơn:

sysctl -n hw.ncpu

2
Con số được báo cáo bởi điều này thực sự gấp đôi số lượng lõi là bộ xử lý của bạn hỗ trợ siêu phân luồng.
mikeazo

3
cái này mang lại cho tôi 4, nhưng khi tôi sử dụng system_profiler SPHardwareDataTypemà tôi có thể tin được `Bộ nhận dạng mẫu: MacBookPro9,2 Tên bộ xử lý: Intel Core i5 Bộ xử lý Tốc độ: 2,5 GHz Số lượng bộ xử lý: 1 Tổng số lõi: 2`
Ciasto piekarz

31

Điều này nên được đa nền tảng. Ít nhất là đối với Linux và Mac OS X.

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

Một chút chậm nhưng hoạt động.


18

Để thực hiện điều này trong C, bạn có thể sử dụng họ hàm 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);

Các giá trị thú vị được sử dụng thay cho "hw.logicalcpu", tính các lõi, là:

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.

Mike, cảm ơn vì đã chỉnh sửa, đã không nhận ra rằng oldplen là một tham số ngoài.
alfwatt

14

system_profiler SPHardwareDataType cho thấy tôi có 1 bộ xử lý và 4 lõi.

[~] 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>

[~] 

Tuy nhiên, sysctl không đồng ý:

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

Nhưng sysctl có vẻ đúng, vì khi tôi chạy một chương trình chiếm hết tất cả các khe CPU, tôi thấy chương trình này chiếm gần 800% thời gian CPU (in top):

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

3
Bạn đang thấy Hyperthreading tại nơi làm việc. Điều này cho phép mỗi lõi xử lý hai luồng thực thi (không nhất thiết phải giống như các luồng của hệ điều hành, chẳng hạn như pthreads). Kết quả là, MacOS coi mỗi lõi vật lý là hai lõi logic.
Mike DeSimone

Xin chào @MikeDeSimone, bạn có thể chỉ cho tôi cách kiểm tra xem siêu phân luồng tại nơi làm việc trong trường hợp của CentOS không?
Ciasto piekarz


@Ciastopiekarz Tôi khá chắc chắn siêu phân luồng là một tính năng của kiến ​​trúc CPU (Intel) chứ không phải là điều mà HĐH làm, tôi nghĩ rằng toàn bộ vấn đề là làm cho HĐH nghĩ rằng nó có lõi logic cpu: sx 2 mà không phải làm gì cả đặc biệt để truy cập chúng. Vì vậy, nếu CPU của bạn là Intel (tất cả các máy Mac đều đi kèm với Intel) thì có, bạn có siêu phân luồng. Tuy nhiên, nếu bạn chạy CentOS trên PC, bạn có thể có bộ xử lý AMD. Chúng không có siêu phân luồng nhưng vì chúng thường đi kèm với số lõi gấp đôi với cùng một mức giá (hoặc thấp hơn) nên tôi không chắc có sự khác biệt thực tế.
Erk

@Erk Hệ điều hành biết sự khác biệt, trên thực tế, nó biết sự khác biệt giữa CPU và Lõi cũng như nhiều luồng chạy trên một vật lý. sysctl hw.physicalcpusẽ hiển thị có bao nhiêu lõi cpu vật lý có sẵn cho bạn, sysctl hw.logicalcpusẽ hiển thị có bao nhiêu cpus logic có sẵn cho bạn. Các hệ điều hành như Windows / OSX / Linux thực hiện mọi công việc làm cho nó có vẻ như bạn có nhiều CPU (bất kể đó là loại gì). Hệ điều hành như linux cho phép bạn định cấu hình cpu, lõi, luồng nào có thể được sử dụng.
Rahly

10
$ system_profiler | grep 'Total Number Of Cores'

2
nhanh hơn: $ system_profiler SPHardwareDataType | grep 'Tổng số quân đoàn'
kent

6
chậm hơn nếu bạn bao gồm thời gian gõ
Đánh dấu hiệu suất cao

2
Đó là trong một kịch bản bash; thời gian gõ là không liên quan.
Mike DeSimone

3
Dường như Apple đã thay đổi định dạng của đầu ra. Lưu ý cách viết hoa: trước đây là 'Tổng số lượng lõi' bây giờ là 'Tổng số lượng lõi' ... hoặc là tôi đã gõ sai trước đó ... xin lỗi về điều đó!
kent

3
bạn có thể sử dụnggrep -i
Skylar Saveland

8

Sử dụng system_profiler | grep "Cores"lệnh.

Tôi có một:

MacBook Pro Retina, giữa năm 2012.

Bộ xử lý: Intel Core i7 2,6 GHz

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

user$ sysctl -n hw.ncpu
8

Theo Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) không có Core i7 với 8 lõi vật lý nên ý tưởng Hyperthreading phải là trường hợp. Bỏ qua sysctlvà sử dụng system_profilergiá trị cho chính xác. Câu hỏi thực sự là liệu bạn có thể chạy các ứng dụng với 4 lõi một cách hiệu quả hay không mà không làm gián đoạn các quá trình khác.

Chạy trình biên dịch song song với 4 lõi dường như không ảnh hưởng lớn đến hoạt động của hệ điều hành thông thường. Vì vậy, có lẽ coi nó là 8 lõi không phải là quá tệ.


1
Sinh ra một số quy trình bằng số lượng lõi logic (gấp đôi số lượng lõi vật lý trong trường hợp HyperThreading, như bạn lưu ý) đã thực hiện khá tốt đối với tôi.
Mike DeSimone

7

Như jkp đã nói trong một bình luận, điều đó không cho thấy số lượng lõi thực tế. để có được số lượng lõi vật lý, bạn có thể sử dụng lệnh sau:

system_profiler SPHardwareDataType

Mục tiêu là xác định có bao nhiêu quá trình sinh sản make, vì vậy câu trả lời của jkp (số lõi logic) phù hợp nhất.
Mike DeSimone

3

Lệnh sau cung cấp cho bạn tất cả thông tin về CPU của bạn

$ sysctl -a | sort | grep cpu

Đẹp, nhưng không phải những gì được yêu cầu.
Mike DeSimone

1

LÀM RÕ

Khi câu hỏi này được hỏi OP không nói rằng ông muốn số LOGIC lõi chứ không phải là thực tế số lượng lõi, vì vậy câu trả lời này một cách hợp lý (không ý định chơi chữ) câu trả lời với một cách để có được những thực tế số lượng lõi vật lý thực, không con số mà HĐH cố gắng ảo hóa thông qua voodoo siêu phân luồng.

CẬP NHẬT ĐỂ XỬ LÝ FLAW TRONG YOSEMITE

Do một lỗi kỳ lạ trong OS X Yosemite (và có thể là các phiên bản mới hơn, chẳng hạn như El Capitan sắp tới), tôi đã thực hiện một sửa đổi nhỏ. (Phiên bản cũ vẫn hoạt động hoàn hảo nếu bạn bỏ qua STDERR, đây là tất cả các sửa đổi dành cho bạn.)


Mọi câu trả lời khác được đưa ra ở đây hoặc

  1. cung cấp thông tin không chính xác
  2. không có thông tin, do lỗi trong quá trình thực hiện lệnh
  3. chạy chậm không thể tin được (mất phần tốt hơn của một phút để hoàn thành), hoặc
  4. cung cấp quá nhiều dữ liệu và do đó có thể hữu ích cho việc sử dụng tương tác, nhưng sẽ vô ích nếu bạn muốn sử dụng dữ liệu theo chương trình (ví dụ, làm đầu vào cho một lệnh như bundle install --jobs 3nơi bạn muốn số ở vị trí 3nhỏ hơn một số số lõi bạn có, hoặc ít nhất không nhiều hơn số lõi)

Cách để có được số lượng lõi, đáng tin cậy, chính xác, nhanh chóng hợp lý và không có thêm thông tin hoặc thậm chí các ký tự phụ xung quanh câu trả lời, là:

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

3
Tôi chỉ chạy sysctl -n hw.ncputrên Mac Pro của tôi và không có vấn đề nào trong số đó.
Mike DeSimone

Tôi rõ ràng chưa thử nghiệm trên tất cả các loại máy Mac, nhưng tôi sẽ tin bạn rằng điều đó đôi khi chính xác. Tuy nhiên, sysctlkhông cho kết quả chính xác trên máy của tôi và những người khác đã báo cáo điều tương tự. Nếu không thể dựa vào để luôn cho kết quả chính xác, thì nó không thể được coi là đáng tin cậy và chính xác.
iconoclast

Bạn cũng có thể giải thích hành vi sai lầm mà bạn nhìn thấy và (các) nền tảng bạn nhìn thấy trên đó, vì vậy các giới hạn của sysctlhoạt động đúng đắn được biết đến nhiều hơn, như user1706991 đã làm.
Mike DeSimone

Những người khác cho rằng đây là do siêu phân luồng, vì vậy số lượng bạn thấy với sysctl là số lõi mà hệ thống đang cố gắng mô phỏng, mặc dù thực tế nó không có nhiều. Nếu bạn muốn số chính xác, sử dụng phương pháp của tôi. Nếu bạn muốn biết máy tính đang giả vờ có bao nhiêu lõi, hãy sử dụng sysctl.
iconoclast

@iconoclast khi thử nghiệm điều này tôi thấy rằng 'Tổng số lượng lõi' được bản địa hóa. Nếu OS X được đặt thành bất cứ điều gì nhưng tiếng Anh thì giải pháp của bạn không thành công. Đã kết thúc bằng cách sử dụng:sysctl -n hw.physicalcpu_max
CO

1

Trên MacBook Pro chạy Mavericks , sysctl -a | grep hw.cpusẽ chỉ trả lại một số chi tiết khó hiểu. Thông tin chi tiết và dễ tiếp cận hơn được tiết lộ trong machdep.cpuphần, tức là:

sysctl -a | grep machdep.cpu

Đặc biệt, đối với các bộ xử lý có HyperThreading(HT), bạn sẽ thấy tổng số CPU được liệt kê ( logical_per_package) gấp đôi số lượng lõi vật lý ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package

Trên Mac Pro đầu năm 2008 của tôi, nó mang lại cho tôi 4. Số lượng lõi thực tế là 8, vì nó có hai chip CPU lõi tứ.
Mike DeSimone

sysctl machdep.cpu cũng hoạt động thay vì đọc tất cả các thông tin không cần thiết khác.
hsn

1

Nó không được chỉ định trong câu hỏi ban đầu (mặc dù tôi thấy bài đăng của OP trong các bình luận rằng đây không phải là một tùy chọn), nhưng nhiều nhà phát triển trên macOS đã cài đặt trình quản lý gói Homebrew.

Đối với các nhà phát triển trong tương lai vấp phải câu hỏi này, miễn là giả định (hoặc yêu cầu) của Homebrew được cài đặt tồn tại (ví dụ, trong một tổ chức kỹ thuật trong một công ty), nproclà một trong những nhị phân GNU phổ biến được bao gồm trong coreutilsgói.

brew install coreutils

Nếu bạn có các tập lệnh mà bạn muốn viết một lần (cho Linux + macOS) thay vì hai lần hoặc để tránh có ifcác khối nơi bạn cần phát hiện HĐH để biết có nên gọi nprocvs hay không sysctl -n hw.logicalcpu, đây có thể là một lựa chọn tốt hơn.


0

Nhận xét cho 2 câu trả lời tốt ở trên:

1) phản hồi được chấp nhận (và nhận xét) của jkp: hw.ncpu rõ ràng không được ủng hộ đối với hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) là bản cập nhật năm 2014 của Karl Ehr: trên máy tính của tôi (với 2,5 ghz intel core i7), sysctl -a | grep machdep.cpu | grep per_packagetrả về các số khác nhau:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Các giá trị mong muốn là:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Khớp:

hw.physicalcpu: 4

hw.logicalcpu: 8


0

Điều này có thể được thực hiện theo cách di động hơn:

$ nproc --all
32

Tương thích với macOS và Linux.


2
nprocdường như không có sẵn trên macOS Mojave.
Mike DeSimone

Cảm ơn đã cho tôi biết, Mike. nproclà một cài đặt tầm thường thông qua homebrew.
Jay Taylor

Hệ thống tôi đang chạy bị ngắt kết nối internet, vì vậy homebrew không giúp được gì. Không thể sử dụng bất cứ thứ gì cần "curl site | sudo bash"
Mike DeSimone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.