解决rsyslogd服务占用内存高

  • A+
所属分类:系统文档

一、概述

使用top命令查看内存占用时,发现rsyslogd内存占用很高。

二、排查

1、journalctl -u rsyslog查看状态

2、tail /var/log/messages查看messages日志

3、执行journalctl --verify命令检查发现系统日志卷文件损坏错误

三、解决办法

1、删除上面损坏的journal文件
2、删除 /var/lib/rsyslog/imjournal.state文件
3、修改rsyslogd服务配置文件后重启rsyslog

vim /usr/lib/systemd/system/rsyslog.service

在Service配置中添加MemoryAccounting=yesMemoryMax=80MMemoryHigh=8M 三项来限制服务内存使用率,如下所示:

  1. Description=System Logging Service

  2. Wants=network.target network-online.target

  3. After=network.target network-online.target

  4. Documentation=man:rsyslogd(8)

  5. Documentation=http://www.rsyslog.com/doc/

  6. EnvironmentFile=-/etc/sysconfig/rsyslog

  7. ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS

  8. WantedBy=multi-user.target

通常情况下rsyslogd大小只有5M,所以将内存上限设置为8M,然后将绝对内存限制为80M。
重启服务

  1. systemctl restart rsyslog

四、根本原因

systemd的一个bug,在journal需要压缩的时候就会发生这个问题,后果实在是很严重,还好已经修复了。有两种避免方法,我这边在两台经常发生这个问题的服务器上都实验了,跑了2天多都没有再发生,应该是确认可以解决的。

五、避免方法

1、关掉journal压缩配置

vi /etc/systemd/journald.conf,把#Compress=yes改成Compress=no,之后systemctl restart systemd-journald即可

2、升级systemd版本

我升级到systemd-219-42.el7_4.4.x86_64,之后systemctl restart systemd-journald,也应该可以解决

查看rsyslog输出的日志/var/log/

路径 描述
/var/log/messages 服务信息日志(记录linux操作系统常见的服务信息和错误信息)
/var/log/secure 系统的登陆日志(记录用户和工作组的变化情况,是系统安全日志,用户的认证登陆情况
/var/log/maillog 邮件日志
/var/log/cron 定时任务
/var/log/boot.log 系统启动日志

发现/var/log/messages有几个G的日志。查看日志内容发现rsyslog把Journal的log都进行输出和汇总。当容器越多时,log也就会也多,内存占用也就越多。同时也可能导致systemd-journald进程内存占用过高,我们可以消减输出的日志,将log级别定义为err级别。

修改配置/etc/rsyslog.conf,增加如下三行

$imjournalRatelimitInterval 0
$imjournalRatelimitBurst 0
*.err;mail.none;authpriv.none;cron.none /var/log/messages

重启服务

  1. systemctl restart rsyslog

修改Journal的配置/etc/systemd/journald.conf
Storage改为persistent,如下

  1. # This file is part of systemd.

  2. # systemd is free software; you can redistribute it and/or modify it

  3. # under the terms of the GNU Lesser General Public License as published by

  4. # the Free Software Foundation; either version 2.1 of the License, or

  5. # (at your option) any later version.

  6. # Entries in this file show the compile time defaults.

  7. # You can change settings by editing this file.

  8. # Defaults can be restored by simply deleting this file.

  9. # See journald.conf(5) for details.

重启服务

systemctl restart systemd-journald

Storage选项

通过查看man手册,#man 5 journald.conf 你会发现,Storage= 的值可以是volatile,persistent,autoandnone;但是,默认的是auto

  • volatile代表日志只存在内存中,即/run/log/journal/
  • persistent代表日志只存在磁盘中,即/var/log/journal/
  • auto代表日志存在磁盘中,或者内存中,取决于你是否创建/var/log/journal/目录,部分系统是需要手动mkdir -p /var/log/journal/systemctl restart systemd-journald来解放内存。
  • none,表示,日志不保留,全部drop,当你决定不使用systemd-journald的时候,你可以使用。


参考链接

https://xbuba.com/questions/56986536
http://blog.zhouzg.com.cn/archives/712
http://aspirer.wang/?p=881
https://github.com/systemd/systemd/pull/1662
https://github.com/systemd/systemd/pull/1663
https://github.com/coreos/bugs/issues/322

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin