排查syslog性能问题需分段验证:先确认积压状态(rsyslogd -n1、systemctl status、队列文件、dmesg),再按采集、磁盘、网络三环节定位延迟,最后针对性调参并闭环验证。

排查 Syslog 服务性能问题,核心是定位日志“卡在哪”——是产生快但写不进磁盘,还是网络发不出去,或是队列越堆越多。关键不在于盲目调参,而在于分段验证、逐层下钻。
确认日志是否真在积压
先看实际状态,避免误判:
- 用
rsyslogd -N1检查配置语法是否正确,避免因配置错误导致服务降级运行 - 执行
systemctl status rsyslog,关注 Active 状态和 Recent logs 中是否有 “queue full”、“dropped”、“rate limit hit” 等提示 - 查看队列文件:默认路径如
/var/lib/rsyslog/下是否存在大量srvrfwd*.qf或queue_*.qf文件,且大小持续增长,说明日志正在排队等待处理 - 检查内核日志缓冲区:
dmesg | grep -i "buffer.*full\|log.*overflow",确认是否因 imklog 或 imuxsock 模块缓冲溢出丢日志
定位延迟发生在哪一环
按数据流向分三段排查:
-
本地采集端:用
journalctl -u rsyslog -n 50 --no-pager查最近日志,留意 timestamp(日志生成时间)与 _HOSTNAME/_PID 字段时间差。若差值 >1s,说明 rsyslogd 本身处理慢;再结合top -p $(pgrep rsyslogd)看 CPU / %MEM 占用是否异常高 -
磁盘写入环节:运行
iostat -x 1,观察%util是否长期 >90%、await是否 >50ms。若高,说明磁盘 I/O 成瓶颈;再检查日志目录所在分区的df -h和inotifywait -m /var/log(确认是否有轮转锁或文件句柄未释放) -
外发传输链路:对远程目标,用
tcpdump -i any port 514 -c 20抓包,对比本地日志时间戳与抓到的包时间戳;再用ss -tuln | grep :514确认监听状态,并用nc -zv remote_ip 514测试连通性与响应延迟
针对性调整关键参数
不要全局调大缓冲区,而是按场景精准干预:
- 若本地写盘慢:在
/etc/rsyslog.conf中启用异步队列 + 磁盘后备$ActionQueueType LinkedList<br> $ActionQueueFileName srvrfwd<br> $ActionResumeRetryCount -1<br> $ActionQueueSaveOnShutdown on<br> $ActionQueueMaxDiskSpace 1g
并确保/var/lib/rsyslog/所在分区有足够空间 - 若网络外发卡顿:改用 TCP 并启用保活
*.* @@logserver:514;RSYSLOG_ForwardFormat<br> $ActionSendTCPRebindInterval 600<br> $ActionSendTCPOption 1
避免 UDP 丢包或 TCP 连接空闲超时断开 - 若日志量突增:临时启用速率限制防雪崩
$SystemLogRateLimitInterval 60<br> $SystemLogRateLimitBurst 200
限制每分钟最多接收 200 条,超出则丢弃,保护主进程
验证优化是否生效
改完配置后,必须做闭环验证:
- 重启服务:
sudo systemctl restart rsyslog,再立即执行sudo journalctl -u rsyslog --since "1 minute ago" | grep -E "(queue|drop|error)"确认无新报错 - 模拟压力测试:用
logger -p local0.info "$(date): test message $(seq 1 100)"快速注入百条日志,随后tail -n 20 /var/log/syslog | head -5查看最老一条是否在 2 秒内落盘 - 持续观测:部署简单脚本每 5 分钟记录一次
ls -lt /var/log/syslog | head -1的时间戳,连续跑 1 小时,看时间差是否稳定 ≤1s











