Внимание! |
По умолчанию выставлено наиболее оптимальное значение cpu_distribution. Изменять предустановленное значение cpu_distribution можно только по рекомендации вендора. При необходимости изменения данного параметра, необходимо обратиться в службу технической поддержки support@s-terra.ru. |
Назначением параметра cpu_distribution является оптимизация доступа к памяти и кешам процессоров при обработке трафика, минимизация переключения контекстов нитей ядра Linux, а также более эффективное распределение вычислительной мощности многопроцессорной системы между задачами обработки трафика. Многопроцессорные системы, использующие NUMA архитектуру, разделяют оперативную память между несколькими NUMA-узлами. К NUMA-узлу приписано некоторое число процессорных ядер. Доступ к памяти внутри своего NUMA-узла происходит гораздо быстрее, чем к памяти чужого узла. Поэтому целью настройки является обработка выделенного потока сетевого трафика в рамках одного NUMA узла: получение IP-пакета, выделение памяти под него и IPsec-обработка должна происходить на ядрах процессора, приписанных к одному узлу.
Ядра, выделенные для обработки прерываний, по возможности размещаются в разных NUMA-узлах. Каждому выделенному для обработки ядру соответствует своя рабочая очередь. В случае переполнения своей очереди, трафик будет помещаться в самую свободную "чужую" очередь (если такая найдется), при этом возможна потеря производительности.
Привязка прерываний позволяет добиться большей эффективности обработки т.к. для обработки пакета будет использована очередь, находящаяся в контексте NUMA и кеша процессора, на котором произошло прерывание. Кроме того, привязка прерываний обеспечивает возможность параллельной обработки прерываний при значении числа процессорных ядер два и более.
Параметр cpu_distribution имеет следующий формат:
<NIC0>,<NIC1>,...:<irq cores>/<working cores>
<NIC0>,<NIC1>,... – список интерфейсов, для которых выполняется привязка прерываний. В качестве имён интерфейсов можно указывать либо '*', либо ничего.
Если указать “*”', тогда привязываются все прерывания интерфейсов.
Драйвер отслеживает события, связанные с состоянием интерфейсов (up/down), и динамически выставляет настройки в /proc/irq/<irq_num>/smp_affinity для этих интерфейсов.
Если ничего не указать (т. е. ничего перед символом “:”), тогда привязка прерываний к процессорам не выполняется, и прерывания сетевых интерфейсов распределятся в соответствии с алгоритмом назначения прерываний Linux. В таком случае файлы /proc/irq/<irq_num>/smp_affinity не будут модифицированы, что вызовет снижение производительности подсистемы обработки пакетов драйвером.
При значении <irq_cores> = 0 привязка прерываний делается ко всем процессорам одновременно.
<irq cores> – число процессорных ядер, полностью выделенных под обработку прерываний сетевых интерфейсов.
<irq_cores> = 0 используется для распределения прерываний по умолчанию.
<irq cores> = 1 одно выделенное ядро для прерываний.
<working cores> – количество рабочих ниток, число процессорных ядер, используемых для IPsec обработки.
<working cores> может иметь значение "*", которое означает "использовать все доступные ядра, за исключением ядер прерываний". Рекомендуется указывать значение, кратное <irq cores>, в этом случае обеспечится равномерное распределение процессорных ядер по обслуживаемым очередям.
Значения по умолчанию:
• Если явно не задавать cpu_distribution и число процессорных ядер 3 и более, принимается значение *:1/*
• Если явно не задавать cpu_distribution и число процессорных ядер 2 или одно, принимается значение *:0/*
Ограничения на значения в cpu_distribution
• <irq cores> < число процессорных ядер
• <irq cores> + <working cores> ≤ число процессорных ядер
• <irq cores> ≤ <working cores>
Пример для однопроцессорной системы:
cpu_distribution=*:2/10
В данном случае выполняется привязка прерываний от всех сетевых интерфейсов к нулевому и первому ядрам процессора (irq cores = 2).
Количество рабочих ниток будет равно 10.
Пример для двухпроцессорных систем:
cpu_distribution=*:2/18
В данном случае выполняется привязка прерываний от всех сетевых интерфейсов к нулевым ядрам первого и второго процессора (irq cores = 2).
Количество рабочих ниток будет равно 18 (по девять на каждом процессоре).