Тюнинг сетевого стека Linux (nic performance)

3 мин на чтение

Рекомендации :

  • отключить HT
  • привязывать сетевую карту к одному процессору (numa)

Повышение производительности сетевого стека linux.

  • Что будем тюнить
    • CPU
    • NIC
    • Soft interrupt issued by a device driver
    • Kernel buffer
    • The network layer (IP, TCP or UDP)

CPU

 apt install cpufrequtils
 cpufreq-set -g performance

NIC

Загрузка моделя ixgbe

modprobe ixgbe
/etc/modprobe.d/ixgbe.conf 
 options ixgbe IntMode=2,2  RSS=6,6  VMDQ=0,0 InterruptThrottleRate=1,1 allow_unsupported_sfp=1

IntMode 2 - режим MSI-X , нужен для поддержки multiqueue

RSS - сколько использовать очередей

VMDQ - отключаем, так как ненужен.

InterruptThrottleRate - устанавливаем 1 , подбирает динамически кол. прерываний в сек.

DCA - defaylt 1 (enable)

MQ - default 1 (enable) нужно включить для поддержки RSS

max_vfs - default 0

через запятую указываем значение для каждого порта,если четыре то =1,1,1,1

параметр allow_unsupported_sfp выставляем только одно значение = 1 , а не 1,1 если даже два порта

Отключение контроля перегрузок ```

ethtool -K eth0 lro off

### Отключение системное управление прерываний и передаем контроль NAPI.

ethtool -C eth0 adaptive-rx off

### Настройка размера очередей приёма rx-buffers-increase

 *Узнать размер буфера*

ethtool -g eth0

*Установить размер буфера*

ethtool -G eth0 rx 4096

### Размер очереди пакетов 

ip link set eth0 txqueuelen 10000

 
### Так как мы настроили распределение очередей по прерываниям (msi-x , rss ), то теперь их можно распределить по ядрам
 smp_affinity, c драйверами идет скрипт set_irq_affinity.  с привязкой к одному cpu , посмотреть номер ядра к какому cpu относится 

lscpu -p


set_irq_affinity 1,2,4,6,8,10,12,14,16,18,20,22 -x eth0

 p.s.остановить демон балансировки service irqbalance stop
 
 
### Для распределения программных прерываний(pppoe) нужно задействовать RPS(rps_cups) ,и задействуем механизм упрвления потоками RFS(rps_flow_cnt)
 

echo “0” > /sys/class/net/ens2f0/queues/rx-0/rps_cpus echo “1” > /sys/class/net/ens2f0/queues/rx-0/rps_cpus echo “2” > /sys/class/net/ens2f0/queues/rx-1/rps_cpus echo “4” > /sys/class/net/ens2f0/queues/rx-2/rps_cpus echo “8” > /sys/class/net/ens2f0/queues/rx-3/rps_cpus echo “10” > /sys/class/net/ens2f0/queues/rx-4/rps_cpus echo “20” > /sys/class/net/ens2f0/queues/rx-5/rps_cpus echo “40” > /sys/class/net/ens2f0/queues/rx-6/rps_cpus echo “80” > /sys/class/net/ens2f0/queues/rx-7/rps_cpus sysctl -w net.core.rps_sock_flow_entries=32768 echo 2048 > /sys/class/net/ens2f0/queues/rx-0/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-1/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-2/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-3/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-4/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-5/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-6/rps_flow_cnt echo 2048 > /sys/class/net/ens2f0/queues/rx-7/rps_flow_cnt

 
## Soft irq budget — это весь доступный бюджет, который будет разделён на все доступные NAPI-структуры, зарегистрированные на этот CPU. 
   по умолчанию в некоторых системах он равен 300 , рекомендуется установить 600 для сетей 10Gb/s и выше

sysctl -w net.core.netdev_budget=600

##  Kernel buffer.

*CORE settings (mostly for socket and UDP effect)
 set maximum receive socket buffer size, default 131071 *

net.core.rmem_max = 524287

*set maximum send socket buffer size, default 131071*

net.core.wmem_max = 524287

*set default receive socket buffer size, default 65535*

net.core.rmem_default = 524287

*set default send socket buffer size, default 65535*

net.core.wmem_default = 524287

*set maximum amount of option memory buffers, default 10240*

net.core.optmem_max = 524287


 [recommendet for 10G](https://downloadmirror.intel.com/5874/eng/README.txt)
 
### Tcp Udp kernel tune
 
 *TCP buffer*
 IPV4 specific settings
 
 *turn TCP timestamp support off, default 1, reduces CPU use*

net.ipv4.tcp_timestamps = 0

*turn SACK support off, default on
  on systems with a VERY fast bus -> memory interface this is the big gainer*

net.ipv4.tcp_sack = 0

 *set min/default/max TCP read buffer, default 4096 87380 174760*

net.ipv4.tcp_rmem = 10000000 10000000 10000000

 *set min/pressure/max TCP write buffer, default 4096 16384 131072*

net.ipv4.tcp_wmem = 10000000 10000000 10000000

 *set min/pressure/max TCP buffer space, default 31744 32256 32768*

net.ipv4.tcp_mem = 10000000 10000000 10000000


[recommendet for 10G](https://downloadmirror.intel.com/5874/eng/README.txt)

### UDP buffer size
*UDP generally doesn’t need tweaks to improve performance, but you can increase the UDP buffer size if UDP packet losses are happening.*

$ sysctl net.core.rmem_max


### Miscellaneous tweaks
*IP ports: net.ipv4.ip_local_port_range shows all the ports available for a new connection. If no port is free, the connection gets cancelled. Increasing this value helps to prevent this problem.
default net.ipv4.ip_local_port_range = 32768	60999*

sysctl -w net.ipv4.ip_local_port_range=’20000 60000’

*TCP SACK*

sysctl -w net.ipv4.tcp_sack=0

*TCP FIN timeout  (def 60)*

sysctl -w net.ipv4.tcp_fin_timeout = 20

*TCP timestamp*

sysctl -w net.ipv4.tcp_timestamps=0

*Как долго держать запись о поднятой сессии (def 4 days)*

net.netfilter.nf_conntrack_tcp_timeout_established = 900


### Добавляем количество полуоткрытых соединений

$sysctl -w net.core.somaxconn=2048

Проверяем 

watch -n 1 cat /proc/interrupts watch -n 1 cat /proc/softirqs ethtool -S eth0


Хорошая работа сделана ребятами  по написанию готовых скриптов [Пост на Хабре](https://habr.com/ru/post/340296/)


p.s.
Увеличение размера arp cache ,  если в dmesg появилось «Neighbour table overflow»

net.ipv4.neigh.default.gc_thresh1 = 2048 net.ipv4.neigh.default.gc_thresh2 = 4096 net.ipv4.neigh.default.gc_thresh3 = 8192 ```

Оставить комментарий