温馨提示×

为何linux syslog慢

小樊
41
2026-10-19 09:20:37
栏目: 智能运维

Linux 的 syslog 变慢通常由以下几个常见原因造成,按“发生频率”从高到低说明:


1. 磁盘 I/O 瓶颈(最常见)

syslog 默认会把日志写入磁盘(如 /var/log/messages、/var/log/syslog)。

常见情况:

  • 日志量突然增大(错误风暴、循环打印)
  • 磁盘慢(HDD、云盘限速)
  • 日志文件未轮转,文件过大
  • 多个服务同时写日志

表现:

  • top 中 wa 高
  • iostat 看到磁盘 util 接近 100%
  • syslog 进程状态为 D(不可中断睡眠)

解决:

# 查看 IO
iostat -x 1
iotop

# 日志轮转检查
logrotate -d /etc/logrotate.conf

2. rsyslog / syslog-ng 配置问题

不合理的配置会导致每条日志都做大量处理。

典型问题:

  • 使用了复杂正则(omfile + mmnormalize)
  • 开启了远程发送(UDP/TCP)但网络慢
  • 同步写磁盘($ActionFileEnableSync on)
  • 日志模板过重

解决:

  • 关闭不必要的同步写
  • 减少正则匹配
  • 远程日志用队列(见下)

3. 日志队列阻塞(rsyslog 特有)

rsyslog 默认是队列模型,如果下游慢,会阻塞上游。

典型场景:

  • 远程 syslog 服务器不可达
  • 磁盘写入慢
  • 没有配置异步队列

解决(推荐):

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

4. 系统时间跳变(NTP / 虚拟机)

时间回拨或跳跃会导致:

  • 日志排序异常
  • rsyslog 内部重试
  • 某些应用疯狂打日志

解决:

timedatectl status
chronyc tracking

5. 日志量爆炸(应用 bug)

常见于:

  • 死循环打印
  • 捕获异常后继续抛
  • 健康检查频繁失败

排查:

journalctl -u <service> --since "10 min ago" | wc -l

6. journald 与 syslog 冲突

systemd 环境下:

  • journald 先收日志
  • rsyslog 再从 socket 读

如果 journal 压力过大,也会拖慢 syslog。

可优化:

/etc/systemd/journald.conf
Storage=volatile
RateLimitInterval=5s
RateLimitBurst=1000

7. 文件描述符 / 进程数限制

高并发日志时:

  • fd 耗尽
  • 线程阻塞
ulimit -n
cat /proc/sys/fs/file-max

快速定位 Checklist

top        # 看 wa / syslog 状态
iostat -x 1
journalctl -f
ls -lh /var/log
systemctl status rsyslog

如果你能补充:

  • 用的 rsyslog 还是 syslog-ng
  • 是否 远程日志
  • 慢的具体表现(写盘慢?登录慢?)

我可以给你更精准的优化方案。

0 踩