imptcp是rsyslog高性能TCP输入模块,通过线程池、无锁队列和CPU绑定提升吞吐量;需显式加载并配置threads=物理核数、threadBind=on、多规则集哈希分发及禁用同步写盘等调优措施。

imptcp 是 rsyslog 的高性能 TCP 输入模块,专为多核、高并发日志接收场景设计,相比传统 imtcp 模块,它通过线程池 + 无锁队列 + CPU 绑定等机制,显著降低上下文切换开销,实测在 32 核服务器上吞吐量可提升 2~4 倍。关键不在于“启用”,而在于让每个 CPU 核心专注处理独立连接流。
启用并调优 imptcp 模块
imptcp 不是默认加载模块,需显式声明并配置线程策略:
- 在
/etc/rsyslog.d/10-inputs.conf中加载模块时指定线程数与绑定策略:module(load="imptcp" threads="32" threadBind="on" workerThreads="4" maxSessions="10000")
其中threads应等于物理 CPU 核心数(可用nproc查看),workerThreads是每条主线程附带的解析协程数,建议设为 2~4;threadBind="on"启用 CPU 亲和性绑定,避免线程跨核迁移。 - 监听端口时必须使用
input(type="imptcp"),不能混用imtcp:input(type="imptcp" port="514" ruleset="from_tcp" keepAlive="on" maxConnDelay="100")keepAlive="on"减少短连接重建开销,maxConnDelay控制拒绝新连接前的排队等待毫秒数,防止突发洪峰压垮队列。
配合规则集实现负载均衡分发
单规则集会成为瓶颈,需将入站连接按哈希分散到多个并行规则集,避免全局锁竞争:
- 定义多个轻量级规则集,每个只做基础路由,不执行耗时操作:
ruleset(name="rs_tcp_0") { *.* action(type="omfile" file="/var/log/tcp/0.log") }<br> ruleset(name="rs_tcp_1") { *.* action(type="omfile" file="/var/log/tcp/1.log") }等,共 32 个。 - 使用
$fromhostip或$uuid哈希分配连接:input(type="imptcp" port="514" ruleset="rs_tcp_$(expr $fromhostip % 32)")
注意:RainerScript 中需启用global(escapeControlCharsOnReceive="off")并确保expr模块已加载(module(load="mmexpr"))。
规避常见性能陷阱
吞吐量卡顿往往来自配置误用或资源争抢,而非模块本身:
- 禁用
$ActionFileEnableSync:默认开启会导致每次写日志都fsync(),直接拖垮 I/O;应设为off,依赖系统缓存与定期刷盘。 - 关闭冗余解析:若日志已是标准 syslog 格式,添加
parser="rsyslog.parselog" parseHostname="off"避免重复解析主机名。 - 限制单连接速率:对不可信客户端,用
rateLimit.interval="60" rateLimit.burst="1000"防止单 IP 占满所有线程。 - 检查内核参数:确保
net.core.somaxconn≥ 65535,net.ipv4.tcp_tw_reuse= 1,避免端口耗尽或 TIME_WAIT 积压。
实际部署中,32 核服务器配 32 线程 + 4 工作者 + 分片规则集,配合 SSD 存储与合理内核调优,稳定承载 8~12 万 EPS(events per second)毫无压力。核心逻辑就一条:让每个 CPU 核只管自己那一摊事,不抢、不等、不刷盘。


















