Параметры рабочей очереди настраиваются в файле /etc/modprobe.d/vpndrvr.conf (параметр cpu_distribution) и с помощью утилиты drv_mgr (параметр pq_thread_q_size).
cpu_distribution
Назначением параметра cpu_distribution является оптимизация доcтупа к памяти и кешам процессоров при обработке трафика, минимизация переключения контекстов нитей ядра Linux, а также более эффективное распределение вычислительной мощности многопроцессорной системы между задачами обработки трафика. Многопроцессорные системы, использующие NUMA архитектуру, разделяют оперативную память между несколькими NUMA-узлами. К NUMA-узлу приписано некоторое число процессорных ядер. Доступ к памяти внутри своего NUMA-узла происходит гораздо быстрее, чем к памяти чужого узла. Поэтому целью настройки является обработка выделенного потока сетевого трафика в рамках одного NUMA узла: получение IP-пакета, выделение памяти под него и IPsec-обработка должна происходить на ядрах процессора, приписанных к одному узлу.
Ядра, выделенные для обработки прерываний, по возможности размещаются в разных NUMA-узлах. Каждому выделенному для обработки ядру соответствует своя рабочая очередь. В случае переполнения своей очереди, трафик будет помещаться в самую свободную "чужую" очередь (если такая найдется), при этом возможна потеря производительности.
Привязка прерываний позволяет добиться большей эффективности обработки т.к. для обработки пакета будет использована очередь, находящаяся в контексте NUMA и кеша процессора, на котором произошло прерывание. Кроме того, привязка прерываний обеспечивает возможность параллельной обработки прерываний при значении числа процессорных ядер два и более.
Параметр cpu_distribution имеет следующий формат:
<NIC0>,<NIC1>,...:<irq cores>/<working cores>
<NIC0>,<NIC1>,... – список интерфейсов, для которых выполняется привязка прерываний.
Допускается пустой список интерфейсов, тогда привязка прерываний к процессорам не выполняется, и прерывания сетевых интерфейсов распределятся в соответствии с алгоритмом назначения прерываний LINUX. В этом случае возможна менее эффективная обработка пакетов.
Все интерфейсы, явно указанные в списке должны быть подняты на момент старта драйвера.
Перечислять интерфейсы смысла не имеет. Можно указать '*', тогда "привязываются" все прерывания интерфейсов, или пустой список (ничего перед символом ':'), тогда привязки прерываний не будет.
При значении <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>
pq_thread_q_size
Параметр pq_thread_q_size ограничивает размер очереди и задается утилитой drv_mgr, описанной в документе «Специализированные команды».
Если <irq_cores> больше одного, то вычисляется для каждой очереди в отдельности. Максимальное суммарное количество ожидающих пакетов умножается на количество очередей.
Настройка длины очереди делается в зависимости от характера трафика. Большая длина позволяет избежать потерь пакетов при пиковых и неравномерных нагрузках, а также обеспечит максимальную пропускную способность. Маленький размер очереди позволяет ограничить максимальное время обработки одного пакета, снижает используемый объем памяти ядра Linux (особенно это актуально для 32-битных систем).
Рекомендации по использованию
Для систем с одним-двумя процессорными ядрами достаточно значения по умолчанию *:0/*.
Если в системе есть один многоядерный процессор (3 и более ядер), рекомендуется конфигурация по умолчанию *:1/*. Для оптимальных результатов при большом количестве ядер, может быть полезно сократить число <working cores>: то есть выставить *:1/N, где N число процессорных ядер-2 и менее.
Для систем с двумя и более многоядерными процессорами возможны следующие варианты:
· если аппаратная конфигурация и характер трафика позволяет параллельную обработку прерываний, то число <irq cores> можно увеличить (выставить 2);
· если добиться параллельной обработки прерываний невозможно, то надо выставить <irq cores> = 1 далее, в зависимости от сложности криптографических вычислений, оптимальной конфигурацией может быть локализация всех IPsec вычислений на одном процессоре путем ограничения числа <working cores> до числа ядер на одном процессоре-1.