温馨提示×

linux syslog为何延迟

小樊
39
2026-10-13 13:58:00
栏目: 智能运维

Linux 中 syslog 出现延迟 是很常见的问题,原因通常不在“网络慢”,而在 日志处理链路中的缓冲、阻塞或配置。下面按最常见到最容易被忽视的顺序说明。


一、最常见原因

1. rsyslog / syslog-ng 使用了缓冲(Buffering)

默认情况下,rsyslog 为了提高性能会批量写日志,而不是来一条写一条。

典型表现:

  • 高峰时延迟几秒到几十秒
  • 低峰时又“突然一起刷出来”

常见相关配置(rsyslog):

$ActionQueueType LinkedList
$ActionQueueFileName fwdRule1
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on

✅ 解决思路:

  • 如果要求实时性,可减小队列或关闭缓冲
  • 如果要求可靠性,保留缓冲但监控队列长度

2. 磁盘 I/O 瓶颈(非常常见)

syslog 最终要写文件:

/var/log/messages
/var/log/syslog

如果:

  • 磁盘慢(HDD / 云盘限速)
  • 日志量巨大
  • 同时有其他写盘程序

就会导致:

日志先堆在内存里,再慢慢落盘

✅ 排查:

iostat -x 1
dstat

3. 日志量突增(应用疯狂打日志)

例如:

  • Java 异常循环
  • 容器频繁重启
  • cron 报错刷屏

syslog 是单进程串行处理的,一旦堵住就会全局延迟。


二、网络 syslog(远端的)特别容易延迟

4. UDP syslog 本身不可靠

如果配置的是:

*.* @logserver:514

(单个 @ = UDP)

问题:

  • UDP 不确认、不重传
  • 队列满了直接丢或延迟

✅ 建议:

  • 用 TCP(@@logserver:514)
  • 或 relay + 本地缓冲

5. 远端 log server 处理慢

即使你本地很快,对端慢也会反压:

  • 远端磁盘慢
  • 远端规则复杂(grok / filter)
  • Elasticsearch / Loki 写入慢

三、系统级原因(容易被忽略)

6. systemd-journald → rsyslog 转发延迟

现代系统:

app → journald → rsyslog

journald 有自身速率限制:

# /etc/systemd/journald.conf
RateLimitInterval=30s
RateLimitBurst=1000

✅ 可临时调大或关闭测试


7. 时间不同步导致“看起来延迟”

NTP 没同步时:

  • 日志时间是错的
  • 看起来像“延迟了几分钟”

✅ 检查:

timedatectl

8. 系统负载高 / OOM / 调度延迟

  • CPU 抢占严重
  • 容器 cgroup 限制
  • 虚拟机超卖

syslog 进程本身被“饿死”


四、快速自查清单(实用)

# 看 syslog 进程
ps aux | grep rsyslog

# 看队列是否堆积
ls -l /var/spool/rsyslog/

# 看磁盘
iostat -x 1

# 看时间同步
timedatectl

# 看 journal 是否限速
systemctl status systemd-journald

五、如果你愿意,我可以更精确帮你

你可以补充:

  1. 用的是 rsyslog / syslog-ng / journald 哪个?
  2. 是本地日志慢还是发到远端慢?
  3. 延迟是 秒级 / 分钟级?
  4. 系统:CentOS / Ubuntu / 容器 / K8s?

我可以直接帮你给一套针对性配置。

0 踩