Изменение gc_thresh в Linux

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

Например в «gc_thresh1» указывается минимальное количество хранимых ARP записей которое не очищается, в «gc_thresh2» количество после которого записи начнут чистится через 5 секунд, в «gc_thresh3» количество при достижении которого записи начнут очищаться сразу. Если например сервер используется для NAT и с большим количеством узлов сети, а значений «gc_thresh» которые у вас указаны не достаточно, то в логах /var/log/kern.log можно будет увидеть ошибку «arp_cache: neighbor table overflow!».

Сначала посмотрим текущие значения:

cat /proc/sys/net/ipv4/neigh/default/gc_thresh1
cat /proc/sys/net/ipv4/neigh/default/gc_thresh2
cat /proc/sys/net/ipv4/neigh/default/gc_thresh3

Или так:

sysctl -a |grep "neigh.default.gc_thresh"

Посмотрим количество arp записей и динамику их изменений:

arp -an | wc -l
arp -an | grep incom | wc -l
arp -an | grep "не завершено" | wc -l
arp -an | less
for i in {1..10}; do cat /proc/net/arp | wc -l && sleep 5; done
ip n | wc -l
ip n | grep STALE | wc -l
ip n | grep REACHABLE
ip n | less
ip -s neighbor show

Например для сервера который обслуживал больше 6000 клиентов, я указал:

sysctl -w net.ipv4.neigh.default.gc_thresh3=24456
sysctl -w net.ipv4.neigh.default.gc_thresh2=12228
sysctl -w net.ipv4.neigh.default.gc_thresh1=8192

Чтобы значения не сбросились после перезапуска операционной системы, укажем их в файле /etc/sysctl.conf:

net.ipv4.neigh.default.gc_thresh1=8192
net.ipv4.neigh.default.gc_thresh2=12228
net.ipv4.neigh.default.gc_thresh3=24456

Подобным образом укажем для IPv6:

net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=12228
net.ipv6.neigh.default.gc_thresh3=24456

Если не изменяли их ранее, то применим то что в файле /etc/sysctl.conf командой ниже:

sysctl -p

Замечу, что указывать большие значения для gc_thresh1 не правильно, нужно учитывать сколько клиентов обслуживает ваш сервер, так как если вы укажете большое значение для gc_thresh1, то это может означать что количество arp записей выше этого значения, никогда не будут удалены из кэша, а когда у клиента допустим изменится mac адрес или ip адрес, то могут быть сбои с его доступностью, так как в кэше будут старые записи.

Устаревшие arp записи помечаются из REACHABLE в STALE и позже очищаются, не существующие записи помечаются как INCOMPLETE и тоже очищаются.

Посмотрим таймеры: проверки устаревших arp записей (gc_stale_time), их очистки (gc_interval) и пометки как устаревшие (base_reachable_time_ms):

cat /proc/sys/net/ipv4/neigh/all/gc_stale_time
cat /proc/sys/net/ipv4/neigh/default/gc_interval
cat /proc/sys/net/ipv4/neigh/default/base_reachable_time_ms

При желании можно увеличить:

echo 120 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 60 > /proc/sys/net/ipv4/neigh/default/gc_interval

Если изменяли их, то укажем также в /etc/sysctl.conf (показываю значения по умолчанию для Ubuntu Server 16.04):

net.ipv4.neigh.default.gc_stale_time = 60
net.ipv4.neigh.default.gc_interval = 30
net.ipv4.neigh.default.base_reachable_time_ms=30000

Смотрите также мои статьи:
Тюнинг nf_conntrack
Решение ошибки «nf_conntrack: table full, dropping packet»

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

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