Оптимизируем сетевой адаптер под высокую нагрузку

Если на Вашем сервере через сетевой интерфейс проходит, скажем, 100-200 тысяч пакетов в секунду, то могут начаться проблемы: потеря пакетов и т.п. Чтобы этого не допустить, сделаем вот что.

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

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.50.1 netmask 255.255.255.0 broadcast 192.168.50.255
inet6 fe80::54dd:bdff:fe74:a15e prefixlen 64 scopeid 0x20
ether 53:d7:22:71:ae:5e txqueuelen 1000 (Ethernet)
RX packets 119842129 bytes 17429187936 (16.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 133750976 bytes 189190121573 (176.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

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

# ip -s -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 53:d7:22:71:ae:5e brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
17429613030 119846022 0 0 0 0
RX errors: length crc frame fifo missed
0 0 0 0 3432
TX: bytes packets errors dropped carrier collsns
189196317138 133754730 0 0 0 0
TX errors: aborted fifo window heartbeat transns
0 0 0 0 2

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

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

# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 2048
RX Mini: 0
RX Jumbo: 0
TX: 1024
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256

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

# ethtool -G eth0 rx 1024

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

ETHTOOL_OPTS="-G eth0 rx 1024"

Или если есть и большой исходящий трафик, то:

ETHTOOL_OPTS="-G eth0 rx 1024 tx 1024"

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

Для Ubuntu или Debian можно через Sysctl поиграть с параметрами tcp_rmem и tcp_rmem_max. У настраиваемой памяти сокета есть три значения, описывающих минимальное, значение по умолчанию и максимальное значения в байтах. Посмотреть текущие значения:

# sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 87380 6291456

Увеличим

# sysctl -w net.ipv4.tcp_rmem="16384 349520 16777216"

И максимальное значение

# sysctl net.core.rmem_max
net.core.rmem_max = 212992

Увеличим

# sysctl -w net.core.rmem_max=16777216

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


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Unlix © Все права защищены 2019

Копирование материалов с сайта Unlix.ru без указания полной ссылки на источник ЗАПРЕЩЕНО!