今天产品经理告诉我项目打不开了,让我解决一下问题。经过短暂的排除,发现 docker
运行四个月,容器日志把 50G
磁盘占用完了,导致项目网站部分服务不可用。重启 docker
,重新部署后,偶然发现服务器的内存使用率也达到 85%
,我记得之前 docker
优化后才占用 30%
,所以这个问题也需要排除一下。
查看服务器状态
使用top
命令查看服务器各个程序占用CPU、内存情况。
查看消耗内存最多的前40个进程
ps auxw|head -1;ps auxw|sort -rn -k4|head -40
通过结果看到rsyslogd
日志管理服务占用了10%左右的内存。
修改rsyslogd服务配置文件
vim /usr/lib/systemd/system/rsyslog.service
在Service
配置中添加 MemoryAccounting=yes
、MemoryMax=80M
、MemoryHigh=8M
三项如下所示。
[Unit]
Description=System Logging Service
;Requires=syslog.socket
Wants=network.target network-online.target
After=network.target network-online.target
Documentation=man:rsyslogd(8)
Documentation=http://www.rsyslog.com/doc/
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
Restart=on-failure
UMask=0066
StandardOutput=null
Restart=on-failure
MemoryAccounting=yes
MemoryMax=80M
MemoryHigh=8M
[Install]
WantedBy=multi-user.target
;Alias=syslog.service
通常情况下rsyslogd
大小只有5M,所以将内存上限设置为8M,然后将绝对内存限制为80M。
重启服务后
systemctl daemon-reload
systemctl restart rsyslog
至此问题算是解决,还是需要后期继续跟进排查。
日志不是定时自动删的么, 什么日志能占这么多空间。
服务太多了,docker都直接把硬盘跑满了,日志也占了大量的进程。