Оптимизация сетевой карты под высокую пропускную способность.
Имеется сервер, на который каждую секунду приходит до 200 тысяч пакетов для обработки. В ходе настройки сервера под это дело, столкнулся с тем, что на уровне ядра начали отбрасываться пакеты из за переполнения буфера сетевой карты.
В первую очередь необходимо определить где идут потери, т.к. помимо буфера сетевой карты есть еще несколько неоансов в настройке самого сервера, используемого ПО.
- . Определение необходимости увеличения размера буфера сетевой карты1ip -s link show Имя_интерфейса
Имя интерфейса можно посмотреть командой — ip list, ifstat или ifconfig. Примерный вывод:
1234567891011[root@dracula ~]# ip -s -s link show em12: em1: <BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000link/ether 00:0e:a6:3e:7b:79 brd ff:ff:ff:ff:ff:ffRX: bytes packets errors dropped overrun mcast3148064261 7289427 0 0 0 643005RX errors: length crc frame fifo missed0 0 0 0 342345TX: bytes packets errors dropped carrier collsns2308950523 4777592 0 0 0 0TX errors: aborted fifo window heartbeat0 0 0 0Нас интересует параметр missed, где и видим, что пакеты теряются на сетевой карте, что явно показывает необходимость увеличения буферов на сетевой карте.
- Нам необходимо посмотреть текущие размеры буфера и максимально возможные для сетевой карты. Делается это командой1ethtool -g Имя_интерфейса
Пример вывода:
123456789101112[root@dracula ~]# ethtool -g em1Ring parameters for em1:Pre-set maximums:RX: 4096RX Mini: 0RX Jumbo: 0TX: 1024Current hardware settings:RX: 512RX Mini: 0RX Jumbo: 0TX: 128Где видим, что для RX, входящих пакетов — можно увеличить буфер до 4 Мбайт.
- Меняем параметры сетевой карты1ethtool -G Имя_интерфейса rx 1024
Однако, параметры сбросятся после перезагрузки. Для постоянного применения параметра необходимо в файле настроек интерфейса /etc/sysconfig/network-scripts/ifcfg-Имя_интерфейса (Rhel, Centos) добавить следующую строку
123ETHTOOL_OPTS="-G Имя_интерфейса rx 1024"# Или если есть и большой исходящий трафик, то:ETHTOOL_OPTS="-G Имя_интерфейса rx 1024 tx 1024"Хочу обратить внимание на алгоритм обработки параметра ETHTOOL_OPTS. Если в переданных параметрах присутствует знак «-«, то команде ethtool не передается название сетевого интерфейса, т.к. ключи у ethtool, содержащие «-» должны иметь название интерфейса. А другие параметры, такие как режим работы — не требуют.
В итоге, одна из проблем потери пакетов решена.