Як виявити кількість * логічних * ядер на Mac OS X?


381

Як ви можете в командному рядку сказати, скільки ядер на машині, коли ви працюєте з Mac OS X? У Linux я використовую:

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

Це не ідеально, але це близько. Це призначене для годування make, тому це дає результат на 1 вищий від фактичного. І я знаю, що наведений вище код може бути записаний щільніше в Perl або може бути написаний за допомогою grep, wc та cut, але я вирішив, що вищезгадане є хорошим компромісом між стислістю та читальністю.

ДУЖЕ ПОСТАВЛЕНО редагування: Просто для уточнення: я запитую, скільки доступних логічних ядер, тому що це відповідає кількості одночасних завдань, які я хочу makeстворити. Відповідь jkp, уточнена Крісом Ллойдом, була саме тим , що мені було потрібно. YMMV.


Для Linux я уникаю додавати його, використовуючи:grep ^processor /proc/cpuinfo | wc -l
courtlandj

3
Дивіться stackoverflow.com/questions/6481005/… Зауважте nprocкоманду.
Майк Десимоне

Вибачте, якщо це питання нуб, але коли ви маєте на увазі логічні ядра, ви маєте на увазі фізичні ядра? Чим терміни відрізняються (чи ні)? Просто, щоб зрозуміти, що ваші запитання краще.
Чарлі Паркер

Ні, я не маю на увазі фізичні ядра. Фізичне ядро ​​- це група транзисторів на мікросхемі, яка реалізує ядро. Логічне ядро ​​- це те, що виявляється ядром для операційної системи та програм користувача. У величезній кількості випадків такі самі. Однак технологія Hyperthreading від Intel (і, можливо, інші) робить кожне фізичне ядро ​​виданим як два логічних ядра.
Майк Десимоне

Відповіді:


796

Це можна зробити за допомогою утиліти sysctl :

sysctl -n hw.ncpu

6
У середині 2011 року на MacBook Air 1.7 ГГц ця команда каже 4. Однак я підозрював, що у неї є лише 2 ядра, і системний_профілер SPHardwareDataType, схоже, згоден. Чи можете ви пояснити розбіжність?
Джошуа Фланаган

13
@JoshuaFlanagan, скільки фізичних ядер має машина і яка мікросхема? Якщо, наприклад, це ядро ​​i7 з 2 фізичними ядрами, воно відображатиметься як 4, оскільки мікросхема підтримує гіперточку і представляє ОС, як якщо б вона мала 4 адреси ядра.
jkp

142
Якщо вам дійсно все одно, спробуйте sysctl hw.physicalcpuабо sysctl hw.logicalcpuвзагалі sysctl hwдля всіх варіантів.
Кодер змінної довжини

23
Редактори: Будь ласка, не змінюйте відповідь через роки після того, як я її прийняв.
Майк Десімоне

2
Не працює на Mac Mac на початку 2015 року під керуванням El Capitan. Я отримую "помилку:" hw.ncpu "- невідомий ключ". Також в /etc/sysctl.conf немає запису, пов'язаного з процесором. Відповідь замороженого полум'я спрацювала.
TheGT

130

Ще простіше:

sysctl -n hw.ncpu

2
Кількість, про яку повідомляється, насправді вдвічі перевищує кількість ядер, оскільки ваш процесор підтримує гіпер-нарізку.
mikeazo

3
це дає мені 4, але коли я використовую, system_profiler SPHardwareDataTypeщо я можу повірити `Ідентифікатор моделі: MacBookPro9,2 Назва процесора: Intel Core i5 Швидкість процесора: 2,5 ГГц Кількість процесорів: 1 Загальна кількість ядер: 2`
Ciasto piekarz

31

Це має бути крос-платформа. Принаймні для Linux та Mac OS X.

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

Трохи повільно, але працює.


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 - параметр входу.
Альфват

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 видається правильним, тому що коли я запускаю програму, яка повинна займати всі слоти процесора, я бачу, що ця програма займає близько 800% часу (в top) процесора :

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

3
Ви бачите Hyperthreading на роботі. Це дозволяє кожному ядру обробляти два потоки виконання (не обов'язково такі ж, як потоки ОС, наприклад, pthreads). В результаті MacOS розглядає кожне фізичне ядро ​​як два логічних ядра.
Майк Десимоне

Привіт @MikeDeSimone, чи можете ви мені показати, як перевірити, чи є гіпер-нарізка на роботі у випадку CentOS?
Ciasto piekarz


@Ciastopiekarz Я досить впевнений, що гіпер-нарізка є особливістю архітектури процесора (Intel), а не те, що робить ОС, я думаю, вся справа в тому, щоб ОС думала, що вона має фізичний процесор: sx 2 логічні ядра, не робити нічого спеціальні для доступу до них. Отже, якщо ваш процесор - це Intel (усі Macs поставляються з Intel), то так, у вас є гіпер-нитка. Якщо, однак, ви запускаєте CentOS на ПК, у вас може бути процесор AMD. У них немає гіперструзійної нарізки, але оскільки вони зазвичай мають вдвічі більше ядер за однакову (або нижчу) ціну, я не впевнений, що є практична різниця.
Ерк

@Erk ОС знає різницю, насправді вона знає різницю між процесорами та ядрами, а також декількома потоками, що працюють на фізичному. sysctl hw.physicalcpuпокаже, скільки фізичних ядер процесора доступні для вас, sysctl hw.logicalcpuпокаже, скільки логічних процесорів доступні вам. ОС, як Windows / OSX / Linux, виконує всю роботу, створюючи враження, що у вас є декілька процесорів (незалежно від типу цього типу). ОС на зразок linux дозволяє налаштувати, які процесори, сердечники, потоки можна використовувати.
Рахлі

10
$ system_profiler | grep 'Total Number Of Cores'

2
швидше: $ system_profiler SPHardwareDataType | grep 'Загальна кількість ядер'
кент

6
повільніше, хоча ви включаєте час набору тексту
Висока продуктивність відмітка

2
Це в баш-сценарії; час набору тексту не має значення.
Майк Десимоне,

3
здається, що Apple змінила форматування вихідного сигналу. Зверніть увагу на використання великих букв: раніше було "Загальна кількість ядер", тепер це "Загальна кількість ядер" ... або це, або я раніше неправильно набрав його ... вибачте за це!
Кент

3
ви могли б використовувати grep -i
Skylar Saveland

8

Використовуйте system_profiler | grep "Cores"команду.

Я маю:

Retina MacBook Pro, середина 2012 року.

Процесор: 2,6 ГГц Intel Core 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 ) немає Core i7 з 8 фізичними ядрами, тому ідея Hyperthreading повинна бути такою. Ігноруйте sysctlта використовуйте system_profilerзначення для точності. Справжнє питання полягає в тому, чи можна ефективно запускати програми з 4 ядрами (довгі завдання компіляції?), Не припиняючи інших процесів.

Запуск компілятора, паралелізованого на 4 ядра, не впливає кардинально на звичайні операції з ОС. Тож, можливо, поводження з нею як 8 ядер не так вже й погано.


1
Нерестування декількох процесів, рівних кількості логічних ядер (удвічі більше фізичних ядер у випадку HyperThreading, як ви зазначаєте) для мене пройшло досить добре.
Майк Десимоне

7

Як сказав jkp у коментарі, це не показує фактичну кількість фізичних ядер. щоб отримати кількість фізичних ядер, ви можете скористатися такою командою:

system_profiler SPHardwareDataType

Метою було визначити, скільки процесів нерестувати make, тому відповідь jkp (кількість логічних ядер) найкраще підходить.
Майк Десімоне


1

ПОЯСНЕННЯ

На це запитання ОП не сказав, що він бажає кількості ЛОГІЧНИХ ядер, а не фактичну кількість ядер, тому ця відповідь логічно (не каламбур) відповідає, щоб отримати фактичну кількість реальних фізичних ядер, а не число, яке ОС намагається віртуалізувати через гіпертуманну вуду.

ОНОВЛЕННЯ ДЛЯ РЕЧЕННЯ ВІДОМОСТІ В 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на своєму Mac Pro і не мав жодної з цих проблем.
Майк Десимоне

Я, очевидно, не тестував на всіх типах Mac, але я вірю, що іноді це точно. Однак sysctlне дає точних результатів на моїй машині, і інші повідомили те саме. Якщо на нього не можна покластися, щоб завжди давати точні результати, то це не може вважатися надійним і точним.
іконоборство

Ви також можете пояснити помилкову поведінку, яку ви бачите, і на якій платформі (платформах) ви бачите це, так що межі sysctlналежної роботи більш відомі, як користувач1706991.
Майк Десимоне

Інші припустили, що це пов’язано з гіпер-ниткою, тому число, яке ви бачите в sysctl, - це кількість ядер, які система намагається імітувати, хоча насправді їх не так багато. Якщо ви хочете точних цифр, використовуйте мій метод. Якщо ви хочете знати, скільки ядер претендує на комп’ютер, використовуйте sysctl.
іконоборство

@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) ви побачите загальний перерахований кількість процесора ( logical_per_package) удвічі більший за кількість фізичних ядер ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package

У моєму Mac Mac Pro на початку 2008 року це дає 4. Дійсна кількість ядер становить 8, оскільки у неї є два чотириядерні процесорні мікросхеми.
Майк Десимоне,

sysctl machdep.cpu також працює замість того, щоб читати всю іншу непотрібну інформацію.
hsn

1

Це не було вказано в первісному запитанні (хоча я бачив публікацію ОП у коментарях, що це не варіант), але у багатьох розробників на macOS встановлений менеджер пакунків Homebrew.

Для майбутніх розробників, які натрапляють на це питання, доки існує припущення (або вимога) програми 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 )

2) повторне оновлення Карла Ера 2014 року: на моєму комп’ютері (з 2,5 ГГц Intel i7 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.
Майк Десимоне

Дякую, що повідомили мені, Майк. nproc- тривіальна установка через домашню мову.
Джей Тейлор

Система, яку я працював, була відключена від Інтернету, тому домашня мова не допомагає. Не вдається використати щось, що потрібно для "curl site | sudo bash"
Майк Десимоне,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.