我有一个 AWS EC2 实例,运行带有服务器应用程序的 CentOS 7.7.1908 (systemd 219)。服务器将大量信息记录到系统日志中(使用 syslog)。
我最近使用以下方法启用了系统日志的持久存储这个答案。 自那以后,systemd-journald 的内存消耗不断增长。
经过一整天的时间,systemd-journald
最终使用了超过 250M 的 RAM。
我做了一个快速测试来确认 journald RAM 使用量确实在增长。
测试 :
- 获取
systemd-journald
内存使用情况 - 使用以下方式将一组数据记录到系统日志中
logger
- 获取
systemd-journald
内存使用情况 - 使用以下方法将内存日志(如果有)刷新到 /var/log/journal
journalctl --flush
- 重启
systemd-journald
服务 - 获取
systemd-journald
内存使用情况
结果 :
# ps aux | grep journald | grep -v grep
root 23963 0.0 0.1 61320 2500 ? Ss 15:03 0:00 /usr/lib/systemd/systemd-journald
# for i in {0..7000}; do logger -t TEST -p err `python -c 'print "A"*1000'`; done;
# ps aux | grep journald | grep -v grep
root 23963 0.1 0.2 69512 11964 ? Ss 15:08 0:00 /usr/lib/systemd/systemd-journald
# journalctl --flush
# ps aux | grep journald | grep -v grep
root 23963 0.1 0.2 69512 11964 ? Ss 15:08 0:00 /usr/lib/systemd/systemd-journald
# systemctl restart systemd-journald
# ps aux | grep journald | grep -v grep
root 24237 0.0 0.1 55416 2492 ? Ss 15:08 0:00 /usr/lib/systemd/systemd-journald
记录大约 7M 的数据后,内存使用量从 2.5M 增加到将近 12M。重新启动守护进程后,内存使用量将恢复到约 2.5M。
我的解释:
systemd-journald
内存使用量与其处理的数据量成正比。- 该参数
RuntimeMaxUse
不限制此内存使用量。 - 重新启动
systemd-journald
会清除缓冲区,我无法配置其大小。 - 对于可使用的内存量没有可配置的限制
systemd-journald
。 - 内存使用不是由于等待刷新到磁盘的日志造成的。
我的journald.conf:
[Journal]
#Storage=auto # /var/log/journal is created and used, so this is equivalent to 'Persistent'
SyncIntervalSec=1m
RateLimitInterval=0
RateLimitBurst=0
SystemMaxUse=4G
RuntimeMaxUse=1M
我怎样才能解决这个“泄漏”,而不需要每天重启服务?