Как получить количество ЦПУ/ядер в Linux через командную строку?
У меня есть следующий скрипт, но я не знаю, как получить последний элемент в выводе:
cat /proc/cpuinfo | awk '/^processor/{print $3}'
Последний элемент должен быть равен количеству процессоров минус 1. Как это реализовать?
5 ответ(ов)
Команда
grep -c ^processor /proc/cpuinfo
посчитает количество строк, начинающихся с "processor" в файле /proc/cpuinfo
.
Для систем с гипертредингом можно использовать
grep ^cpu\\scores /proc/cpuinfo | uniq | awk '{print $4}'
Эта команда вернёт (например) 8
(в то время как предыдущая команда вернёт 16
).
Команда lscpu
извлекает информацию о архитектуре процессора из файла /proc/cpuinfo
и выводит ее в удобочитаемом формате.
Вот пример вывода команды lscpu
:
# lscpu
Architecture: x86_64 # Архитектура процессора
CPU op-mode(s): 32-bit, 64-bit # Поддерживаемые режимы работы CPU
Byte Order: Little Endian # Порядок байтов
CPU(s): 8 # Количество процессоров
On-line CPU(s) list: 0-7 # Список активных процессоров
Thread(s) per core: 1 # Количество потоков на ядро
Core(s) per socket: 4 # Количество ядер на сокет
CPU socket(s): 2 # Количество сокетов
NUMA node(s): 1 # Количество узлов NUMA
Vendor ID: GenuineIntel # Идентификатор производителя
CPU family: 6 # Семейство процессоров
Model: 15 # Модель процессора
Stepping: 7 # Степень процессора
CPU MHz: 1866.669 # Тактовая частота (МГц)
BogoMIPS: 3732.83 # BogoMIPS
Virtualization: VT-x # Поддержка виртуализации
L1d cache: 32K # Размер кэша L1 для данных
L1i cache: 32K # Размер кэша L1 для инструкций
L2 cache: 4096K # Размер кэша L2
NUMA node0 CPU(s): 0-7 # Процессоры в узле NUMA 0
Дополнительную информацию можно найти по ссылке.
Чтобы подсчитать количество физических ядер, которые находятся в онлайне на Linux, я использую следующий способ:
lscpu --online --parse=Core,Socket |
grep --invert-match '^#' |
sort --unique |
wc --lines
Более короткая версия:
lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
Пример с 1 сокетом:
$ lscpu
...
CPU(s): 28
Thread(s) per core: 2
Core(s) per socket: 14
Socket(s): 1
...
$ lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
14
Пример с 2 сокетами:
$ lscpu
...
CPU(s): 56
Thread(s) per core: 2
Core(s) per socket: 14
Socket(s): 2
...
$ lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
28
Пример с 4 сокетами:
$ lscpu
...
CPU(s): 64
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 4
...
$ lscpu -b -p=Core,Socket | grep -v '^#' | sort -u | wc -l
32
Таким образом, вы можете легко определить количество физических ядер, которые в данный момент активны на вашей системе.
Вы также можете использовать Python! Чтобы получить количество физических ядер, выполните следующий код:
$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4
А чтобы узнать количество ядер с гипертредингом, воспользуйтесь командой:
$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8
Для получения общего числа физических ядер можно использовать следующую команду:
grep '^core id' /proc/cpuinfo | sort -u | wc -l
На многопроцессорных машинах (или всегда) умножьте результат на количество сокетов:
echo $(($(grep "^physical id" /proc/cpuinfo | awk '{print $4}' | sort -un | tail -1) + 1))
@mklement0 привел довольно красивый ответ ниже, используя команду lscpu. Я написал более лаконичную версию в комментариях.
Как изменить цвет вывода echo в Linux
Как перенаправить вывод в файл и на экран (stdout)
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?