|
Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.
|
Изменения (52)
просмотр истории страницы{toc} |
В производительность модуля фильтрация не упирается, как правило единственной проблемой при запуске бывает не совсем корректное работающее по умолчанию оборудование (процессор, сетевые карты). Мы много сталкивались с этим, поэтому готовы помочь с настройкой этого оборудования для обеспечения отличной производительности. |
Есть три четыре вещи которые в основном влияют на потерю пакетов при приёме (допустим, нас не волнует как долго он будет проходить через нашу систему, то есть latency мы можем жертвовать), а наша задача - поймать все пакеты, не упустив ни одного и обработать. |
|
Итак, вещи: |
h1. Как увидеть информацию о потерях |
|
- размер буфера сетевой карты - правильное распределение прерываний входящих очередей сетёвки по ядрам - мощность ядер процессора, обрабатывающего пакеты - различные значения rx-usecs |
Ключевые слова: missed, dropped, fifo, error, rx. {code} ip -s -s link show eth1 {code} |
|
Разберём их по порядку и набросаем пару костылей которые позволят вам заставить компуктир работать на полную мощь! |
Смотреть нужно на RX Errors. Некоторые сетевые карты предоставляют более подробную информацию о характере потерь: |
|
# Размер буфера сетевой карты |
{code} ethtool -S eth1 {code} |
|
[root@centos ~]# 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 |
Потери могут быть не только на сетевых картах Carbon Reductor. Они могут быть и на порту сетевого оборудования, отправляющего зеркало трафика. О том, как это посмотреть можно узнать из документации производителя сетевого оборудования. |
|
Здесь мы видим выкрученный на максимум rx-буфер. По гуглу и описанию знакомых, значение RX-буфера по сути означает количество указателей на пакеты, которое сетевая карта может накопить до поступления прерывания по usecs'ам перед выплёвыванием далее в ядро. Подобрать значение довольно сложновато, ибо тут такая ситуация: _Есть два стула, на одном задержки точеные, на другом потери мощные._ |
h1. Нагрузка на процессор и что она значит |
|
Иными словами высокое значение RX-буфера - задержки, низкое - потери. Вообще, недавно у нас в компании была дискуссия на эту тему, о том чем всё же по факту является значение Current HW Settings RX - реальным потолком буфера пакетов или значением при превышении которого необходимо сигнализировать о том, пора обрабатывать эти пакеты очень срочно, а на самом деле они могут копиться до Pre-set maximums. Внятных аргументов я не услышал, но пометочку о том, что надо почитать документацию и исходники на эту тему себе сделал. |
Выполните команду |
|
Пример команды для увеличения буфера: |
{code} top -cd1 {code} и нажмите клавишу "1". |
|
ethtool -G eth1 rx 4096 |
Вы увидите что-то в духе: |
|
# Распределение прерываний |
{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 находятся на нуле - это не очень хорошо. # 0% на каждом ядре - вы скорее всего ещё не настроили зеркало, а если всё работает - у вас замечательный сервер. # 1-3% на каждом ядре - всё хорошо настроено, можно даже увеличивать канал и не особо беспокоиться об апгрейде железа. # 6-10% в принципе сойдёт. # 11-15% повод задуматься о покупке более хорошего оборудования или его настройке. # 20-100% скорее всего будут потери пакетов и пропуски фильтрации. Если ситуация сохраняется после того, как вы прошлись по всем пунктам в этой статье (и воспользовались ими) - свяжитесь с технической поддержкой. |
|
Многие сетевые карты имеют несколько очередей для входящих пакетов. Каждая очередь висит на ядре/списке ядер. На многих железках из коробки, несмотря на то, что в smp\_affinity\_list указан список 0-$cpucount все прерывания находятся на первом ядре процессора. Обойти это можно раскидав с помощью echo все прерывания на разные ядра. |
На постоянное использование можно добавлять команды в хук start.sh в функцию client_post_start_hook(). |
|
По возможности используйте разные реальные ядра, допустим, дано: |
h1. Network Top |
|
- 1 процессор с гипертредингом - 4 реальных ядра - 8 виртуальных ядер - 4 очереди сетевой карты, которые составляют 95% работы сервера |
В комплекте с редуктором поставляется утилита |
|
Раскинуть их на 0, 1, 2 и 3 ядра будет не так эффективно, как на 0, 2, 4 и 6. |
{code} chroot /app/reductor network-top {code} |
|
Пример кода (костыльный и неуниверсальный), который раскидывает 8 очередей на 8 ядер (довольно простой случай). |
Запускается без аргументов, показывает полную картину нагрузки на сетевые карты и ядра процессора в реальном времени. Аномально высокие значения подсвечиваются желтым (больше нормы) или красным (критично) цветом. |
|
#!/bin/bash |
|
nic=eth1-TxRx- cpucount=$(grep -c 'model name' /proc/cpuinfo) grep $nic /proc/interrupts | while read irq $(eval echo cpu{1..$cpucount}) t queue t; do irq=${irq//:} /proc/irq/$irq/smp_affinity_list echo "${queue##*TxRx-}" > /proc/irq/$irq/smp_affinity_list done |
h1. Размер буфера сетевой карты |
|
# Мощность ядер процессора |
{code} [root@centos ~]# 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} |
|
[root@centos ~]# grep '' /sys/devices/system/cpu/cpu0/cpufreq/scaling_{min,cur,max}_freq /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq:1600000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq:1600000 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq:3201000 |
Здесь мы видим увеличенный до максимума rx-буфер. |
|
Суть видна - довольно мощный процессор работает в полсилы и даже не собирается напрягаться. |
В Carbon Reductor DPI X при добавлении сетевой карты для фильтрации через мастер для неё автоматически настраивается оптимальный размер RX-буфера. |
|
Заставить их напрячься можно так: |
Также он настраивается автоматически при использовании опции FWBOOST. |
|
#!/bin/bash cpucount=$(grep -c 'model name' /proc/cpuinfo) sysdir=/sys/devices/system/cpu for cpu in $(eval echo cpu{0..$((cpucount-1))}); do cat $sysdir/$cpu/cpufreq/scaling_max_freq > $sysdir/$cpu/cpufreq/scaling_min_freq done |
|
# Различные значения rx-usecs |
h1. Распределение прерываний |
|
Не буду плодить энтропию, так что вот ссылка на хорошую статью (правда заточенную под маршрутизаторы больше): http://habrahabr.ru/post/108240/ |
{include:reductor5:Распределение прерываний} |
|
В кратце - можно за счёт повышения нагрузки на процессор слегка снять напряги с сетёвки уменьшая. На большинстве машин использумых в моём случае оптимальным оказалось значение 1. |
h1. Мощность ядер процессора |
|
ethtool -C eth1 rx-usecs 1 |
В Carbon Reductor DPI X процессор автоматически настраивается на максимально доступную базовую частоту. h1. Настройки rx-usecs В Carbon Reductor DPI X автоматически подбирается оптимальное значение этого параметра для сетевой карты при использовании опций FWBOOST. h1. Замена сетевых карт Иногда бывает дело в используемом оборудовании. Если Вы уверены, что сетевая карта хорошей модели и есть ещё одна такая же - попробуйте использовать её. Возможно она просто бракованная. Иногда дело бывает в драйвере (в случае dlink / realtek сетевых карт). Они не подходят для высоких нагрузок. h1. Отключение гипертрединга В некоторых случаях использование процессора с отключенным гипертредингом оказывалось эффективнее, чем с включенным, несмотря на меньшее количество логических ядер. Делать это стоит, если все предыдущие пункты не помогают. h1. Включение RPS В Carbon Reductor DPI X эта технология автоматически настраивается для сетевых карт с одной очередью. При использовании опции FWBOOST эта технология автоматически настраивается в сочетании с RSS. h1. Актуализация настроек зеркала трафика Разнесение всех интерфейсов зеркала трафика по отдельным бриджам даёт снижение нагрузки. h1. Использование нескольких сетевых карт для приёма зеркала Вы можете распределить зеркало между несколькими сетевыми картами, указав в настройках создаваемых сессий зеркалирования равные диапазоны абонентских физических портов. h1. MTU MTU на порту коммутатора, отправляющего зеркало не должно быть больше, чем MTU интерфейса на Carbon Reductor (в том числе и всех VLAN), принимающего зеркалированный трафик. Рекомендуем посмотреть статистику на коммутаторе по распределению размеров пакетов, для D-Link например команда {code} show packet port 1:1 {code} и вывод в духе: {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} h2. Как определить потери пакетов из-за низкого 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} Как избавиться от этих потерь? Разово: {code} ip link set eth1 mtu 1540 {code} На постоянной основе: Дописать в конфиг сетевой карты (например /etc/sysconfig/network-scripts/ifcfg-eth1): {code} MTU=1540 {code} |