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

Как вы можете сказать, из командной строки, сколько ядер находится на компьютере, когда вы используете Mac OS X? В Linux я использую:

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

Это не идеально, но это близко. Это предназначено для подачи на make, поэтому он дает результат 1 выше фактического числа. И я знаю, что приведенный выше код может быть написан более плотным в Perl или может быть написан с использованием grep, wc и cut, но я решил, что это было хорошим компромиссом между лаконичностью и удобочитаемостью.

ОЧЕНЬ ПОСЛЕДНИЙ РЕДАКТИРОВАТЬ: Просто пояснить: я спрашиваю, сколько логических ядер доступно, потому что это соответствует тому, сколько одновременных заданий я хочу, чтобы make появлялся. Ответ jkp, уточненный Крисом Ллойдом, был именно тем, что мне нужно. YMMV.

Ответ 1

Вы можете сделать это с помощью утилиты sysctl :

sysctl -n hw.ncpu

Ответ 2

Еще проще:

sysctl -n hw.ncpu

Ответ 3

Это должна быть кросс-платформа. По крайней мере, для Linux и Mac OS X.

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

Немного медленный, но работает.

Ответ 4

Для этого в 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.

Ответ 5

system_profiler SPHardwareDataType показывает, что у меня 1 процессор и 4 ядра.

[~] system_profiler SPHardwareDataType Оборудование:

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% времени процессора (сверху):

PID COMMAND% CPU
4306 наверх 5.6
4304 java 745,7 4296 locationd 0.0

Ответ 6

$ system_profiler | grep 'Total Number Of Cores'

Ответ 7

Используйте system_profiler | grep "Cores" Команда system_profiler | grep "Cores".

У меня есть:

MacBook Pro Retina, середина 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 ядрами (длинные задания компиляции?), Не прерывая другие процессы.

Запуск компилятора, параллелизованного с четырьмя ядрами, не оказывает существенного влияния на обычные операции ОС. Так что, возможно, рассматривать его как 8 ядер не так уж и плохо.

Ответ 8

Как сказано в комментарии jkp, это не показывает фактическое количество физических ядер. для получения количества физических ядер вы можете использовать следующую команду:

system_profiler SPHardwareDataType

Ответ 9

Следующая команда дает вам всю информацию о вашем CPU

$ sysctl -a | sort | grep cpu

Ответ 10

РАЗЪЯСНЕНИЕ

Когда этот вопрос был задан, ОП не сказал, что ему требуется количество ЛОГИЧЕСКИХ ядер, а не фактическое количество ядер, поэтому этот ответ логически (без каламбура) отвечает способом получить фактическое количество реальных физических ядер, а не число, которое ОС пытается виртуализировать с помощью гиперпотока voodoo.

ОБНОВЛЕНИЕ ДЛЯ ОБРАБОТКИ ЛОГИСТИКИ В YOSEMITE

Из-за странной ошибки в OS X Yosemite (и, возможно, более новых версиях, таких как предстоящий El Capitan), я сделал маленький модификация. (Старая версия все еще работала отлично, если вы просто игнорируете STDERR, и это все модификация для вас.)


Каждый другой ответ, указанный здесь,

  • предоставляет неверную информацию
  • не дает информации из-за ошибки в реализации команды
  • работает невероятно медленно (требуется большая часть минуты для завершения) или
  • дает слишком много данных и, следовательно, может быть полезно для интерактивного использования, но бесполезно, если вы хотите использовать данные программно (например, в качестве ввода команды типа bundle install --jobs 3, где вы хотите, чтобы вместо 3 быть меньше, чем количество ядер, которые у вас есть, или, по крайней мере, не больше, чем количество ядер)

Способ получить только количество ядер, надежно, правильно, достаточно быстро и без дополнительной информации или даже дополнительных символов вокруг ответа:

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

Ответ 11

На 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

Ответ 12

Комментарии для 2 хороших ответов выше:

1) re принятый ответ (и комментарии) jkp: hw.ncpu, по-видимому, устарел в пользу hw.logicalcpu(https://ghc.haskell.org/trac/ghc/ticket/8594)

2) обновление 2014 года Karl Ehr: на моем компьютере (с 2,5 ГГц 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

Ответ 13

Это можно сделать более переносимым способом:

$ nproc --all
32

Совместимо с macOS и Linux.