Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Аппаратное обеспечение

Что каждый программист должен знать о памяти.

Часть 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 index0Data (Данные)100000001
index1Instruction (Инструкции)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 index0Data (Данные)100000001
index1Instruction (Инструкции)100000001
index2Unified (Универсальная)200000001
cpu1 index0Data (Данные)100000002
index1Instruction (Инструкции100000002
index2Unified (Универсальная)200000002
cpu2 index0Data (Данные)100000004
index1Instruction (Инструкции)100000004
index2Unified (Универсальная)200000004
cpu3 index0Data (Данные)100000008
index1Instruction (Инструкции100000008
index2Unified (Универсальная)200000008
cpu4 index0Data (Данные)100000010
index1Instruction (Инструкции)100000010
index2Unified (Универсальная)200000010
cpu5 index0Data (Данные)100000020
index1Instruction (Инструкции)100000020
index2Unified (Универсальная)200000020
cpu6 index0Data (Данные)100000040
index1Instruction (Инструкции)100000040
index2Unified (Универсальная)200000040
cpu7 index0Data (Данные)100000080
index1Instruction (Инструкции)100000080
index2Unified (Универсальная)200000080

Видно, что у этих процессоров также есть три вида кэш-памяти: 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
cpu0000000000300000001
cpu1 10000000300000002
cpu2100000000c00000004
cpu3 10000000c00000008
cpu4200000003000000010
cpu5 10000003000000020
cpu630000000c000000040
cpu7 1000000c000000080

Если воспользоваться одновременно таблицей 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
node00000000310 20 20 20
node10000000c20 10 20 20
node20000003020 20 10 20
node3000000c020 20 20 10

Эта информация связывает все остальные данные вместе и теперь у нас есть полное представление об архитектуре машины. Мы уже знаем, что машина состоит из четырех процессоров. Каждый процессор представляет собой узел — это можно увидеть по установленным битам в файле cpumap директориев node*. В файлах distance в этих директориях содержится набор значений по одному для каждого узла, которые указывают стоимость доступа к памяти на соответствующих узлах. В этом примере стоимость доступа к любой локальной памяти равна 10, стоимость доступа ко всем удаленным узлам равна 20. {Это, кстати, неправильно. Информация ACPI, по-видимому, неверная, т.к., несмотря то, что у каждого процессора есть по три одинаковых соединения HyperTransport, по крайней мере, одно из них должно использоваться для подключения южного моста. Поэтому, по крайней мере, для одной пары узлов дистанция должна быть большей.} Это означает, что, несмотря на то, что процессоры организованы в виде двумерного гиперкуба (смотрите рис. 5.1), взаимодействие между процессорами, которые не связаны непосредственно, дороже не будет. Относительные значения расходов должны использоваться для оценки действительного различия времени доступа. Точность всей этой информации - это другой вопрос.


Назад Оглавление Вперед