日志频繁写入是磁盘i/o瓶颈的常见原因,需按四步排查:先通过top和iostat确认iowait>30%及%util接近100%;再用iotop -o -p定位高写入进程;接着用lsof -p pid筛选w模式reg文件锁定日志路径;最后通过find、logrotate -d和调低日志级别验证并缓解。

日志频繁写入是导致磁盘 I/O 冲突的常见原因,尤其在高并发服务或调试模式下容易触发。排查关键在于快速锁定写日志的进程、定位目标文件、判断写入频率与量级,并验证是否为根本瓶颈。
第一步:确认是否为 I/O 瓶颈而非其他资源问题
先看 CPU 的 iowait 是否异常升高:
- 运行
top或htop,观察顶部显示的wa值——若持续超过 30%,说明系统正大量等待 I/O 完成 - 配合
iostat -x 2查看磁盘指标:
重点关注%util(接近 100% 表示设备饱和)和await(显著高于 10ms 说明延迟严重) - 若
%util高但r/s和w/s并不高,可能是小包高频写入;若wkB/s很大(如 >20MB/s),更倾向大块日志刷盘
第二步:用 iotop 找出写日志最猛的进程
以 root 权限运行,聚焦真实写入行为:
-
sudo iotop -o -P -d 2:
--o只显示正在 IO 的进程,避免干扰
--P按进程(非线程)聚合显示
--d 2每 2 秒刷新,便于观察趋势 - 重点看 DISK WRITE 列(如
42.65 M/s)和 IO> 列(如98.7%)
常见嫌疑进程:rsyslogd、journalctl(systemd-journald)、nginx、java 应用、自定义 Python/Node 日志脚本 - 记下 PID 和 COMMAND,例如看到
python3 /app/logger.py持续写入 35MB/s,就基本锁定源头
第三步:确认它在写哪个日志文件
对可疑 PID 使用 lsof 查看打开的写入型文件:
-
sudo lsof -p PID | awk '$5 ~ /^REG/ && $4 ~ /w/ {print $9}' | sort | uniq -c | sort -nr
这条命令筛选出该进程以写方式(w)打开的普通文件(REG),并统计路径出现频次 - 典型输出:
12 /var/log/app/error.log8 /tmp/debug_trace.log
说明它正高频追加写入这些路径 - 若发现大量
/dev/log或/run/systemd/journal/socket,说明走的是 syslog 或 journald 转发路径,需进一步查 rsyslog 配置或 journal 设置
第四步:辅助验证与临时缓解
不急于改代码,先做轻量验证和可控干预:
- 用
find /var/log -type f -name "*.log" -size +50M -ls | sort -k7 -r扫描大日志文件,确认是否已有单个文件膨胀到百 MB 级别 - 检查对应服务的日志轮转配置(如 logrotate)是否失效:
运行logrotate -d /etc/logrotate.d/rsyslog(加-d调试模式看是否匹配、是否执行) - 临时降低日志级别验证效果:
比如对 Java 进程,修改logback.xml中<root level="WARN"></root>;对 Python,调整logging.basicConfig(level=logging.WARNING) - 若确认是某应用自身日志失控,可先用
kill -USR1 PID(部分支持重载日志)或重启服务,观察iostat是否立即回落











