Оптимизация сетевой карты под высокую пропускную способность.

Имеется сервер, на который каждую секунду приходит до 200 тысяч пакетов для обработки. В ходе настройки сервера под это дело, столкнулся с тем, что на уровне ядра начали отбрасываться пакеты из за переполнения буфера сетевой карты.

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

  1. . Определение необходимости увеличения размера буфера сетевой карты

    Имя интерфейса можно посмотреть командой — ip list, ifstat или ifconfig. Примерный вывод:

    Нас интересует параметр missed, где и видим, что пакеты теряются на сетевой карте, что явно показывает необходимость увеличения буферов на сетевой карте.
  2. Нам необходимо посмотреть текущие размеры буфера и максимально возможные для сетевой карты. Делается это командой

    Пример вывода:

    Где видим, что для RX, входящих пакетов — можно увеличить буфер до 4 Мбайт.
  3. Меняем параметры сетевой карты

    Однако, параметры сбросятся после перезагрузки. Для постоянного применения параметра необходимо в файле настроек интерфейса /etc/sysconfig/network-scripts/ifcfg-Имя_интерфейса (Rhel, Centos) добавить следующую строку

    Хочу обратить внимание на алгоритм обработки параметра ETHTOOL_OPTS. Если в переданных параметрах присутствует знак «-«, то команде ethtool не передается название сетевого интерфейса, т.к. ключи у ethtool, содержащие «-» должны иметь название интерфейса. А другие параметры, такие как режим работы — не требуют.

В итоге, одна из проблем потери пакетов решена.