系统kern
日志不断重复输出:
...
... kernel: : __ratelimit: 133 callbacks suppressed
... kernel: : TCP: time wait bucket table overflow
... kernel: : TCP: time wait bucket table overflow
...
... kernel: : __ratelimit: 107 callbacks suppressed
... kernel: : TCP: time wait bucket table overflow
...
其中
kernel: : TCP: time wait bucket table overflow
分析见系统日志"TCP: time wait bucket table overflow"分析
__ratelimit: N callbacks suppressed
表示内核阻止了N
条syslog消息,这是因为系统重复的日志过多(频率过高),太快输出,被内核中的net_ratelimit()
限制了syslog消息。
源代码可以参考 FreeBSD/Linux Kernel Cross Reference; sys/net/core/utils.c
ratelimit.c - Do something with rate limit.
这个rate limit
也是Linux为了避免DoS攻击的一种机制,避免每个消息都被记录(会导致存储空间撑爆)。当内核记录消息,使用printk()
通过这种机制来检查是否输出日志。
这个限制可以通过/proc/sys/kernel/printk_ratelimit
和/proc/sys/kernel/printk_ratelimit_burst
来调优。默认配置(RHEL6)分别是5
和10
。也就是说,内核允许每5秒记录10条消息。超过这个限制,内核就会抛弃日志,并记录ratelimit N: callbacks suppressed
。
然而,在内核的网络代码中有自己的限制配置(逻辑相同,但是是独立的配置) /proc/sys/net/core/message_cost
和/proc/sys/net/core/message_burst
,默认配置也是5
和10
。这里message_cost
也是日志采样时间。
如果要关闭ratelimit
机制,也就是允许每个消息都记录下来,则可以设置message_cost
值为0
sysctl -w net.core.message_cost=0
不过,一旦关闭ratelimit
,系统就可能存在被日志攻击的风险。
参考
- What does “net_ratelimit: 44 callbacks suppressed” mean on a linux based router?
- Linux: Getting rid of “net_ratelimit: N callbacks suppressed” messages
- 关于linux日志中存在大量martian source 日志信息的原因分析与理解 - 这篇文章分析IP源地址异常非常详细(所谓
martian source
也就是impossible source
,也就是linux根据路由表判断,认为不合理的,不应该出现的源地址。)