Библиотека сайта rus-linux.net
Что каждый программист должен знать о памяти.
Часть 4: Поддержка устройств NUMA
Оригинал: "Memory part 4: NUMA support"Автор: Ulrich Drepper
Дата публикации: October 17, 2007
Перевод: Н.Ромоданов
Дата перевода: апрель 2012 г.
Назад | Оглавление | Вперед |
5.3 Предоставляемая информация
Ядро предоставляет в виртуальной файловой системе sys
(Sysfs) информацию о кэш-памяти процессора
/sys/devices/system/cpu/cpu*/cache
В разделе 6.2.1 мы рассмотрим интерфейс, которым можно будет пользоваться при запросе о размерах различной кэш-памяти. Самое важное здесь - это топология кэш-памяти. В директории, указанном выше, находятся поддиректории (с названиями index*
), в которых приводится информация о том, какая кэш-память есть в каждом процессоре. В этих директориях важны файлы type
, level
и shared_cpu_map
, поскольку в них описывается топология. В таблице 5.1. приведена информация для процессора Intel Core 2 QX6700.
Таблица 5.1: Информация sysfs
о кэш-памяти поцессора Core 2
Файл type | Файл level | Файл shared_cpu_map | ||
---|---|---|---|---|
cpu0 |
index0 | Data (Данные) | 1 | 00000001 |
index1 | Instruction (Инструкции) | 1 | 00000001 | |
index2 | Unified (Универсальная) | 2 | 00000003 | |
cpu1 |
index0 | Data (Данные) | 1 | 00000002 |
index1 | Instruction (Инструкции) | 1 | 00000002 | |
index2 | Unified (Универсальная) | 2 | 00000003 | |
cpu2 |
index0 | Data (Данные) | 1 | 00000004 |
index1 | Instruction (Инструкции) | 1 | 00000004 | |
index2 | Unified (Универсальная) | 2 | 0000000c | |
cpu3 |
index0 | Data (Данные) | 1 | 00000008 |
index1 | Instruction (Инструкции) | 1 | 00000008 | |
index2 | Unified (Универсальная) | 2 | 0000000c |
Эти данные означают следующее:
- В каждом ядре {Из других источников известно, что cpu0 и cpu3 являются ядрами, о чем мы расскажем немного позже} есть три вида кэш-памяти: L1i, L1D, L2.
- Кэш-память L1d and L1i ни с кем не разделяется, в каждом ядре есть свой собственный набор кэш-памяти. Об этом свидетельствует битовая карта
shared_cpu_map
, в которой установлен только один бит. - Кэш-память L2 совместно используется в
cpu0
и вcpu1
точно также, как и L2 — вcpu2
и вcpu3
.
Если в процессоре больше уровней кэш-памяти, то директориев index*
также будет больше.
В таблице 5.2 приведена информация о кэш-памяти двухядерной машины Opteron с четырьмя соединениями:
Таблица 5.2: Информация sysfs
о кэш-памяти поцессора Opteron
Файл type | Файл level | Файл shared_cpu_map | ||
---|---|---|---|---|
cpu0 |
index0 | Data (Данные) | 1 | 00000001 |
index1 | Instruction (Инструкции) | 1 | 00000001 | |
index2 | Unified (Универсальная) | 2 | 00000001 | |
cpu1 |
index0 | Data (Данные) | 1 | 00000002 |
index1 | Instruction (Инструкции | 1 | 00000002 | |
index2 | Unified (Универсальная) | 2 | 00000002 | |
cpu2 |
index0 | Data (Данные) | 1 | 00000004 |
index1 | Instruction (Инструкции) | 1 | 00000004 | |
index2 | Unified (Универсальная) | 2 | 00000004 | |
cpu3 |
index0 | Data (Данные) | 1 | 00000008 |
index1 | Instruction (Инструкции | 1 | 00000008 | |
index2 | Unified (Универсальная) | 2 | 00000008 | |
cpu4 |
index0 | Data (Данные) | 1 | 00000010 |
index1 | Instruction (Инструкции) | 1 | 00000010 | |
index2 | Unified (Универсальная) | 2 | 00000010 | |
cpu5 |
index0 | Data (Данные) | 1 | 00000020 |
index1 | Instruction (Инструкции) | 1 | 00000020 | |
index2 | Unified (Универсальная) | 2 | 00000020 | |
cpu6 |
index0 | Data (Данные) | 1 | 00000040 |
index1 | Instruction (Инструкции) | 1 | 00000040 | |
index2 | Unified (Универсальная) | 2 | 00000040 | |
cpu7 |
index0 | Data (Данные) | 1 | 00000080 |
index1 | Instruction (Инструкции) | 1 | 00000080 | |
index2 | Unified (Универсальная) | 2 | 00000080 |
Видно, что у этих процессоров также есть три вида кэш-памяти: L1i, L1D, L2. Ни одно из ядер не разделяет какую-либо кэш-память. Самым интересным в этой системе является топология процессоров. Без этой дополнительной информации невозможно разобраться в данных, связанных кэш-памятью. Эта информация представлена в файловой системе sys
в следующем директории
/sys/devices/system/cpu/cpu*/topology
В таблице 5.3 приведены интересные файлы из этого директория, описывающие машину SMP Opteron.
Таблица 5.3: Информация sysfs
, описывающая топологию процессора Opteron
Файл physical_>package_id | Файл core_id | Файл core_siblings | Файл thread_siblings | |
---|---|---|---|---|
cpu0 | 0 | 0 | 00000003 | 00000001 |
cpu1 | 1 | 00000003 | 00000002 | |
cpu2 | 1 | 0 | 0000000c | 00000004 |
cpu3 | 1 | 0000000c | 00000008 | |
cpu4 | 2 | 0 | 00000030 | 00000010 |
cpu5 | 1 | 00000030 | 00000020 | |
cpu6 | 3 | 0 | 000000c0 | 00000040 |
cpu7 | 1 | 000000c0 | 00000080 |
Если воспользоваться одновременно таблицей 5.2 и таблицей 5.3, то видно, что нет процессоров, имеющих гиперпотоки (в битовой карте thread_siblings
установлен один бит), что система фактически имеет четыре процессора (physical_package_id
от 0 и до 3), что в каждом процессоре есть два ядра и что ни одно из ядер не разделяет какую-либо кэш-память. Эти данные соответствуют ранним версиям процессора Opteron.
То, что до сих пор полностью отсутствовало в представленных данных, это информация об архитектуре NUMA для данной машины. Любая машина SMP Opteron является машиной NUMA. Данные об этом, которое есть в машинах NUMA, нам следует искать в другом месте файловой системы sys, а именно - в следующей иерархии
/sys/devices/system/node
В этом директории имеется поддиректорий для каждого узла NUMA, присутствующего в системе. В директориях конкретных узлов есть ряд файлов. В предыдущих двух таблицах и в таблице 5.4 описаны важные файлы и их содержимое для машины Opteron.
Таблица 5.4: Информация sysfs
, касающаяся узлов Opteron
Файл cpumap | Файл distance | |
---|---|---|
node0 | 00000003 | 10 20 20 20 |
node1 | 0000000c | 20 10 20 20 |
node2 | 00000030 | 20 20 10 20 |
node3 | 000000c0 | 20 20 20 10 |
Эта информация связывает все остальные данные вместе и теперь у нас есть полное представление об архитектуре машины. Мы уже знаем, что машина состоит из четырех процессоров. Каждый процессор представляет собой узел — это можно увидеть по установленным битам в файле cpumap
директориев node*
. В файлах distance
в этих директориях содержится набор значений по одному для каждого узла, которые указывают стоимость доступа к памяти на соответствующих узлах. В этом примере стоимость доступа к любой локальной памяти равна 10, стоимость доступа ко всем удаленным узлам равна 20. {Это, кстати, неправильно. Информация ACPI, по-видимому, неверная, т.к., несмотря то, что у каждого процессора есть по три одинаковых соединения HyperTransport, по крайней мере, одно из них должно использоваться для подключения южного моста. Поэтому, по крайней мере, для одной пары узлов дистанция должна быть большей.} Это означает, что, несмотря на то, что процессоры организованы в виде двумерного гиперкуба (смотрите рис. 5.1), взаимодействие между процессорами, которые не связаны непосредственно, дороже не будет. Относительные значения расходов должны использоваться для оценки действительного различия времени доступа. Точность всей этой информации - это другой вопрос.
Назад | Оглавление | Вперед |