文章目录
- 问题描述
- 问题分析
- 为什么要限速?
- 解决方案
问题描述
前几年给客户部署一套rsyslog日志服务,对厂区内的网络设备进行日志存储。不过在近期出现了一些问题,rsyslog日志服务会在关键时刻掉链子。比如网络异常时,只能找到一小部分日志,而绝大部分日志消失了。这一点也被他们偶然捕抓到交换机有大量刷日志,但是rsyslog始终没有日志更新。
我通过远程发现rsyslog日志服务会刷新如下日志:
Apr XX 17:XX:21 localhost journal: Suppressed 1830 messages from /user.slice/user-1000.slice
imjournal: 12856 messages lost due to rate-limiting
问题分析
从REDHAT官方的反馈,它是一个正常现象…默认情况之下,rsyslog是有速率限制的。默认是每600秒20000条消息,超过将直接丢弃。
为什么要限速?
为确保系统资源不过度消耗,Linux系统已经实施了日志记录的速率限制。这一措施的目的在于防止日志记录过程占用过多的系统资源。然而,为了记录各类事件,Linux系统必须将这些事件写入消耗系统资源的磁盘中。虽然有大量需要记录到磁盘上的事件,但是过多的记录可能对系统造成压力,可能导致更为重要的服务出现响应迟缓甚至失败的情况。
鉴于上述情况,通常不建议完全关闭速率限制,而是应根据需求进行适当的调整。同时,Linux系统亦不希望因为限制过度,而丧失了生成关键警报所需的重要信息。因此,我们需要在平衡点上做出权衡。
解决方案
- systemd参数调整
默认情况下,systemd 允许在30秒内发送1000条消息。
vi /etc/systemd/journald.conf
---变更---
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
---变更---
systemctl restart systemd-journald
如果在 RateLimitInterval 定义的时间内接收到的消息超过 RateLimitBurst 中指定的数量,那么间隔内的所有进一步消息将被删除,直到间隔结束。
可以根据需要修改这些值。如果将日志记录速率限制设置为0,那么将完全禁用 systemd 日志记录速率限制。
2.rsyslog参数调整
vi /etc/rsyslog.conf
---变更---
$ModLoad imjournal
$imjournalRatelimitInterval 600
$imjournalRatelimitBurst 20000
---变更---
systemctl restart rsyslog