Если на Вашем сервере через сетевой интерфейс проходит, скажем, 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
В итоге, одна из проблем потери пакетов решена.