Просмотр Исходного

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

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

Для оценки будем использовать набор утилит в Carbon Reductor и стандартные инструменты iproute.

Все команды надо запускать перейдя в контейнер Carbon Reductor:

{code}
chroot /app/reductor
{code}

h2. Информация о конкретной сетевой карте

{code}
ip -s -s link show eth2
6: eth2: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:e0:ed:33:65:b2 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
66192704908009 358590458063 0 0 0 79155
RX errors: length crc frame fifo missed
0 0 0 0 111495719
TX: bytes packets errors dropped carrier collsns
0 0 0 0 0 0
TX errors: aborted fifo window heartbeat
0 0 0 0
{code}

Смотреть нужно на все виды RX Errors.

Некоторые сетевые карты предоставляют подробную информацию о характере потерь:

{code}
ethtool -S eth2 | egrep rx_ | grep -v ': 0$' | egrep -v 'packets:|bytes:'
rx_pkts_nic: 365565232680
rx_bytes_nic: 69973509621284
rx_missed_errors: 111495719
rx_long_length_errors: 1077
rx_csum_offload_errors: 169255
rx_no_dma_resources: 383638
{code}

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


Потери могут быть как на сетевых картах сервера, так и на порту сетевого оборудования, отправляющего зеркало трафика. О том, как это посмотреть можно узнать из документации производителя сетевого оборудования.

h2. Как интерпретировать нагрузку на процессор

Выполните команду

{code}
top -cd1
{code}

и нажмите клавишу "1", чтобы увидеть информацию о каждом конкретном процессоре.

Формат вывода следующий:

{code}
Tasks: 143 total, 1 running, 142 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni, 88.0%id, 0.0%wa, 0.0%hi, 12.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni, 88.8%id, 0.0%wa, 0.0%hi, 11.2%si, 0.0%st
Cpu2 : 0.0%us, 1.0%sy, 0.0%ni, 85.0%id, 0.0%wa, 0.0%hi, 14.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni, 87.8%id, 0.0%wa, 0.0%hi, 12.2%si, 0.0%st
{code}

Интерес представляет колонка "%si".

Если нагрузка распределена неравномерно, т.е. Cpu0 трудится, а 1..n нет, то ресурсы процессора используются нерационально.

Показатель "%si" растет нелинейно при повышении нагрузки. Чем больше в Вашем сервере ядер - тем больше они влияют друг на друга и тем сильнее растет "%si".


Если значение стабильно выше 60-80% - что сервер работает практически на пределе. Если подходит к 100% - сервер начинает плохо справляться с фильтрацией (пакеты начинают теряться или обрабатываются с задержкой).



h2. Информация о сетевом стеке

Просмотр подробной информации о текущем состоянии сетевого стека:

{code}
network-top
{code}

Некоторые значения подсвечиваются жёлтым (высокое значение) и красным (чрезвычайно высокое значение или ошибка). Это эвристика и не подстраивается под конкретный сервер.

При количестве ядер больше 20 или большом числе VLAN информация может не влезать на экран, решение проблемы - уменьшить масштаб терминала или перечислить необходимые девайсы `--devices=eth1,eth2,eth3`:

Вывод выглядит так:

{code}
[root@reductor support]# network-top -n 1 --no-clear --no-color
# /proc/interrupts

CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15

0 0 0 0 0 0 0 733 0 0 0 0 0 0 0 0 eth0-TxRx-7
39405 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-0
0 39768 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-1
0 0 38518 0 0 0 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-2
0 0 0 41302 0 0 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-3
0 0 0 0 39061 0 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-4
0 0 0 0 0 42078 0 0 0 0 0 0 0 0 0 0 eth2-TxRx-5
0 0 0 0 0 0 39168 0 0 0 0 0 0 0 0 0 eth2-TxRx-6
0 0 0 0 0 0 0 39294 0 0 0 0 0 0 0 0 eth2-TxRx-7
0 0 0 0 0 0 0 0 37167 0 0 0 0 0 0 0 eth2-TxRx-8
0 0 0 0 0 0 0 0 0 37460 0 0 0 0 0 0 eth2-TxRx-9
0 0 0 0 0 0 0 0 0 0 40164 0 0 0 0 0 eth2-TxRx-10
0 0 0 0 0 0 0 0 0 0 0 39613 0 0 0 0 eth2-TxRx-11
0 0 0 0 0 0 0 0 0 0 0 0 40362 0 0 0 eth2-TxRx-12
0 0 0 0 0 0 0 0 0 0 0 0 0 41184 0 0 eth2-TxRx-13
0 0 0 0 0 0 0 0 0 0 0 0 0 0 42319 0 eth2-TxRx-14
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38430 eth2-TxRx-15
111 61 31 70 23 86 45 77 166 0 12 15 21 9 0 112 interrupts

# Load per cpu:

CPU Interrupts NET RX NET TX total dropped time_squeeze cpu_collision received_rps

CPU0 39545 39717 0 127558 0 0 0 0
CPU1 39845 40164 0 130904 0 0 0 0
CPU2 38594 38925 0 133087 0 0 0 0
CPU3 41411 41702 0 155217 0 0 0 0
CPU4 39118 39388 0 126653 0 0 0 0
CPU5 42188 42443 0 141257 0 0 0 0
CPU6 39230 39527 0 137838 0 0 0 0
CPU7 40118 40425 0 117886 0 0 0 0
CPU8 37335 37430 0 118963 0 0 0 0
CPU9 37464 37535 0 144810 0 0 0 0
CPU10 40194 40463 0 135276 0 0 0 0
CPU11 39630 39953 0 136303 0 0 0 0
CPU12 40387 40675 0 135858 0 0 0 0
CPU13 41195 41526 0 134899 0 0 0 0
CPU14 42321 42705 0 156010 0 0 0 0
CPU15 38593 38695 0 113177 0 0 0 0

# Network devices

Device rx-packets rx-mbits rx-errors dropped missed fifo length overrun crc frame tx-packets tx-mbits tx-errors

lo 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0 21 0 0 0 0 0 0 0 0 0 1155 1 0
eth1 0 0 0 0 0 0 0 0 0 0 0 0 0
eth2 1082133 1462 0 0 0 0 0 0 0 0 0 0 0
eth3 0 0 0 0 0 0 0 0 0 0 0 0 0
{code}


h3. /proc/interrupts

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


Если в одну очередь приходит больше пакетов, чем в остальные - возможно трафик инкапсулирован (QinQ, PPP), что мешает сетевой карте равномерно их распределить.

h3. Load per CPU

Отображает что делает каждое ядро. Распределение обработки трафика может достигается за счёт очередей сетевой карты (RSS) или технологии RPS ("программный" RSS).

* Interrupts - прерывания от сетевой карты
* NET_RX - отложенная обработка входящего трафика: собственно обработка пакетов файрволом
* Total - число обрабатываемых пакетов
* dropped - потери пакетов
* time_squeeze - количество дополнительных циклов обработки пакетов из 1 прерывания. При наличии потерь, косвенно указывает что именно ядро не справляется с обработкой пакетов (при большом количестве циклов, более 100-300)

h3. Network devices

Статистика по сетевым картам
* rx-errors - общее число ошибок, суммирует остальные. В какой счётчик попадает потерявшийся пакет зависит от драйвера сетевой карты.
* dropped, fifo, overrun - как правило, пакеты, не успевшие обработаться сетевым стеком
* missed - как правило, пакеты, не успевшие попасть в сетевой стек
* length - как правило слишком большие пакеты, которые не влезают в MTU на сетевой карте. Лечится увеличением MTU.
* crc - прилетают битые пакеты. Часто - следствие высокой нагрузки на коммутатор.

h1. Что, как и когда настраивать

h2. Процессоры

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


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

У многих процессоров существует режим энергосбережения в UEFI или BIOS. Это трудно определить программным путем, поэтому лучше сразу, при настройке сервера, выключить эту опцию, выбрав режим "производительность".


h3. DCA

Владельцам процессоров Intel Xeon и сетевых карт Intel 82599 (а также многих других 10Гбит/сек сетевых карт от Intel) стоит проверить настройки DCA в BIOS/UEFI, эта опция может дать приблизительно 5-10% производительности.&nbsp;Включен он или нет можно посмотреть командами (после запуска):

{code}
dmesg | egrep -i dca
{code}
Если включен, в выводе будет:

{code}
dca service started, version 1.8
{code}
Если выключен:

{code}
ioatdma 0000:00:08.0: DCA is disabled in BIOS
{code}

h3. Гипертрединг

Использование процессора с отключенным гипертредингом может быть эффективнее, чем с включенным, несмотря на меньшее количество логических ядер. Отключить его можно при перезагрузке в UEFI или BIOS.

h3. Низкая частота

Процессоры с большим числом ядер, но низкой частотой - 2 - 2.2GHz плохо подходят для сетевых задач с низкими задержками. Низкая частота приводит к медленной обработке отдельно взятого пакета.



Оптимальная частота для процессоров используемых для сетевых задач - 3GHz+, но чем выше - тем лучше.

Если Ваш сервер плохо справляется с нагрузкой и у Вас сервер с низкой частотой - замена процессора может быть хорошим способом исправить ситуацию.


h2. Сетевые карты

h3. Размер буфера

{code}
# ethtool -g eth1
Ring parameters for eth1:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 256
{code}

Здесь видим увеличенный на максимум rx-буфер. В нашем случая оптимальное - максимальное значение, но иногда мы уменьшаем это значение, чтобы ускорить обработку пакетов.


Пример команд для увеличения буфера:

{code}
ethtool -G eth1 rx 2048
{code}

В RHEL-based дистрибутивы (платформа Carbon, CentOS, Fedora итд) укажите параметры ethtool в настройках интерфейса (`/etc/sysconfig/network-scripts/ifcfg-eth1`) строчкой:

{code}
ETHTOOL_OPTS="-G ${DEVICE} rx 2048"
{code}

Альтернативный вариант с автоматическим определением оптимального значения:

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

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

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

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

Далее выйти с сохранением настроек.

h5. Шаг 2. Проверить запись в mirror_info.conf

Открыть любым удобным для вас редактором ( например vim ) файл mirror_info.conf

{code}
vim /app/reductor/cfg/userinfo/mirror_info.conf
{code}

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

h5. Шаг 3. Рестарт редуктора

{code}
/app/reductor/service restart
{code}

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

Существует технология программного распределения обрабатываемых пакетов между ядрами - RPS. Она универсальна и подходит для любых сетевых карт, даже с одной очередью. Пример настройки:

{code}
autorps eth2
{code}

В Carbon Reductor данная утилита используется автоматически для сетевых карт с одной очередью.

h4. Комбинирование RSS и RPS

{note}
Перед настройками зафиксируйте средний рост потерь с помощью команды network-top ( chroot /app/reductor/ network-top ).

После замеров сравните, как этот показатель изменился.

Оптимизация без замеров может ухудшить ситуацию\!
{note}

В случае если:

# Используется одна сетевая карта
# Сетевая карта не привязана к конкретной NUMA-ноде (команда cat&nbsp;/sys/class/net/eth0/device/numa_node выводит "-1")
# Система имеет 2\+ физических процессора
# Один процессор не справляется с нагрузкой
# При использовании распределения реальных прерываний по ядрам обоих процессоров потерь становится ещё больше


Можно попробовать комбинировать RSS и RPS.

Для RPS нужно явно указать маску перечисляющую все доступные процессоры.

* Для 4 ядер - f
* Для 8 ядер - ff
* Для 12 ядер - fff
* Маску можно посмотреть в файле /sys/class/net/eth0/device/local_cpus

{info}
Все примеры ниже - для 2х 6-ядерных процессоров
{info}
\\

{code}
chroot /app/reductor
rss-ladder eth0
autorps eth0 -m fff -f
{code}

Чтобы эффект сохранялся после перезагрузки нужно в хуке /app/reductor/cfg/userinfo/hooks/start.sh добавить следующее:


{code}
#!/bin/bash

client_post_start_hook() {
ethtool -L eth0 combined 6 || true
rss-ladder eth0 || true
autorps eth0 -m fff -f || true
return 0
}
{code}

Если ситуация стала хуже, RPS можно отключить, указав маску = 0:

{code}
autorps eth0 -f -m 0
{code}

h4. Совместимость VLAN и RSS

Некоторые сетевые карты направляют все пакеты с одного VLAN в одну и ту же очередь, так как RSS hashing вычисляет один и тот же хэш для этих пакетов.

Некоторые карты умеют обрабатывать только VLAN первого уровня, но при использовании QinQ сталкиваются с той же проблемой.

Решения бывают разные:

* найти драйвера с поддержкой RSS+VLAN, сделанные сообществом.
* сменить сетевые карты на другую модель, которая поддерживает VLAN лучше.
* отказаться от 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

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

Статья для лучшего понимания, правда больше под маршрутизаторы : [http://habrahabr.ru/post/108240/]




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

На большинстве машин использумых в нашем случае оптимальным оказалось значение 1.

{code}
ethtool -C eth1 rx-usecs 1
{code}

h3. Опции несовместимые с FORWARD / bridge

General Receive Offload и Large Receive Offload могут приводить к паникам ядра Linux и их лучше отключать:

{code}
ethtool -K eth2 gro off
ethtool -K eth2 gso off
ethtool -K eth2 lro off
{code}

Либо при компиляции драйвера.

h3. Веса очередей (RX Flow Indirection)

В ситуации с одной активной сетевой картой и двумя физическими процессорами с разными NUMA-нодами имеет смысл снизить нагрузку на "чужую" NUMA-ноду.

Настраивается с помощью ethtool, очередям задаются веса, не все сетевые карты это поддерживают.

Экспериментов пока было не так много, но оптимальным кажется сочетание весов: 3 на ядра своей ноды, 2 на ядра чужой, так как обращения к оперативной памяти чужой NUMA-ноды медленнее, чем к своей.

Пример - допустим у нас есть 2 двухядерных процессора и сетевая карта eth2, поддерживающая 4 очереди. CPU0, CPU1 - это её локальная нода, CPU2, CPU3 - чужая.

{code}
# посмотреть текущие настройки
ethtool -x eth2
# настроить
ethtool -X eth2 weight 3 3 2 2
{code}
Обязательно проверяйте после этих изменений что всё работает так, как и ожидалось с помощью утилиты network-top.

h3. Замена сетевых карт

Иногда бывает дело просто в железе. Если уверены, что сетевая карта хорошей модели и есть ещё одна такая же - попробуйте использовать её. Возможно она просто бракованная, хоть вероятность и мала.

Иногда дело бывает в драйвере (в случае dlink / realtek сетевых карт). Они, конечно, здорово поддерживаются практически любым дистрибутивом, но для высоких нагрузок не очень подходят.

h2. Сетевой стек, iptables

h3. NOTRACK

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

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

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

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


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

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

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

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

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

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

Вы можете распределить зеркало между несколькими сетевыми картами, указав в настройках создаваемых зеркал равные диапазоны абонентских портов.

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

h4. Между серверами

{color:#333333}Вы можете располагать сетевые карты из пункта выше в разных серверах для масштабирования нагрузки.{color}

h3. Flow-control

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

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

{code}
ethtool -a eth2
{code}

h3. MTU

MTU на порту железки, отправляющей зеркало не должно быть больше, чем MTU интерфейса на Carbon Reductor (в том числе и всех VLAN), принимающего зеркало.

Рекомендуем посмотреть статистику на свитче по распределению размеров пакетов, для D-Link например команда `show packet port 1:1`

и вывод в духе:

{code}
Port number : 2:11
Frame Size/Type Frame Counts Frames/sec
--------------- ---------------------- -----------
64 1470536789 6330
65-127 511753536 12442
128-255 1145529306 1433
256-511 704083758 1097
512-1023 842811566 882
1024-1518 1348869310 7004
1519-1522 2321195608 1572
1519-2047 2321195608 1572
2048-4095 0 0
4096-9216 0 0
Unicast RX 0 0
Multicast RX 16 0
Broadcast RX 0 0
Frame Type Total Total/sec
--------------- ---------------------- -----------
RX Bytes 1384 0
RX Frames 16 0
TX Bytes 20409818277370 15162751
TX Frames 34114583632 30760
{code}

По умолчанию CentOS используется MTU = 1500, лучше выставить его равным максимальному ненулевому значению из статистики.

{code}
1519-2047 2321195608 1572
{code}

h4. Как определить потери пакетов из-за низкого MTU?

Смотрите на RX: length значение в выводе команды:

{code}
# ip -s -s link show eth1
3: eth1: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1528 qdisc mq state UP qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
5956390755888 19345313821 3533855 0 0 817154
RX errors: length crc frame fifo missed
3533855 0 0 0 0
TX: bytes packets errors dropped carrier collsns
23100 330 0 0 0 0
TX errors: aborted fifo window heartbeat
0 0 0 0
{code}

h4. Как избавиться от этих потерь?

\**Разово*\* - выполнить команду:

{code}
ip link set eth1 mtu 1540
{code}

*\*Постоянно\** \- дописать в настройки сетёвой карты `/etc/sysconfig/network-scripts/ifcfg-eth1`:

{code}
MTU=1540
{code}