systemd-journald 服务内存占用过高解决方法

使用 htop 命令查看 debian 机器的系统状况时发现 /lib/systemd/systemd-journald 占用了过高的内存。发现问题时同时也查看了其他机器,也存在这样的问题。

htop

查了资料发现 systemd 提供了自己的日志系统(logging system),称为 journal。使用 systemd 日志,无需额外安装日志服务(syslog)。
读取日志的命令:

1
journalctl

systemd-journal 的配置在 /etc/systemd/journald.conf
默认情况下(Storage=auto),日志记录将被写入 /var/log/journal/。该目录是 systemd 软件包的一部分。若被删除,systemd 不会自动创建它,直到下次升级软件包时重建该目录。如果该目录缺失,systemd 会将日志记录写入 /run/systemd/journal。这意味着,系统重启后日志将丢失。

Storage的配置有多种选项

  • 如果设置为 volatile,journal 将会保存在内存中,使用位于内存盘的 /run/log/journal 目录(会自动创建)
  • 如果设置为 persistent,journal 将会保存在磁盘中,使用 /var/log/journal 目录 (会自动创建),如果自动创建失败,以及针对启动早期磁盘尚未挂载成功的部分日志, 仍然记录在内存盘。
  • 如果设置为 auto,那么,如果 /var/log/journal 目录存在,则使用该目录记录到磁盘,如果目录不存在(不会自动创建),则使用内存盘。
  • 如果设置为 none,完全不记录任何日志(但是仍然可以转发给 rsyslog)

其他配置具体可以参考 man 5 journald.conf

解决方法

  • 方法一:创建 /var/log/journal 目录,然后使用 journalctl --flush 将内存中的数据写入硬盘。
  • 方法二:修改 /etc/systemd/journald.conf,配置 Storage=persistent,然后重启 systemd-journald 并使用 journalctl --flush 将内存中的数据写入硬盘。
  • 方法三:修改 /etc/systemd/journald.conf,配置 Storage=none,然后重启 systemd-journald