跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

audit.log 写满导致系统卡死的 audit_backlog_wait_time 与 backlog_limit

audit_backlog_wait_time 仅在 backlog 队列满但未超 audit_backlog_limit 时生效;一旦触发“backlog limit exceeded”,内核直接丢弃事件,该参数完全不参与流程。 audit.log 写满时 audit_backlog_wait_time 不生效?先看内核是否真在等 很多运维遇到
audit.log
满盘、
auditd
停写、系统响应变慢甚至卡死,第一反应是调大
audit_backlog_wait_time
。但实际中这个参数常常“没用”——因为内核根本没走到等待逻辑。它只在 backlog 队列满且
audit_backlog_limit
(注意不是
backlog_limit
)未被突破时才起作用;一旦队列溢出触发丢弃策略(
auditctl -e 2
锁定后默认丢弃),内核就直接 drop event,连等都不等。 验证方法:
auditctl -s | grep -E "(backlog|enabled)"
确认当前
backlog_limit
值和
enabled
状态;再查
dmesg | grep audit
,若看到
audit: backlog limit exceeded
,说明已丢弃,
audit_backlog_wait_time
此时完全不参与流程。 backlog_limit 和 audit_backlog_wait_time 的真实作用边界
backlog_limit
是内核 audit subsystem 中的硬队列长度(单位:条目数),默认 8192;
audit_backlog_wait_time
是每个 audit 事件在队列中最多等待的微秒数(us),默认 6000000(即 6 秒)。两者配合逻辑如下: 当 audit 队列未满,新事件入队,不触发等待或丢弃 当队列已满,且
audit_backlog_wait_time > 0
,内核会循环尝试等待空位,超时则丢弃该事件 若
audit_backlog_wait_time == 0
,队列一满就立即丢弃(最激进) 若
audit_backlog_wait_time (如 -1),表示无限等待——但这极易导致进程 hang 住,尤其在高 syscall 频率场景(如编译、容器启动)
关键点:
backlog_limit
控制容量,
audit_backlog_wait_time
控制单次等待耐心,但**不控制日志落盘速度**。日志写满本质是
auditd
处理慢 + 磁盘空间不足 + 规则太宽泛,调这两个参数只是“缓震”,不是根治。 audit.log 爆满时真正该优先检查的三件事 别急着改内核参数。先确认以下三项,它们比调
audit_backlog_wait_time
更直接影响系统是否卡死:
auditctl -l
查规则数量和匹配频率——一条
-a always,exit -F arch=b64 -S execve
在 busy 进程上每秒可产数百事件
ls -lh /var/log/audit/audit.log
+
df -h /var/log/audit
确认磁盘是否真满,以及 logrotate 是否失效(检查
/etc/logrotate.d/auditd
systemctl status logrotate
ps aux | grep auditd
auditd
进程是否 zombie 或 high CPU,再用
strace -p $(pgrep auditd) -e trace=write,fsync
看它是否卡在写磁盘或 sync 上 常见陷阱:把
backlog_limit
调到 65536 后发现卡得更狠——因为大量事件堆积在内存队列里,反而加剧内存压力和调度延迟。 临时缓解与长期配置建议 若已卡死,优先执行: 手动轮转日志:
service auditd rotate
auditctl -R /etc/audit/rules.d/*.rules
(重载规则清空队列) 紧急限流:
auditctl -e 1
(设置为不可修改但允许丢弃),再
auditctl -s | grep enabled
确认返回值为 1 缩小规则范围:删掉
-F key=
以外的宽泛规则,尤其是无
-F arch=
限定的
execve
监控 长期配置必须同步做三件事:启用
logrotate
delaycompress
maxsize
、在
/etc/audit/auditd.conf
中设
max_log_file = 50M
num_logs = 5
、用
auditctl -e 2
锁定规则防误操作。内核参数只作为兜底:建议
backlog_limit = 16384
audit_backlog_wait_time = 1000000
(1 秒),避免无限等待。 真正难处理的是那些既不能关 audit、又必须全量记录 execve 的合规场景——这时 backlog 参数调优只是表象,背后得靠异步日志转发(如 auditd + audispd + kafka)或 eBPF 替代方案来解耦内核事件生产与用户态消费。

相关文章