核心是启用并调优动作队列以解耦日志写入与主流程:设$ActionQueueType LinkedList、$ActionQueueWorkerThreads 4、$ActionFileEnableSync off;配$ActionQueueSize 10000、磁盘备份及无限重试;调$ActionQueueTimeoutEnqueue 1000与刷盘参数;精简模块与规则。

核心是启用并调优动作队列(Action Queue),把日志写入与主处理流程解耦,避免应用线程被磁盘或网络 I/O 阻塞。
启用异步动作队列
默认 rsyslog 使用直接同步写入,高并发下极易卡住。必须显式配置队列为异步模式:
- 设置 $ActionQueueType LinkedList(推荐)或 FixedSize,启用内存队列
- 添加 $ActionQueueWorkerThreads 4(建议 2–8,视 CPU 核数而定),多线程消费队列
- 关闭同步写入干扰:$ActionFileEnableSync off
合理设定队列容量与持久化
队列太小易丢日志,太大占内存;需兼顾可靠性与资源消耗:
- $ActionQueueSize 10000:基础缓冲能力(默认仅 1000,明显不足)
- $ActionQueueFileName queue + $ActionQueueSaveOnShutdown on:启用磁盘队列备份,服务重启/崩溃后不丢日志
- $ActionResumeRetryCount -1:输出失败时无限重试,避免因临时网络抖动丢失日志
控制入队行为与刷盘节奏
防止突发日志洪峰压垮队列,也避免频繁小写放大 I/O 压力:
- $ActionQueueTimeoutEnqueue 1000:入队超时 1 秒,超时则丢弃(防死锁,非关键日志可接受)
- $ActionQueueBufferSize 64k + $ActionFileFlushInterval 1000:64KB 内存缓冲 + 每秒至少刷盘一次,平衡延迟与吞吐
- 搭配内核参数 vm.dirty_ratio=10 和 vm.dirty_background_ratio=5,减少刷盘抖动
精简规则链与输入模块
队列再强,也扛不住冗余解析和无效转发带来的开销:
- 禁用不用的输入模块,如注释掉 $ModLoad imudp(若只走 TCP 或本地 socket)
- 移除重复或无意义的规则,例如多个 *.* /var/log/messages 只保留一条
- 远程输出优先用 @@host:514(TCP)而非 @host:514(UDP),配合 $ActionSendTCPRebindInterval 30 防连接僵死


















