rsyslog默认单线程处理tcp连接和规则匹配,高并发时worker线程成瓶颈;需显式配置多线程输入(如module(load="imtcp" threads="8"))、分离ruleset、启用异步队列、禁用同步i/o及低效模块,并协同调优内核参数与文件描述符。

核心问题不是“CPU跑满”,而是rsyslog默认单线程处理TCP连接和规则匹配,导致高并发远程日志涌入时,单个worker线程成为瓶颈,无法充分利用多核资源,进而引发队列堆积、超时丢包或连接拒绝。
启用多线程输入与并行处理
rsyslog 8.0+ 支持真正的多线程输入,必须显式配置,不能依赖默认行为:
- 加载 imtcp 模块时指定
Threads="n"(n建议设为物理CPU核心数,如8):module(load="imtcp" Threads="8" MaxSessions="2000") - 为每个监听端口单独定义 input,避免复用同一 ruleset 引发串行竞争:
input(type="imtcp" port="514" threads="4" ruleset="rsyslog_in_1")<br>input(type="imtcp" port="10514" threads="4" ruleset="rsyslog_in_2")
- 确保 ruleset 内部不包含阻塞操作(如同步文件写、慢速数据库查询),全部输出走异步队列
分离输入、解析与输出路径
避免所有日志共用一条处理流水线。按来源或设施拆分 ruleset,让不同线程池各司其职:
- 为网络设备(如交换机、防火墙)单独建 ruleset:
ruleset(name="netdev" queue.type="linkedlist" queue.size="50000" queue.workerthreads="4") - 在对应 input 中绑定:
input(type="imtcp" port="10514" ruleset="netdev") - 该 ruleset 下只做轻量过滤(如
if $syslogfacility-text == 'local7' then ...)和转发,不落地本地文件
关闭同步落盘与禁用低效模块
任何同步I/O都会卡住worker线程,尤其在SSD性能受限或磁盘繁忙时:
- 本地文件输出一律加 - 前缀启用异步写:
auth.* -/var/log/auth.log - 禁用 imklog(内核日志)和 imjournal(journald桥接)——它们与远程接收无关,却占用额外线程和内存
- 移除所有
$ActionFileEnableSync on或$ActionFileForceSync on类配置
操作系统级协同调优
仅改rsyslog配置不够,需配合内核参数释放CPU和网络栈压力:
- 提升TCP连接队列:
net.core.somaxconn = 65535<br>net.ipv4.tcp_max_syn_backlog = 65535
- 增大套接字缓冲区(防UDP/TCP丢包):
net.core.rmem_max = 16777216<br>net.core.wmem_max = 16777216
- 为 rsyslog 进程分配足够文件描述符:
在/etc/systemd/system/rsyslog.service.d/override.conf中添加:[Service]<br>LimitNOFILE=65536











