Во всяком случае, вам не нужно catраньше awk, просто awk '<script>' /proc/cpuinfoтак awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo. И вы получаете без "минус один".
Томаш Гандор
Чтобы ответить на вопрос напрямую, передайте трубку, на tail -n 1которую занимает последняя строка и печатает ее.
Обратите внимание, что оба из них в конечном итоге будут считать вдвое больше ядер, чем реально существует, если вы работаете в системе с гиперпоточностью (например, P4 или Core i7).
duskwuff -неактивный-
24
@duskwuff: это именно то, что вы хотите в большинстве случаев.
Фрэнк Кастерс
8
grep -c '^processor' /proc/cpuinfoна зш.
Стивен Лу
40
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1также вернет неправильный номер, если номера ЦП основаны на 0.
Обработка содержимого /proc/cpuinfoбез необходимости барокко. Использовать nproc который является частью coreutils, поэтому он должен быть доступен в большинстве установок Linux.
команда nproc печатает количество процессорных блоков, доступных текущему процессу, которое может быть меньше, чем количество онлайн-процессоров.
Чтобы узнать количество всех установленных ядер / процессоров используйте nproc --all
Это не работает с гиперпоточностью, если мне нужно количество физических ядер. Возвращает 8 на моей четырехъядерной коробке i7.
пратнала
1
@pratnala - ответ команды teambob дает вам количество физических ядер.
Ник Чаммас
1
На моем старом Ubuntu (10.10) nproc недоступен. Это должно быть новое дополнение.
Букзор
3
К сожалению, nprocне является частью boot2docker
kgadek
269
Самое переносимое решение, которое я нашел, это getconfкоманда:
getconf _NPROCESSORS_ONLN
Это работает как в Linux, так и в Mac OS X. Другое преимущество этого подхода по сравнению с некоторыми другими подходами заключается в том, что getconf существует уже давно. На некоторых старых Linux-машинах, на которых мне приходится заниматься разработкой, нет доступных команд nprocor lscpu, но они есть getconf.
Примечание редактора: в то время как getconfутилита является обязательной для POSIX , специфика _NPROCESSORS_ONLNи _NPROCESSORS_CONFзначения - нет. Тем не менее, как уже говорилось, они работают на платформах Linux, а также на MacOS; во FreeBSD / PC-BSD вы должны опустить ведущие _.
Это сработало для меня в Red Hat Entreprise Linux 5.4, Centos 6.5 & 7 и Mac OSX 10.9 (Mavericks). Похоже, это наиболее переносимый файл, так как lscpu по умолчанию не установлен в этих системах. Спасибо!
@BCran Я не смог найти _NPROCESSORS_ONLNв POSIX. Можете ли вы дать ссылку на него?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
3
@CiroSantilli 视 事件 法轮功 纳米比亚 威 视 С github.com/gstrauss/plasma/blob/master/plasma_sysconf.c похоже, что я ошибался: это только опционально. «sysconf _SC_NPROCESSORS_ONLN и _SC_NPROCESSORS_CONF не требуются стандартами, но предоставляются на многочисленных платформах Unix и документируются как необязательные для Open Group».
BCran
100
Предисловие:
Проблема с /proc/cpuinfo-На ответов является то , что они синтаксическая анализ информации , которая была предназначена для человеческого потребления и , следовательно , не имеет формата , предназначенный для стабильной машины разбора : выходной формат может отличаться на разных платформы и условиях среды выполнения; использование lscpu -pв Linux (и sysctlв macOS) позволяет обойти эту проблему .
getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLNне различает логические и физические процессоры.
Вот sh(POSIX-совместимый) фрагмент кода, который работает в Linux и macOS для определения количества оперативных логических или физических процессоров ; смотрите комментарии для деталей.
Использует lscpuдля Linux, иsysctl для macOS.
Примечание по терминологии : ЦП относится к наименьшей единице обработки, видимой ОС. Ядра без гиперпоточности соответствуют одному ЦП, тогда как ядра с многопоточностью содержат более 1 (обычно 2) - логического - ЦП.
Linux использует следующую таксономию [1] , начиная с самого маленького блока: CPU < ядро < сокет < книга < узел
с каждым уровнем , содержащим 1 или более экземпляров следующего более низкого уровня.
#!/bin/sh# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of # interest directly.# CAVEAT: Using the "_max" key suffixes means that the *maximum*# available number of CPUs is reported, whereas the# current power-management mode could make *fewer* CPUs # available; dropping the "_max" suffix would report the# number of *currently* available ones; see [1] below.## Linux: Parse output from `lscpu -p`, where each output line represents# a distinct (logical) CPU.# Note: Newer versions of `lscpu` support more flexible output# formats, but we stick with the parseable legacy format # generated by `-p` to support older distros, too.# `-p` reports *online* CPUs only - i.e., on hot-pluggable # systems, currently disabled (offline) CPUs are NOT# reported.# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)# Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname)='Darwin']&&
sysctl -n hw.logicalcpu_max ||
lscpu -p | egrep -v '^#'| wc -l)# Number of PHYSICAL CPUs (cores).# Linux: The 2nd column contains the core ID, with each core ID having 1 or# - in the case of hyperthreading - more logical CPUs.# Counting the *unique* cores across lines tells us the# number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname)='Darwin']&&
sysctl -n hw.physicalcpu_max ||
lscpu -p | egrep -v '^#'| sort -u -t,-k 2,4| wc -l)# Print the values.
cat <<EOF
# of logical CPUs: $logicalCpuCount# of physical CPUS: $physicalCpuCount
EOF
Обратите внимание, что производные от BSD системы, отличные от macOS, например, FreeBSD, поддерживают только тот hw.ncpuключ sysctl, который не рекомендуется использовать в macOS; Мне неясно, какой из новых ключей hw.npuсоответствует:hw.(logical|physical)cpu_[max] .
Совет от @teambob за помощь в исправлении команды физического подсчета CPU lscpu.
Предостережение : lscpu -pвывод НЕ включает столбец «книга» ( manстраница упоминает «книги» как объект между сокетом и узлом в таксономической иерархии). Если «книги» находятся в игре в данной системе Linux ( кто-нибудь знает, когда и как? ), Команда физического-CPU-count может быть ниже -report (это основано на предположении, что lscpuидентификаторы отчетов не являются уникальными для более высоких -уровневые объекты , например: 2 разных ядра из 2 разных сокетов могут иметь одинаковый идентификатор).
Если вы сохраните приведенный выше код, скажем, как сценарий оболочкиcpus , сделаете его исполняемым chmod +x cpusи поместите его в папку в вашей папке $PATH, вы увидите вывод, подобный следующему:
$ cpus
logical 4
physical 4
[1] Xaekai проливает свет на то, что такое книга : « книга - это модуль, в котором размещена печатная плата с гнездами ЦП, ОЗУ, соединениями ввода-вывода по краю и крюком для интеграции системы охлаждения. Они используются в мэйнфреймах IBM Дополнительная информация: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
Да, извините, вы правы насчет команды сортировки. Я не могу найти никакой информации о книгах, кроме руководства lscpu. Я думаю, что это связано с NUMA en.wikipedia.org/wiki/Non-uniform_memory_access
teambob
2
Я думаю, что большинство решений здесь игнорируют машины с несколькими сокетами, в отличие от этого. Спасибо!
Dividebyzero
1
С точки зрения linux, существует много контекстов, где lscpu недоступен, например образы установщика. Мне нравится это .. хотелось бы, чтобы это было вездесущим.
Брайан Крисман
43
lscpu собирает информационную форму архитектуры процессора / proc / cpuinfon в удобном для чтения формате:
# lscpuArchitecture: x86_64
CPU op-mode(s):32-bit,64-bit
ByteOrder:LittleEndian
CPU(s):8On-line CPU(s) list:0-7Thread(s) per core:1Core(s) per socket:4
CPU socket(s):2
NUMA node(s):1Vendor ID:GenuineIntel
CPU family:6Model:15Stepping:7
CPU MHz:1866.669BogoMIPS:3732.83Virtualization: VT-x
L1d cache:32K
L1i cache:32K
L2 cache:4096K
NUMA node0 CPU(s):0-7
такое «^ core id» для общего количества физических ядер или только p-ядер на одном процессоре?
Ричард
1
в системе имеется одна строка идентификатора ядра для каждого уникального физического ядра. Я не знаю, начнутся ли числа с нуля для второго физического процессора, однако ...
lunixbochs
1
если у вас есть более одного физического процессора, вам также нужно посмотреть на «физический идентификатор».
Анна
Первая строка не работает для меня. Это работает для меня. cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -lи показывает правильный номер.
jaylweb
11
Для общего количества физических ядер:
grep '^core id'/proc/cpuinfo |sort -u|wc -l
На машинах с несколькими сокетами (или всегда) умножьте приведенный выше результат на количество сокетов:
Использование getconf действительно самый переносимый способ, однако переменная имеет разные имена в BSD и Linux для getconf, поэтому вам нужно протестировать оба, как предполагает этот гист:
https://gist.github.com/jj1bdx/5746298
(также включает в себя исправление Solaris с использованием ksh)
По моему, это возвращает количество гиперпотоков. Мне также нужно знать количество физических ядер и количество сокетов.
user2465201
ОК - та же самая команда с hw.physicalcpu выдает количество ядер. Еще не уверен насчет количества сокетов ... Существует также "логическое" и "активное" количество процессоров, но я не уверен, что это значит.
user2465201
Быстрое обновление - это не кажется таким портативным. Я попробовал это на Linux-боксе, и он, кажется, просто читает каталоги / proc, которые для системы Linux отличаются от Mac - например, нет подкаталога hw. Тем не менее, вы все равно можете разобрать / proc / cpuinfo
Подсчитайте количество уникальных логических процессоров, используемых ядром Linux. -pВариант генерирует выходной сигнал для легкой разборе и совместим с более ранними версиями lscpu.
Для определения количества доступных процессорных единиц (не обязательно совпадает с количеством ядер). Это осознает гиперпоточность.
nproc
Я не хочу заходить слишком далеко в кроличью нору, но вы также можете определить количество сконфигурированных процессоров (в отличие от просто доступных / онлайн процессоров) через getconf _NPROCESSORS_CONF. Чтобы определить общее количество процессоров (оффлайн и онлайн), вы хотите проанализировать вывод lscpu -ap.
это правильный ответ, если вы хотите физические ядра.
Динеш
3
Я также думал, cat /proc/cpuinfoчто даст мне правильный ответ, однако недавно я увидел, что моя четырехъядерная система ARM Cortex A53 показала только одно ядро. Кажется, что / proc / cpuinfo показывает только активные ядра, тогда как:
cat /sys/devices/system/cpu/present
это лучшая мера того, что там. Вы также можете
cat /sys/devices/system/cpu/online
чтобы увидеть, какие ядра онлайн, и
cat /sys/devices/system/cpu/offline
чтобы увидеть, какие ядра отключены. В online, offlineи presentsysfs запись возвращает индекс процессоров, поэтому возвращаемое значение 0просто означает , что сердечник 0, в то время как возвращаемое значение 1-3средство ядер 1,2, и 3.
Следующее должно дать вам количество «реальных» ядер как в гиперпоточной, так и в недипертонической системе. По крайней мере, это сработало во всех моих тестах.
-1, это возвращается 0на одно ядро с Opteron 4170 HE, но возвращается 4на восьми ядерную коробку с Opteron 3280. ... часть меня действительно желает, чтобы этот однолинейный работал!
+1, дольше, чем решение с "lscpu -p = Core, Socket", но работает непосредственно с парсингом / proc / cpuinfo, нет необходимости в lscpu.
Фравадона
1
Подсчитайте «идентификатор ядра» для каждого метода «физического идентификатора», используя awk с отступом на счетчике «процессора», если «идентификатор ядра» недоступны (например, raspberry)
echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }'/proc/cpuinfo)
Это работало нормально. Когда я попробовал первый ответ, я получил 3 процессора в качестве вывода. Я знаю, что у меня есть 4 процессора в системе, поэтому я просто сделал grepдля процессора, и результат выглядел так:
Что является правильным количеством сокетов - поиск E5-2667говорит мне, что каждый сокет имеет 8 cores, так что умножьте и в конечном итоге с 16 coresпоперечным 2 sockets.
Где lscpuдать мне 20 CPUs- что совершенно неправильно - не знаю почему. (то же самое касается cat /proc/cpu- заканчивается 20.
Подсчет физического процессора не работает с компьютерами с несколькими сокетами; для этого вам нужно связать каждый «основной идентификатор» с его «физическим идентификатором».
cat
раньшеawk
, простоawk '<script>' /proc/cpuinfo
такawk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. И вы получаете без "минус один".tail -n 1
которую занимает последняя строка и печатает ее.Ответы:
будет считать количество строк, начинающихся с «процессор» в
/proc/cpuinfo
Для систем с гиперпоточностью вы можете использовать
который должен вернуться (например)
8
(тогда как вышеприведенная команда вернет16
)источник
grep -c '^processor' /proc/cpuinfo
на зш.cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
также вернет неправильный номер, если номера ЦП основаны на 0.Обработка содержимого
/proc/cpuinfo
без необходимости барокко. Использовать nproc который является частью coreutils, поэтому он должен быть доступен в большинстве установок Linux.команда
nproc
печатает количество процессорных блоков, доступных текущему процессу, которое может быть меньше, чем количество онлайн-процессоров.Чтобы узнать количество всех установленных ядер / процессоров используйте
nproc --all
На моей 8-ядерной машине:
источник
nproc
не является частью boot2dockerСамое переносимое решение, которое я нашел, это
getconf
команда:Это работает как в Linux, так и в Mac OS X. Другое преимущество этого подхода по сравнению с некоторыми другими подходами заключается в том, что getconf существует уже давно. На некоторых старых Linux-машинах, на которых мне приходится заниматься разработкой, нет доступных команд
nproc
orlscpu
, но они естьgetconf
.Примечание редактора: в то время как
getconf
утилита является обязательной для POSIX , специфика_NPROCESSORS_ONLN
и_NPROCESSORS_CONF
значения - нет. Тем не менее, как уже говорилось, они работают на платформах Linux, а также на MacOS; во FreeBSD / PC-BSD вы должны опустить ведущие_
.источник
_NPROCESSORS_ONLN
в POSIX. Можете ли вы дать ссылку на него?Предисловие:
Проблема с
/proc/cpuinfo
-На ответов является то , что они синтаксическая анализ информации , которая была предназначена для человеческого потребления и , следовательно , не имеет формата , предназначенный для стабильной машины разбора : выходной формат может отличаться на разных платформы и условиях среды выполнения; использованиеlscpu -p
в Linux (иsysctl
в macOS) позволяет обойти эту проблему .getconf _NPROCESSORS_ONLN
/getconf NPROCESSORS_ONLN
не различает логические и физические процессоры.Вот
sh
(POSIX-совместимый) фрагмент кода, который работает в Linux и macOS для определения количества оперативных логических или физических процессоров ; смотрите комментарии для деталей.Использует
lscpu
для Linux, иsysctl
для macOS.Примечание по терминологии : ЦП относится к наименьшей единице обработки, видимой ОС. Ядра без гиперпоточности соответствуют одному ЦП, тогда как ядра с многопоточностью содержат более 1 (обычно 2) - логического - ЦП.
Linux использует следующую таксономию [1] , начиная с самого маленького блока:
CPU < ядро < сокет < книга < узел
с каждым уровнем , содержащим 1 или более экземпляров следующего более низкого уровня.
[1] документация macOS
sysctl (3)
Обратите внимание, что производные от BSD системы, отличные от macOS, например, FreeBSD, поддерживают только тот
hw.ncpu
ключsysctl
, который не рекомендуется использовать в macOS; Мне неясно, какой из новых ключейhw.npu
соответствует:hw.(logical|physical)cpu_[max]
.Совет от @teambob за помощь в исправлении команды физического подсчета CPU
lscpu
.Предостережение :
lscpu -p
вывод НЕ включает столбец «книга» (man
страница упоминает «книги» как объект между сокетом и узлом в таксономической иерархии). Если «книги» находятся в игре в данной системе Linux ( кто-нибудь знает, когда и как? ), Команда физического-CPU-count может быть ниже -report (это основано на предположении, чтоlscpu
идентификаторы отчетов не являются уникальными для более высоких -уровневые объекты , например: 2 разных ядра из 2 разных сокетов могут иметь одинаковый идентификатор).Если вы сохраните приведенный выше код, скажем, как сценарий оболочки
cpus
, сделаете его исполняемымchmod +x cpus
и поместите его в папку в вашей папке$PATH
, вы увидите вывод, подобный следующему:[1] Xaekai проливает свет на то, что такое книга : « книга - это модуль, в котором размещена печатная плата с гнездами ЦП, ОЗУ, соединениями ввода-вывода по краю и крюком для интеграции системы охлаждения. Они используются в мэйнфреймах IBM Дополнительная информация: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
источник
lscpu
собирает информационную форму архитектуры процессора / proc / cpuinfon в удобном для чтения формате:Смотрите также /unix/468766/understanding-output-of-lscpu .
источник
Это сработало для меня.
tail -nX
позволяет захватывать только последние X строк.Если у вас есть гиперпоточность, это должно работать для захвата количества физических ядер.
источник
cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -l
и показывает правильный номер.Для общего количества физических ядер:
На машинах с несколькими сокетами (или всегда) умножьте приведенный выше результат на количество сокетов:
@ mklement0 имеет довольно хороший ответ ниже, используя lscpu. Я написал более краткую версию в комментариях
источник
Вы также можете использовать Python! Чтобы получить количество физических ядер:
Чтобы узнать количество гиперзаходных ядер:
источник
Кроссплатформенное решение для Linux, MacOS, Windows:
источник
Вот способ, которым я использую для подсчета количества физических ядер, которые находятся в сети в Linux:
или короче говоря:
Пример (1 розетка):
Пример (2 розетки):
Пример (4 розетки):
источник
Использование getconf действительно самый переносимый способ, однако переменная имеет разные имена в BSD и Linux для getconf, поэтому вам нужно протестировать оба, как предполагает этот гист: https://gist.github.com/jj1bdx/5746298 (также включает в себя исправление Solaris с использованием ksh)
Я лично использую:
И если вы хотите это в python, вы можете просто использовать syscall getconf, импортировав модуль os:
Что касается
nproc
, это часть GNU Coreutils, поэтому по умолчанию недоступна в BSD. Он также использует sysconf () после некоторых других методов.источник
Если вы хотите сделать это так, чтобы он работал на Linux и OS X, вы можете сделать:
источник
Это очень просто. Просто используйте эту команду:
источник
CPU(s):
.Вы можете использовать один из следующих методов для определения количества физических ядер ЦП.
Подсчитайте количество уникальных идентификаторов ядра (примерно эквивалентно
grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l
).awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo
Умножьте количество «ядер на сокет» на количество сокетов.
lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'
Подсчитайте количество уникальных логических процессоров, используемых ядром Linux.
-p
Вариант генерирует выходной сигнал для легкой разборе и совместим с более ранними версиямиlscpu
.lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'
Просто чтобы повторить то, что сказали другие, есть ряд связанных свойств.
Чтобы определить количество доступных процессоров:
Для определения количества доступных процессорных единиц (не обязательно совпадает с количеством ядер). Это осознает гиперпоточность.
Я не хочу заходить слишком далеко в кроличью нору, но вы также можете определить количество сконфигурированных процессоров (в отличие от просто доступных / онлайн процессоров) через
getconf _NPROCESSORS_CONF
. Чтобы определить общее количество процессоров (оффлайн и онлайн), вы хотите проанализировать выводlscpu -ap
.источник
Я также думал,
cat /proc/cpuinfo
что даст мне правильный ответ, однако недавно я увидел, что моя четырехъядерная система ARM Cortex A53 показала только одно ядро. Кажется, что / proc / cpuinfo показывает только активные ядра, тогда как:cat /sys/devices/system/cpu/present
это лучшая мера того, что там. Вы также можете
cat /sys/devices/system/cpu/online
чтобы увидеть, какие ядра онлайн, и
cat /sys/devices/system/cpu/offline
чтобы увидеть, какие ядра отключены. В
online
,offline
иpresent
sysfs запись возвращает индекс процессоров, поэтому возвращаемое значение0
просто означает , что сердечник 0, в то время как возвращаемое значение1-3
средство ядер 1,2, и 3.См. Https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu.
источник
Следующее должно дать вам количество «реальных» ядер как в гиперпоточной, так и в недипертонической системе. По крайней мере, это сработало во всех моих тестах.
источник
0
на одно ядро с Opteron 4170 HE, но возвращается4
на восьми ядерную коробку с Opteron 3280. ... часть меня действительно желает, чтобы этот однолинейный работал!Не моя веб-страница, но эта команда из http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902 прекрасно работает для меня в centos. Он будет отображать фактический процессор даже при включенной гиперпоточности.
cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l
источник
Подсчитайте «идентификатор ядра» для каждого метода «физического идентификатора», используя awk с отступом на счетчике «процессора», если «идентификатор ядра» недоступны (например, raspberry)
источник
Это работало нормально. Когда я попробовал первый ответ, я получил 3 процессора в качестве вывода. Я знаю, что у меня есть 4 процессора в системе, поэтому я просто сделал
grep
для процессора, и результат выглядел так:источник
дает мне
Что является правильным количеством сокетов - поиск
E5-2667
говорит мне, что каждый сокет имеет8 cores
, так что умножьте и в конечном итоге с16 cores
поперечным2 sockets
.Где
lscpu
дать мне20 CPUs
- что совершенно неправильно - не знаю почему. (то же самое касаетсяcat /proc/cpu
- заканчивается20
.источник
Быстрее без вилки
Это работа с милостыней всех ракушка,
Чтобы оставаться совместимым с ракушка, тире, BusyBoxи другие, я использовал
ncore=$((ncore+1))
вместо((ncore++))
.удар версия
источник
Если все в порядке, что вы можете использовать Python, то
numexpr
модуль имеет функцию для этого:также это:
Для запроса этой информации из командной строки используйте:
Или просто можно получить эту информацию из
multiprocessing.cpu_count()
функцииИли еще проще использовать
os.cpu_count()
источник
cpu_count
неправильно, он не возвращает количество ядер , но только количество hyperthreads на процессорах IntelЕсли вы просто хотите считать физические ядра, эта команда сделала это для меня.
Довольно простой, но, кажется, считает реальные физические ядра, игнорируя логический счет
источник
Python 3 также предоставляет несколько простых способов получить его:
4
4
источник
Используйте запрос ниже, чтобы получить основные детали
источник
Резюме: чтобы получить физические процессоры, сделайте это:
чтобы физические и логические процессоры сделали это:
/proc
<< это золотой источник любой необходимой вам информации о процессах и/proc/cpuinfo
<< является золотым источником любой информации о процессоре.источник