首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2G内存的服务器被系统日志吃到爆,差点破产!

2G内存的服务器被系统日志吃到爆,差点破产!

原创
作者头像
一只牛博
发布2025-09-14 10:46:05
发布2025-09-14 10:46:05
1160
举报

穷人服务器的悲惨遭遇

用的是腾讯云最便宜的那种小服务器:2C2G,1M带宽。没办法,穷人就得精打细算,能省则省。

平时跑几个小项目还挺好的,结果前几天突然发现服务器卡得要死,SSH连上去都费劲。

发现日志文件异常庞大

登录服务器检查资源使用情况:

image-20241018164327471
image-20241018164327471

从图片可以看到,虽然内存使用率才13.6%(对于2G内存来说还算正常),但是仔细看日志文件的大小,我就发现问题了:

某些日志文件异常庞大!而且systemd-journald这个进程虽然内存占用看起来不算特别高,但在这个2G内存的小服务器上,每一MB都很宝贵。

深入排查问题

top命令看了看进程情况,发现systemd-journald这个进程虽然占用的内存不算特别夸张,但在2G内存的服务器上,它占用的这部分内存比例还是挺显眼的。

更关键的是,我发现服务器卡顿主要是因为磁盘IO很高。检查了一下磁盘使用情况,发现日志文件占用了大量空间。

之前从来没仔细关注过systemd-journald这个进程,它是干什么的?为什么会让服务器这么卡?

深入了解systemd-journald

搜了一下才知道,systemd-journald是Linux系统的日志服务,负责收集和管理系统日志。简单来说,系统里所有的日志都会经过它的手。

问题是,它为了性能会把很多日志缓存在内存里。如果日志量太大,或者配置不当,就会占用大量内存。

检查日志文件大小

我去/var/log目录看了看:

代码语言:bash
复制
du -sh /var/log/*

好家伙,/var/log/journal目录占了好几个G!还有一些日志文件单个就有几百MB。

这下明白了:大量的系统日志把内存撑爆了

分析日志为什么这么大

我想起来最近确实有些异常:

  1. 某个服务一直在报错,错误日志刷得很快
  2. Docker容器日志没有限制,一直在输出调试信息
  3. 系统运行了几个月,从来没清理过日志

这三个因素加起来,日志量当然爆炸式增长。

看看具体是什么日志

代码语言:bash
复制
# 查看最近的系统日志
journalctl --since "1 hour ago" | head -50

# 查看日志占用空间
journalctl --disk-usage

发现确实有几个服务在疯狂输出日志,特别是某个定时任务,每分钟都在报同样的错误。

解决方案

立即止血:清理日志

先得清理掉这些历史日志,释放内存和磁盘空间:

代码语言:bash
复制
# 清理7天前的日志
sudo journalctl --vacuum-time=7d

# 限制日志总大小为500MB
sudo journalctl --vacuum-size=500M

执行完这两个命令,立马感觉服务器轻松了不少。

治本:修改journald配置

临时清理只能救急,要彻底解决问题还得改配置:

代码语言:bash
复制
sudo vim /etc/systemd/journald.conf

加入这些配置:

代码语言:conf
复制
[Journal]
SystemMaxUse=200M      # 日志最大占用200MB磁盘空间
SystemMaxFileSize=50M  # 单个日志文件最大50MB
MaxRetentionSec=1month # 日志只保留1个月
RuntimeMaxUse=100M     # 内存中最多缓存100MB日志

配置完重启journald服务:

代码语言:bash
复制
sudo systemctl restart systemd-journald
image-20241018165832855
image-20241018165832855

配置生效后,内存占用明显下降了。

解决日志源头问题

除了限制日志大小,还得解决日志产生过多的根本问题:

1. 修复报错的服务

找到那个一直报错的定时任务,修复了bug,日志量立马减少了90%。

2. 调整应用日志级别

把一些应用的日志级别从DEBUG改成INFO,减少不必要的日志输出。

3. 配置Docker日志限制

给Docker容器也加上了日志限制,避免容器日志无限增长。

为什么小服务器特别容易中招

内存本来就少

2G内存的服务器,系统本身就要占用一部分,应用再占用一部分,剩余内存本来就不多。如果systemd-journald再占用几百MB,很容易就把内存撑爆。

没有监控和告警

穷人服务器往往没有完善的监控,问题出现了也不知道。等发现的时候,往往已经很严重了。

配置都用默认值

为了省事,各种服务都用默认配置。默认配置往往比较保守,或者说比较"奢侈",不适合资源紧张的小服务器。

穷人服务器优化经验

经过这次教训,我总结了几个穷人服务器的优化经验:

1. 日志配置要精细

每个会产生日志的服务都要配置日志限制:

  • systemd-journald:限制系统日志
  • Docker:限制容器日志
  • 应用程序:调整日志级别和轮转策略

2. 定期清理要自动化

写了个简单的清理脚本,每天自动执行:

代码语言:bash
复制
#!/bin/bash
# 每天清理一次各种日志
journalctl --vacuum-size=300M
docker system prune -f
find /var/log -name "*.log" -mtime +7 -delete

3. 监控要简单但有效

穷人服务器用不起专业的监控,但是可以写个简单的脚本定期检查:

代码语言:bash
复制
#!/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

4. 系统参数要调优

2G内存的服务器,一些默认参数确实要调整:

代码语言:bash
复制
# 调整swappiness,减少使用swap
echo 'vm.swappiness=10' >> /etc/sysctl.conf

# 调整内存回收策略
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf

血泪总结

这次被systemd-journald坑惨了,让我深刻认识到:穷人服务器更需要精细化管理

资源本来就少,经不起浪费。每一MB内存、每一GB磁盘都要精打细算。

现在我的小服务器运维清单上,日志配置优化是必做项目。谁让咱们穷呢,只能用技术来弥补硬件的不足😂

给同样用小服务器的朋友几个建议:

  1. 所有日志服务都要配置限制,别用默认的无限增长
  2. 定期清理要自动化,手动清理容易忘记
  3. 监控要有,哪怕是个简单的shell脚本
  4. 系统参数要调优,默认配置往往不适合小内存服务器

最后忠告:如果你也在用小内存服务器,赶紧检查一下systemd-journald的内存占用,别等服务器卡死了再优化!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 穷人服务器的悲惨遭遇
  • 发现日志文件异常庞大
  • 深入排查问题
    • 深入了解systemd-journald
    • 检查日志文件大小
  • 分析日志为什么这么大
    • 看看具体是什么日志
  • 解决方案
    • 立即止血:清理日志
    • 治本:修改journald配置
    • 解决日志源头问题
  • 为什么小服务器特别容易中招
    • 内存本来就少
    • 没有监控和告警
    • 配置都用默认值
  • 穷人服务器优化经验
    • 1. 日志配置要精细
    • 2. 定期清理要自动化
    • 3. 监控要简单但有效
    • 4. 系统参数要调优
  • 血泪总结
    • 给同样用小服务器的朋友几个建议:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档