文章目录

  • 问题描述
  • 问题分析
  • 为什么要限速?
  • 解决方案


问题描述

前几年给客户部署一套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系统亦不希望因为限制过度,而丧失了生成关键警报所需的重要信息。因此,我们需要在平衡点上做出权衡。

解决方案

  1. 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