Потери на сетевых картах, задержки в обработке и как с ними бороться

по сравнению с
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (48)

просмотр истории страницы
{toc}
Большеинство настроек производительности сервера Carbon Reductor настраивает автоматически, но некоторые нужно подстраивать под конкретный сервер вручную. Если Ваш сервер перестал справляться с нагрузкой или вы хотите повысить запас производительности сервера, воспользуйтесь советами из этой статьи.

h1. Как оценить производительность сервера
h3. /proc/interrupts

Отображает то, как очереди сетевой карты распределены между ядрами. Для большеинства серверов мы советуем сделать количество очередей сетевой карты, куда приходит зеркало, равным количеству ядрер и привязать каждую очередь к своему ядру.


Частые проблемы в настройках процессора.

h3.

h3. Режим энергосбережения
{code}

Альтернативный вариант с автоматическим определением оптимального значения (утилита из netutils-linux):

{code}
chroot /app/reductor/
rx-buffers-increase eth1
{code}

h3. Распределение прерываний
h4. Включение из консоли:

h4. Реальные прерывания
h5. Шаг 1. Выбрать пункт "Включить RSS для сетевых карт"

Хорошие сетевые карты поддерживают несколько очередей для входящих пакетов. Каждая очередь привязана к одному или нескольким ядрам. Несмотря на указанный список зачастую сетевые карты по умолчанию коробки работают на первом ядре процессора. Обойти это можно распределив прерывания c помощью утилиты rss-ladder.

{code}
rss-ladder eth1
menu->Reductor DPI X->Прочие настройки->Включить RSS для сетевых карт
{code}

Используйте разные ядра (cores), гипертрединг лучше выключить, с ним легко получить неоптимальные настройки.
Далее выйти с сохранением настроек.

h5. Многопроцессорные системы
h5. Шаг 2. Проверить запись в mirror_info.conf

Если в системе больше одного физического процессора, лучше распределять прерывания сетевой карты в пределах ядер её локальной NUMA-ноды. rss-ladder делает это автоматически. Число очередей лучше подстроить под число ядер одного физического процессора, по умолчанию их число часто равно общему числу ядер.
Открыть любым удобным для вас редактором ( например vim ) файл mirror_info.conf

Пример - поставим eth2 8 объединённых очередей.
{code}
vim /app/reductor/cfg/userinfo/mirror_info.conf
{code}

Убедиться в наличие соответствующей записи "mirror rss" напротив каждого указанного интерфейса.
{code}
ethtool -L eth2 combined 8
eth1 - - mirror rss
{code}

Очереди бывают combined или отдельные tx и rx, зависит от модели и драйвера сетевой карты.
h5. Шаг 3. Рестарт редуктора

Не все многопроцессорные системы поддерживают NUMA, иногда память является общей для обоих процессоров и для сетевых карт.

h5. Пример для Carbon Reductor 8

Мы не используем автоматическую настройку RSS, т.к. в редких ситуациях это приводит к зависанию сетевой карты. Так что настраивать это необходимо вручную:

Создаем сам файл-хук: `/app/reductor/cfg/userinfo/hooks/start.sh`

В него добавляем следующее содержимое:

{code}
#!/bin/bash

client_post_start_hook() {
rss-ladder eth0 || true
rss-ladder eth1 || true
}
/app/reductor/service restart
{code}

и делаем файл исполнимым: `chmod a+x /app/reductor/cfg/userinfo/hooks/start.sh`.

h4. Отложенные прерывания

* отказаться от VLAN, зеркалируя чистый трафик, без VLAN-тегов, либо снимать их при зеркалировании.
** в случае с QinQ может оказаться достаточно снять один тег.
* использовать распределение нагрузки с помощью RPS, используя для захвата одно ядро (экспериментальная опция fwboost: isolated rss).

h4. Большое число VLAN

При большом количестве VLAN создаётся большое количество правил iptables в цепочке iptables \-t raw \-nvL PREROUTING.

Их число можно сократить, перечислив через пробел интерфейсы с большим числом VLAN-тегов в опции: menu \-> Reductor DPI X \-> Настройки алгоритма фильтрации \-> Интерфейсы с большим количеством VLAN.

Опция позволяет добиться 1-3% прироста производительности.




h3. Различные значения rx-usecs





В кратце - можно за счёт повышения нагрузки на процессор слегка снять нагрузку с сетевой карты, уменьшая rx-usecs.

h3. NOTRACK

Эта технология отключает наблюдение за состоянием соединения для пакетов к которым она была применена. Это приводит к значительному снижению нагрузки на процессор в случае, если состояние соединения нас не интересует (захват трафика).

Эта опция включена по-умолчанию, выключать ее можно только в исключительных случаях.

Технология NOTRACK отключает наблюдение за состоянием соединения для пакетов к которым она была применена. Она приводит к значительному снижению нагрузки на процессор в случае, если состояние соединения нас не интересует (захват трафика).

h4.
{code}
Повышенная нагрузка может быть вызвана тем, что к сетевым картам, которые используются для приёма зеркала не применяется правило NOTRACK.

{code}
Проверить это можно:
# посмотрев объёмы трафика по сетевым картам с помощью утилиты link-rate
# проверив, что все сетевые карты, принимающие зеркало трафика, имеют ссылку в цепочку mirror_traffic с помощью команды iptables \-t raw \-nvL PREROUTING


h2. Сеть провайдера

h3. Масштабирование
h3. Отправлять меньше трафика

Проанализируйте что вы отправляете в зеркало. Возможно там есть что-то лишнее.

# Иногда один и тот же трафик попадает в зеркало дважды — инкапсулированным и чистым, в таком случае от инкапсулированного можно избавиться.
# Возможно отправляется трафик в обоих направлениях, а достаточно только исходящего.
# Возможно там есть лишние VLAN'ы с служебным трафиком, а Carbon Reductor анализирует только часть.
# Если зеркал трафика несколько, можно балансировать отправку, указывая порты коммутатора, с которых оно снимается (в случае "перекосов").

h3. Масштабирование

h4. В рамках одного сервера

h3. Flow-control

Для отправки зеркала рекомендуем отключать данную опцию, она чаще приводит к потерям, чем к сглаживанию пиковых нагрузок.
По умолчанию Carbon Reductor отключает flow-control для сетевых карт принимающих зеркало трафика, так как она чаще приводит к потерям, чем к сглаживанию пиковых нагрузок.

Проверить настройки можно с помощью команды:

{code}
ethtool -A eth2 rx off tx off
ethtool -a eth2
{code}

В Carbon Reductor скоро будет доступно в автоматическом режиме.

h3. MTU