rsyslogd: imjournal: 2475 messages lost due to rate-limiting解决办法
结合你提供的最新日志 rsyslogd: imjournal: 2475 messages lost due to rate-limiting 以及之前的 sudo 高频会话日志,可以得出非常明确的结论。
1. 核心结论:发生了什么?
现象解释:
系统发生了日志雪崩。之前看到的每秒数十次的 sudo 会话创建,产生了海量的日志消息。由于日志产生速度超过了 rsyslog(通过 `imjournal模块从 systemd-journald读取日志)的处理能力或默认限速阈值,导致 2475 条日志被直接丢弃。
危害升级:
关键信息丢失:这 2475 条丢失的日志中,可能包含其他服务的报错、安全审计记录或系统状态信息。一旦丢失,无法恢复。
掩盖真实故障:如果系统此时真的有严重错误(如磁盘满、内核恐慌前兆),这些错误日志也会因为“通道堵塞”而被丢弃,导致你无法排查真正的问题。
资源耗尽风险:高频的日志生成和丢弃过程会消耗大量的 CPU 和 I/O 资源,可能导致系统响应变慢。
2. 根本原因定位
触发源依然是那个高频执行 sudo 的进程。
之前的分析指出是 sudo 在极短时间内频繁开闭会话。现在 rsyslog 报错证实了这种高频行为已经击穿了系统的日志缓冲机制。
链路如下:
某个脚本/程序(疑似监控Agent或配置错误的Cron)在 08:40:00 - 08:40:04 期间疯狂调用 sudo。
每次 sudo 调用都触发 systemd 记录 Started Session 和 pam_unix 日志。
短时间内产生数千条日志。
systemd-journald 将日志传递给 rsyslog 的 imjournal 模块。
rsyslog 发现速率超过限制(默认配置通常较严格),开始丢弃后续日志并记录 messages lost due to rate-limiting。
3. 紧急排查与解决步骤
第一步:找出“元凶”进程(必须执行)
由于部分日志已丢失,我们需要在日志恢复正常后,或者通过其他手段找到是谁在调 sudo。
方法 A:查看 Audit 日志(最可靠)
auditd 通常比 syslog 更底层,可能记录了完整的命令执行详情,且不受 rsyslog 限流影响(除非 auditd 自身也限流)。
bash
# 搜索该时间段内 sudo 的执行记录
ausearch -sc execve -ts "09/14/2026 08:39:00" -te "09/14/2026 08:43:00" | grep sudo
关注输出中的 exe= 和 key= 字段,以及父进程 PID。
方法 B:实时监控进程树(如果问题仍在持续)
打开一个终端,运行以下命令,观察当 sudo 频繁出现时,它的父进程(PPID)是谁:
bash
# 实时打印包含 sudo 的进程及其父进程
watch -n 1 "ps -eo pid,ppid,cmd | grep sudo | grep -v grep"
一旦看到大量 sudo 进程,记下它们的 PPID,然后 ps -fp <PPID> 查看父进程是什么。
方法 C:检查常见的监控 Agent 配置
根据经验,90% 的此类情况来自以下软件,请优先检查:
Zabbix Agent: 检查 /etc/zabbix/zabbix_agentd.conf 或 /etc/zabbix/zabbix_agentd.d/ 下的自定义脚本。是否有 UserParameter 调用了 sudo 且频率很高(如每几秒一次)?
Prometheus Node Exporter: 检查是否有 textfile collector 脚本在频繁执行特权命令。
Cloud Init / Config Management: 如 Ansible, Puppet, SaltStack 是否在后台频繁运行?
第二步:临时缓解日志丢失(治标)
为了防止后续再次丢失关键日志,可以临时调整 rsyslog 和 journald 的限流策略。
1. 调整 systemd-journald 限流
编辑 /etc/systemd/journald.conf:
ini
[Journal]
# 将速率限制放宽或关闭(生产环境建议放宽而非完全关闭,避免磁盘爆满)
RateLimitIntervalSec=30s
RateLimitBurst=10000 # 默认可能是 1000,调大至 10000 或更高
重启 journald:
bash
systemctl restart systemd-journald
2. 调整 rsyslog imjournal 限流
编辑 /etc/rsyslog.conf,在模块加载部分(通常在文件顶部)添加或修改:
bash
module(load="imjournal"
StateFile="imjournal.state"
Ratelimit.Interval="60"
Ratelimit.Burst="20000"
)
注意:不同版本的 rsyslog 参数名可能略有不同,旧版可能是 $ImJournalRatelimitInterval。
重启 rsyslog:
bash
systemctl restart rsyslog
第三步:根治问题(治本)
找到第一步中确定的“元凶”脚本或服务后:
如果是监控脚本:
优化权限:不要在该脚本中使用 sudo。将该脚本需要执行的命令配置在 /etc/sudoers 中允许特定用户无密码执行,或者最好直接以 root 身份运行该监控代理(如果安全策略允许)。
降低频率:检查监控项的采集间隔,是否设置得过短(如 1s 一次)?改为 10s 或 60s。
合并命令:如果脚本需要执行多个特权命令,尽量合并为一个 sudo 调用,而不是每个命令都加 sudo。
如果是错误的 Cron 任务:
修正 Crontab,移除不必要的 sudo,或增加 sleep 时间。
总结
当前状态:系统正在经历日志风暴,导致关键日志丢失。
直接原因:rsyslog 的 imjournal 模块触发了速率限制。
根本原因:某个进程(极大概率是监控 Agent 或自动化脚本)在极高频地调用 sudo。
下一步行动:
立即使用 ausearch 或 ps 找到调用 sudo 的具体命令和父进程。
临时调大 journald 和 rsyslog 的 RateLimitBurst 以防更多日志丢失。
最终优化该脚本/配置,减少 sudo 调用频率或消除不必要的提权操作。
posted on 2026-09-14 09:24 sunny_2016 阅读(7) 评论(0) 收藏 举报
浙公网安备 33010602011771号