Нумерация процессоров NUMA в Linux

У меня есть доступ к двум серверам NUMA. Один из них - Dell R720 и имеет следующие процессоры:

$ cat /proc/cpuinfo |grep Xeon|sort|uniq -c
     24 model name  : Intel(R) Xeon(R) CPU E5-2630L v2 @ 2.40GHz

Другой - HPE DL360 Gen8 и имеет следующие процессоры:

$ cat /proc/cpuinfo |grep Xeon|sort|uniq -c
     24 model name  : Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz

На работе, где у нас много серверов HPE Gen9, я привык к нумерации ЦП (socket0, socket1, socket0 HyperThreads, socket1 HyperThreads). Похоже, что HPE DL360 Gen8 использует эту нумерацию:

$ cat /proc/cpuinfo |grep physical.id|uniq -c
      6 physical id : 0
      6 physical id : 1
      6 physical id : 0
      6 physical id : 1

Но сервер Dell R720 использует другую нумерацию:

$ cat /proc/cpuinfo |grep physical.id|uniq -c
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1
      1 physical id : 0
      1 physical id : 1

Мой вопрос, что вызывает эту разницу? Серверы имеют две слегка отличающиеся версии ядра:

Dell R720:

$ uname -a
Linux dell 4.10.0-33-generic #37~16.04.1-Ubuntu SMP Fri Aug 11 14:07:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

HPE DL360 Gen8:

$ uname -a
Linux hpe 4.11.0-14-generic #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Это вызвано разными версиями ядра? Или разными процессорами? Или разными материнскими платами / BIOS ами?

Изменить: Я обновил ядра на обеих машинах и перезагрузил, так что теперь обе машины используют точно одинаковую версию ядра. Тем не менее, разница все еще есть.

2 ответа

Прекратить разборки и uniq и беги lscpu а также lstopo --of png > server.png и визуализировать результаты...

[root@LA_Specialty ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24
On-line CPU(s) list:   0-23
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU E5-2643 v2 @ 3.50GHz
Stepping:              4
CPU MHz:               3501.000
BogoMIPS:              7013.88
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-5,12-17
NUMA node1 CPU(s):     6-11,18-23

lscpu [1] будет более кратко выражать макет numa каждой системы. lstopo [2] дает иерархическое представление отношений процессора.

Перечисление определяется CPU + BIOS + ядро. На высоком уровне материнская плата имеет разные сокеты для 0 и 1, она всегда запускает 0. Процессор в сокете 0 затем запускает ядро ​​0 по определенному адресу и запускает BIOS, который затем перечисляет логические процессоры на этом чипе и дополнительные процессоры. (возможно, не в этом порядке) [3]. BIOS передает данные перечисления в ОС по мере необходимости, но ОС свободна для нумерации процессоров по своему усмотрению (представьте, что процессоры с горячей заменой делают с нумерацией).

Если вы беспокоитесь о сходстве и кешировании, то это полезное число для использования apicid. Битовое поле должно быть определено так, чтобы наиболее близкие друг к другу запоминающие устройства / кеши имели числовые близкие значения, упорядочивая биты Socket | Core | SMT. Ширина этих полей не фиксирована, поэтому вы не можете рассчитывать на то, что LSB всегда будет означать SMT, у него может не быть SMT, и этот бит является частью идентификатора ядра.

Другие вопросы по тегам