• linux系统日志__ratelimit: N callbacks suppressed


    报错

    今天线上遇到故障,php进行因为段错误退出了,系统日志中的kernel报错如下:

    Feb 25 22:25:11 web_server_01 kernel: __ratelimit: 250 callbacks suppressed
    Feb 25 22:25:11 web_server_01 kernel: php-fpm[25942]: segfault at 2c6 ip 00000000000002c6 sp 00007fffdcf9e798 error 14 in php-fpm[400000+a3b000]  

    查询

    对于__ratelimit: 250 callbacks suppressed的报错的原因不是很理解,遂做了一番查询,记录一下:

    __ratelimit: N callbacks suppressed表示内核阻止了N条syslog消息,这是因为系统重复的日志过多(频率过高),太快输出,被内核中的net_ratelimit()限制了syslog消息。

    源码参考:http://fxr.watson.org/fxr/source/lib/ratelimit.c?v=linux-2.6

    这个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。

    [root@web_server_01 ~]#  cat /proc/sys/kernel/printk_ratelimit
    5
    [root@web_server_01 ~]#  cat /proc/sys/kernel/printk_ratelimit_burst
    10
    [root@web_server_01 ~]# 
    

    然而,在内核的网络代码中有自己的限制配置(逻辑相同,但是是独立的配置) /proc/sys/net/core/message_cost和/proc/sys/net/core/message_burst,默认配置也是5和10。这里message_cost也是日志采样时间。

    [root@web_server_01 ~]# cat /proc/sys/net/core/message_cost
    5
    [root@web_server_01 ~]# cat /proc/sys/net/core/message_burst
    10
    [root@web_server_01 ~]#
    

    如果要关闭ratelimit机制,也就是允许每个消息都记录下来,则可以设置message_cost值为0

    sysctl -w net.core.message_cost=0

    不过,一旦关闭ratelimit,系统就可能存在被日志攻击的风险。

    参考链接:https://huataihuang.gitbooks.io/cloud-atlas/content/os/linux/kernel/log/ratelimit.html

  • 相关阅读:
    前端3 浮动布局,固定定位,绝对定位,相对定位
    前端2 字体|文本属性样式, 高级选择器
    前端1.概念
    前端,基础选择器,嵌套关系.display属性,盒模型
    数据库之索引
    数据库之进阶(视图,事务,存储过程)
    数据库,多表数据
    数据库之表的使用
    数据的演化(数据仓库的发展史)
    HDFS退出安全模式
  • 原文地址:https://www.cnblogs.com/thatsit/p/6443418.html
Copyright © 2020-2023  润新知