用的是腾讯云最便宜的那种小服务器:2C2G,1M带宽。没办法,穷人就得精打细算,能省则省。
平时跑几个小项目还挺好的,结果前几天突然发现服务器卡得要死,SSH连上去都费劲。
登录服务器检查资源使用情况:
从图片可以看到,虽然内存使用率才13.6%(对于2G内存来说还算正常),但是仔细看日志文件的大小,我就发现问题了:
某些日志文件异常庞大!而且systemd-journald这个进程虽然内存占用看起来不算特别高,但在这个2G内存的小服务器上,每一MB都很宝贵。
用top
命令看了看进程情况,发现systemd-journald这个进程虽然占用的内存不算特别夸张,但在2G内存的服务器上,它占用的这部分内存比例还是挺显眼的。
更关键的是,我发现服务器卡顿主要是因为磁盘IO很高。检查了一下磁盘使用情况,发现日志文件占用了大量空间。
之前从来没仔细关注过systemd-journald这个进程,它是干什么的?为什么会让服务器这么卡?
搜了一下才知道,systemd-journald
是Linux系统的日志服务,负责收集和管理系统日志。简单来说,系统里所有的日志都会经过它的手。
问题是,它为了性能会把很多日志缓存在内存里。如果日志量太大,或者配置不当,就会占用大量内存。
我去/var/log
目录看了看:
du -sh /var/log/*
好家伙,/var/log/journal
目录占了好几个G!还有一些日志文件单个就有几百MB。
这下明白了:大量的系统日志把内存撑爆了。
我想起来最近确实有些异常:
这三个因素加起来,日志量当然爆炸式增长。
# 查看最近的系统日志
journalctl --since "1 hour ago" | head -50
# 查看日志占用空间
journalctl --disk-usage
发现确实有几个服务在疯狂输出日志,特别是某个定时任务,每分钟都在报同样的错误。
先得清理掉这些历史日志,释放内存和磁盘空间:
# 清理7天前的日志
sudo journalctl --vacuum-time=7d
# 限制日志总大小为500MB
sudo journalctl --vacuum-size=500M
执行完这两个命令,立马感觉服务器轻松了不少。
临时清理只能救急,要彻底解决问题还得改配置:
sudo vim /etc/systemd/journald.conf
加入这些配置:
[Journal]
SystemMaxUse=200M # 日志最大占用200MB磁盘空间
SystemMaxFileSize=50M # 单个日志文件最大50MB
MaxRetentionSec=1month # 日志只保留1个月
RuntimeMaxUse=100M # 内存中最多缓存100MB日志
配置完重启journald服务:
sudo systemctl restart systemd-journald
配置生效后,内存占用明显下降了。
除了限制日志大小,还得解决日志产生过多的根本问题:
1. 修复报错的服务
找到那个一直报错的定时任务,修复了bug,日志量立马减少了90%。
2. 调整应用日志级别
把一些应用的日志级别从DEBUG改成INFO,减少不必要的日志输出。
3. 配置Docker日志限制
给Docker容器也加上了日志限制,避免容器日志无限增长。
2G内存的服务器,系统本身就要占用一部分,应用再占用一部分,剩余内存本来就不多。如果systemd-journald再占用几百MB,很容易就把内存撑爆。
穷人服务器往往没有完善的监控,问题出现了也不知道。等发现的时候,往往已经很严重了。
为了省事,各种服务都用默认配置。默认配置往往比较保守,或者说比较"奢侈",不适合资源紧张的小服务器。
经过这次教训,我总结了几个穷人服务器的优化经验:
每个会产生日志的服务都要配置日志限制:
写了个简单的清理脚本,每天自动执行:
#!/bin/bash
# 每天清理一次各种日志
journalctl --vacuum-size=300M
docker system prune -f
find /var/log -name "*.log" -mtime +7 -delete
穷人服务器用不起专业的监控,但是可以写个简单的脚本定期检查:
#!/bin/bash
# 检查内存和磁盘使用率
mem_usage=$(free | grep Mem | awk '{printf("%.1f", $3/$2 * 100.0)}')
disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if (( $(echo "$mem_usage > 80" | bc -l) )); then
echo "内存使用率过高: ${mem_usage}%"
fi
if [ $disk_usage -gt 80 ]; then
echo "磁盘使用率过高: ${disk_usage}%"
fi
2G内存的服务器,一些默认参数确实要调整:
# 调整swappiness,减少使用swap
echo 'vm.swappiness=10' >> /etc/sysctl.conf
# 调整内存回收策略
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
这次被systemd-journald坑惨了,让我深刻认识到:穷人服务器更需要精细化管理。
资源本来就少,经不起浪费。每一MB内存、每一GB磁盘都要精打细算。
现在我的小服务器运维清单上,日志配置优化是必做项目。谁让咱们穷呢,只能用技术来弥补硬件的不足😂
最后忠告:如果你也在用小内存服务器,赶紧检查一下systemd-journald的内存占用,别等服务器卡死了再优化!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。