今天,我们的其中一个HAProxy VM出现了一个小的故障转移问题。当我们对其进行挖掘时,发现了以下内容:
1月26日07:41:45 haproxy2内核:[226818.070059] __ratelimit:取消了10个回调 1月26日07:41:45 haproxy2内核:[226818.070064]套接字内存不足 1月26日07:41:47 haproxy2内核:[226819.560048]套接字内存不足 1月26日07:41:49 haproxy2内核:[226822.030044]套接字内存不足
每个链接显然都与的默认设置较低有关net.ipv4.tcp_mem
。因此,我们将其默认值提高了4倍(这是Ubuntu Server,不确定Linux风格是否重要):
当前值为:45984 61312 91968 新值是:183936 245248 367872
之后,我们开始看到奇怪的错误消息:
1月26日08:18:49 haproxy1内核:[2291.579726]路由哈希链太长! 1月26日08:18:49 haproxy1内核:[2291.579732]调整您的secret_interval!
嘘.. 这是一个秘密!
显然,这与/proc/sys/net/ipv4/route/secret_interval
默认值600有关,并控制路由缓存的定期刷新
该
secret_interval
指令指示内核多久清除一次所有路由散列条目,而不管它们的新旧程度如何。在我们的环境中,这通常是不好的。每次清除缓存时,CPU都会每秒忙于重建数千个条目。但是,我们将其设置为每天运行一次,以防止内存泄漏(尽管我们从未有过)。
虽然我们很乐意减少这种情况,但建议定期删除整个路由缓存似乎很奇怪,而不是简单地将旧值更快地从路由缓存中推出。
经过一番调查,我们发现/proc/sys/net/ipv4/route/gc_elasticity
这似乎是检查路由表大小的更好选择:
gc_elasticity
最佳描述为内核在开始使路由哈希条目过期之前将接受的平均存储桶深度。这将有助于维持活动路由的上限。
我们将弹性从8调整为4,以期更积极地修剪路由缓存。这secret_interval
对我们来说并不正确。但是有很多设置,目前尚不清楚哪种设置是正确的选择。
- / proc / sys / net / ipv4 / route / gc_elasticity(8)
- / proc / sys / net / ipv4 / route / gc_interval(60)
- / proc / sys / net / ipv4 / route / gc_min_interval(0)
- / proc / sys / net / ipv4 / route / gc_timeout(300)
- / proc / sys / net / ipv4 / route / secret_interval(600)
- / proc / sys / net / ipv4 / route / gc_thresh(?)
- rhash_entries(内核参数,默认未知?)
我们不想使Linux路由更糟,所以我们有点怕弄乱其中的一些设置。
对于高流量的HAProxy实例,谁能建议最好调整哪些路由参数?