Я пытаюсь настроить разумные значения для тайм-аута arp-кеша ядра Linux, но я не могу найти подробного объяснения того, как они работают где-либо. Даже документация kernel.org не дает хорошего объяснения, я могу найти только рекомендуемые значения, чтобы уменьшить переполнение.
Вот пример имеющихся у меня значений:
net.ipv4.neigh.default.gc_thresh1 = 128
net.ipv4.neigh.default.gc_thresh2 = 512
net.ipv4.neigh.default.gc_thresh3 = 1024
Теперь из того, что я собрал до сих пор:
gc_thresh1 - это количество записей arp, разрешенное до того, как сборщик мусора начнет вообще удалять какие-либо записи.
gc_thresh2 - это мягкое ограничение, которое представляет собой допустимое количество записей, прежде чем сборщик мусора активно удалит записи arp.
gc_thresh3 - жесткое ограничение, при котором записи, превышающие это число, агрессивно удаляются.
Теперь, если я правильно понимаю, если количество записей arp превышает gc_thresh1, но остается ниже gc_thresh2, избыток будет периодически удаляться с интервалом, установленным gc_interval.
Мой вопрос: если количество записей превышает gc_thresh2, но ниже gc_thresh3, или если количество превышает gc_thresh3, как эти записи удаляются? Другими словами, что именно означает «активно» и «агрессивно» удалено? Я предполагаю, что это означает, что они удаляются чаще, чем указано в gc_interval, но я не могу найти, насколько.
Каждый раз, когда происходит принудительная сборка мусора записей, last_flush
обновляется поле в таблице соседей, neigh_table
.
Принудительная сборка мусора для записей происходит при выполнении одного из следующих условий:
gc_thresh3
gc_thresh2
, и время с last_flush
Больше или равно 5 HZ
При запросе принудительной сборки мусора записи, соответствующие обоим следующим критериям, отбрасываются:
Периодическая работа, neigh_periodic_work
пытается освободить записи, на которые нет ссылок, если общее количество записей больше, чем gc_thresh1
.
Источник: Исходный код ядра Linux, Neighbour.c