Linux systemd-journald 日志空间问题排查与配置笔记

一、环境信息

  • 系统: Linux pbsbc01h3 5.4.65-sunxi #2.2.2 SMP Fri Mar 15 19:06:30 CST 2024 armv7l GNU/Linux
  • 日志存储: /var/log 挂载在 zram 压缩内存盘上,总容量 128MB
  • 初始问题: 不到一天 /var/log 使用率达到 100%
# 查看磁盘使用情况
df -h /var/log
# 输出: /dev/zram0      124M  122M     0 100% /var/log

# 查看日志占用
journalctl --disk-usage
# 输出: Archived and active journals take up 176.9M in the file system.

二、问题诊断

1. 存储结构

zramctl
# NAME       ALGORITHM DISKSIZE   DATA COMPR TOTAL STREAMS MOUNTPOINT
# /dev/zram1 lzo-rle     499.8M     4K   73B    4K       4 [SWAP]
# /dev/zram0 zstd          128M 121.5M  8.8M  9.5M       4 /var/log

2. 日志占用详情

du -sh /var/log/* 2>/dev/null | sort -h
占用目录/文件说明
121M/var/log/journalsystemd 日志 ← 主要占用
276K/var/log/wtmp登录记录
100K/var/log/lightdm显示管理器日志
28K/var/log/auth.log认证日志
28K/var/log/daemon.log守护进程日志
12K/var/log/user.log用户日志
8K/var/log/syslog系统日志
其他各种小文件合计不足 1M

结论: /var/log/journal 占用 121M / 128M,是问题根源。

三、原始配置及问题分析

原始配置

Compress=yes
SystemMaxUse=50M
SystemKeepFree=100M      # ← 问题根源
SystemMaxFileSize=10M
SystemMaxFiles=4
RuntimeMaxUse=50M
RuntimeKeepFree=50M      # ← 潜在问题
RuntimeMaxFileSize=10M
MaxRetentionSec=4day

配置冲突说明

配置项设定值问题
SystemMaxUse50M要求日志最多占 50M
SystemKeepFree100M要求磁盘至少空闲 100M
/var/log 总容量128M128M - 100M = 28M 可用给日志

实际效果: journald 优先满足 SystemKeepFree,导致日志实际上限被压缩到 28M,与 SystemMaxUse=50M 产生直接冲突。

四、解决方案

方案一:优化配置(推荐)

修改 /etc/systemd/journald.conf

[Journal]
Compress=yes
SystemMaxUse=120M                    # 充分利用 128M 空间
# SystemKeepFree=100M               # 注释掉或删除
SystemMaxFileSize=30M               # 单文件 30M,减少文件数量
SystemMaxFiles=4
RuntimeMaxUse=20M                   # 运行时日志不需要太大
# RuntimeKeepFree=50M              # 注释掉
RuntimeMaxFileSize=10M
MaxRetentionSec=2day                # 从 4 天改为 2 天

保守版配置(给其他日志留空间)

[Journal]
Compress=yes
SystemMaxUse=110M
SystemKeepFree=10M          # 改成 10M 而不是 100M
SystemMaxFileSize=25M
SystemMaxFiles=4
RuntimeMaxUse=20M
RuntimeMaxFileSize=10M
MaxRetentionSec=2day

立即生效命令

# 1. 编辑配置文件
nano /etc/systemd/journald.conf

# 2. 重启 journald 服务
systemctl restart systemd-journald

# 3. 强制清理到指定大小
journalctl --vacuum-size=120M

# 4. 验证效果
df -h /var/log
journalctl --disk-usage

方案二:关闭 zram 日志存储(改用硬盘)

临时关闭(重启失效)

systemctl stop systemd-journal-flush.service systemd-journald
mount --bind /var/log.hdd /var/log
systemctl start systemd-journald

永久关闭:编辑 /etc/default/armbian-ramlog

ENABLED=false

方案三:扩容 zram(如果日志量确实很大)

编辑 /etc/default/armbian-ramlog/etc/log2ram.conf

SIZE=256M    # 从 128M 改为 256M

方案四:快速应急清理

# 立即清理日志腾出空间
journalctl --rotate --vacuum-size=50M

五、关键配置参数说明

参数作用建议值(128M 分区)
SystemMaxUse持久日志总大小上限80-120M
SystemKeepFree为其他用途保留的空闲空间注释掉或设为 10M
SystemMaxFileSize单个日志文件大小20-30M
SystemMaxFiles最多保留的文件数量4
RuntimeMaxUse运行时日志(/run)上限20M
MaxRetentionSec日志最长保留时间2-3 天

六、最佳实践总结

  1. 对于小容量分区(< 512M)

    • ❌ 避免使用 SystemKeepFreeRuntimeKeepFree
    • ✅ 仅使用 SystemMaxUse 控制日志上限
    • ✅ 合理设置 MaxRetentionSec 避免日志无限累积
  2. 配置优先级

    • journald 会优先满足 KeepFree 条件,而非 MaxUse
    • 两者冲突时,KeepFree 胜出
  3. 监控建议

    # 定期检查日志大小
    journalctl --disk-usage
    
    # 查看最占空间的日志来源
    journalctl --list-boots
    journalctl -p err -b
  4. 排查日志刷屏问题

    # 查看最近一分钟的日志数量
    journalctl --since "1 minute ago" | wc -l
    
    # 查看最活跃的日志来源
    journalctl --since "1 hour ago" | cut -d' ' -f5 | sort | uniq -c | sort -nr | head -10

标签: none

添加新评论