gc_thresh 内核配置问题

gc_thresh 内核配置问题

我们的数据中心的内核日志存在问题:

arp_cache: neighbor table overflow!

这与我们所有的服务器上都有 consul 使用 gossip 协议并“淹没”arp 缓存有关。我宽松地使用泛洪,因为有 300 个左右的成员,但这远低于默认的 gc_thresh3 限制,并且在任何给定时间我们只看到其中的 25 个。我们将所有服务器上的以下所有设置加倍:

gc_thresh1(自 Linux 2.2 起) ARP 缓存中保留的最小条目数。如果缓存中的条目数少于此数量,垃圾收集器将不会运行。默认为 128。

gc_thresh2(自 Linux 2.2 起)保留在 ARP 缓存中的软最大条目数。垃圾收集器将允许条目数超过此值 5 秒,然后才会执行收集。默认为 512。

gc_thresh3(自 Linux 2.2 起)保留在 ARP 缓存中的硬最大条目数。如果缓存中的条目数量超过此数量,垃圾收集器将始终运行。默认为 1024。

这解决了这个问题,但我不知道为什么,因为当我 arp -n 时,它远未达到达到 gc_thresh3 所需的 1024 个条目。我查看了我们内核版本中的代码:

https://github.com/torvalds/linux/blob/31cc088a4f5d83481c6f5041bd6eb06115b974af/net/core/neighbour.c#L388

这看起来像是一个简单的增量,与文档一致,但它在限制之前就被驱逐了,并抛出了上面的错误消息。有谁能深入了解我不理解的内容或我的分析是如何错误的?我想弄清楚这一点,以便我们可以计划如何适当地设置这些设置。提前致谢!

相关内容