Чтобы получить полную картину, вам нужно посмотреть на количество потоков на ядро, ядер на сокет и сокетов . Если вы умножите эти числа, вы получите количество процессоров в вашей системе.
ЦП = потоков на ядро X ядер на сокет X сокетов
Процессоры - это то, что вы видите при запуске htop
(они не равны физическим процессорам).
Вот пример с настольного компьютера:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
И сервер:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
Вывод nproc
соответствует количеству ЦП от lscpu
. Для настольного компьютера выше это должно соответствовать 8 процессорам, о которых сообщают lscpu
:
$ nproc --all
8
Вывод /proc/cpuinfo
должен соответствовать этой информации, например, на настольной системе выше мы видим, что есть 8 процессоров (ЦП) и 4 ядра (идентификатор ядра 0-3):
$ grep -E 'processor|core id' /proc/cpuinfo
processor : 0
core id : 0
processor : 1
core id : 0
processor : 2
core id : 1
processor : 3
core id : 1
processor : 4
core id : 2
processor : 5
core id : 2
processor : 6
core id : 3
processor : 7
core id : 3
cpu cores
Сообщил /proc/cpuinfo
соответствует Core(s) per socket
сообщению lscpu
. Для настольного компьютера выше это должно соответствовать 4 ядрам на сокете, о которых сообщает lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Чтобы конкретно ответить на ваш вопрос, вы говорите, сколько ядер у вас есть, умножая количество ядер на каждый сокет на количество имеющихся у вас сокетов.
Сердечники = сердечники на гнездо X розетки
Для приведенных выше примеров систем настольный компьютер имеет 4 ядра:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Пока на сервере есть 16:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Еще одна полезная утилита, dmidecode
которая выводит информацию по каждому сокету. В случае серверной системы, указанной выше, мы ожидаем увидеть 8 ядер на сокет и 16 потоков на сокет:
$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
Socket Designation: CPU1
Core Count: 8
Thread Count: 16
Socket Designation: CPU2
Core Count: 8
Thread Count: 16
У lscpu
команды есть несколько полезных опций, которые вы можете проверить, например:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Смотрите man lscpu
подробности.
В итоге:
- Вы должны знать о сокетах, ядрах и потоках
- Вы должны быть осторожны с термином CPU, поскольку он означает разные вещи в разных контекстах