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

382

Как узнать из командной строки, сколько ядер на машине, когда вы работаете в 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команду.
Майк ДеСимон
извините, если это нубский вопрос, но когда вы имеете в виду логические ядра, вы имеете в виду физические ядра? Чем отличаются термины (или нет)? Просто чтобы понять, о чем ты спрашиваешь лучше.
Чарли Паркер
Нет, я не имею в виду физические ядра. Физическое ядро ​​- это группа транзисторов в микросхеме, в которой реализовано ядро. Логическое ядро ​​- это то, что кажется ядром операционной системы и пользовательских программ. В огромном количестве случаев они одинаковы. Однако технология Intel Hyperthreading (и, возможно, другие) позволяет каждому физическому ядру выглядеть как два логических ядра.
Майк ДеСимоне

Ответы:

798

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

sysctl -n hw.ncpu
JKP
источник
6
В середине 2011 года на 1,7 ГГц MacBook Air эта команда говорит 4. Однако я подозревал, что на самом деле он имеет только 2 ядра, и system_profiler SPHardwareDataType, похоже, согласен. Можете ли вы объяснить несоответствие?
Джошуа Фланаган
13
@JoshuaFlanagan Сколько физических ядер у машины и какой у нее чип? Если это, например, ядро ​​i7 с двумя физическими ядрами, оно будет отображаться как 4, потому что чип поддерживает гиперпоточность и представляет себя ОС, как если бы он имел 4 адресуемых ядра.
JKP
142
Если вам действительно все равно, попробуйте sysctl hw.physicalcpuили sysctl hw.logicalcpu, и вообще sysctl hwдля всех вариантов.
Кодер переменной длины
23
Редакторы: Пожалуйста, не меняйте ответ годами после того, как я его принял.
Майк Де Симоне
2
Не работает в начале 2015 года Mac под управлением El Capitan. Я получаю "ошибку:" hw.ncpu "это неизвестный ключ". В /etc/sysctl.conf также нет записи, связанной с процессором. Ответ Ледяного Пламени сработал.
TheGT
130

Еще проще:

sysctl -n hw.ncpu
mlbright
источник
2
Количество, сообщаемое этим, на самом деле вдвое больше числа ядер, если ваш процессор поддерживает гиперпоточность.
mikeazo
3
это дает мне 4, но когда я использую то, system_profiler SPHardwareDataTypeчто я могу поверить, `Идентификатор модели: MacBookPro9,2 Имя процессора: Intel Core i5 Частота процессора: 2,5 ГГц Количество процессоров: 1 Общее количество ядер:
2`
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.
alfwatt
источник
Майк, спасибо за редактирование, не понимал, что oldplen был параметром in-out.
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 выглядит правильно, так как, когда я запускаю программу, которая должна занимать все слоты процессора, я вижу, что эта программа занимает около 800% времени процессора (в top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
user1706991
источник
3
Вы видите Hyperthreading на работе. Это позволяет каждому ядру обрабатывать два потока выполнения (не обязательно совпадающих с потоками ОС, такими как pthreads). В результате MacOS рассматривает каждое физическое ядро ​​как два логических ядра.
Майк ДеСимоне,
Здравствуйте @MikeDeSimone. Можете ли вы показать мне, как проверить, работает ли гиперпоточность в случае CentOS?
Ciasto piekarz
1
stackoverflow.com/questions/2901694/…
Майк ДеСимон,
@ Ciastopiekarz Я вполне уверен, что гиперпоточность - это особенность архитектуры процессора (Intel), а не то, что делает ОС, я думаю, что весь смысл в том, чтобы заставить ОС думать, что она имеет физические логические ядра cpu: sx 2 без необходимости что-либо делать специально для доступа к ним. Так что, если ваш процессор Intel (все Mac поставляются с 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
хотя и медленнее, если вы включите время ввода
High Performance Mark
2
Это в сценарии bash; время ввода не имеет значения.
Майк ДеСимоне
3
похоже, что Apple изменила форматирование вывода. Обратите внимание на заглавную букву: раньше это было «Общее количество ядер», теперь это «Общее количество ядер» ... либо это, либо я просто набрал это неправильно ранее ... извините за это!
Кент
3
Вы могли бы использоватьgrep -i
Skylar Saveland
8

Используйте 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 ядер не так уж и плохо.

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

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

system_profiler SPHardwareDataType
Tohid
источник
Цель состояла в том, чтобы определить, сколько процессов порождать make, поэтому ответ jkp (количество логических ядер) подходит лучше всего.
Майк ДеСимон,
3

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

$ sysctl -a | sort | grep cpu
asmaier
источник
Хорошо, но не то, что спросили.
Майк Де Симоне
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правильной работы более известны, как это сделал пользователь 1707099.
Майк ДеСимоне
Другие предположили, что это связано с гиперпоточностью, поэтому число, которое вы видите с помощью 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 Pro в начале 2008 года это дает мне 4. Фактическое количество ядер - 8, поскольку у него есть два четырехъядерных процессора.
Майк Де Симоне
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: на моем компьютере (с процессором Intel Core i7 с частотой 2,5 ГГц) 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"
Майк