ECS 运维实战:Linux 磁盘空间深度清理、Swap 虚拟内存优化与自动化巡检
前言
在使用华为云弹性云服务器(ECS)或 Flexus 应用服务器 L 实例运行业务一段时间后,开发者往往会遇到两类高频运维问题:一是随着系统日志、Docker 镜像及各类缓存的堆积,云硬盘(系统盘)空间逐渐告急;二是在运行编译任务或突发高并发服务时,小规格内存实例容易触发 Linux 内核的 OOM(Out of Memory)机制导致进程被强制终止。
本文将结合日常真实的运维场景,分享一套在华为云 Ubuntu / CentOS 环境下精准排查并释放磁盘空间、配置 Swap 虚拟内存防内存溢出以及利用 Crontab 实现自动化巡检清理的实用方案。
一、 磁盘空间占用快速排查与无损清理
当发现服务器提示 No space left on device 时,首先通过 df -h 查看整体分区占用情况,随后分步骤清理无效文件。
1. 定位大文件与高占用目录
使用以下命令快速找出根目录下占用空间排名前 10 的目录:
# 查看各挂载点使用率
df -h
# 统计根目录下各一级目录的大小并按降序排列
sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -n 10
若需要直接查找全盘大于 100MB 的单个大文件(如意外生成的 core dump 或巨型未切割日志),可执行:
sudo find / -type f -size +100M -exec ls -lh {} + 2>/dev/null | awk '{ print $9 ": " $5 }'
2. 清理 systemd 系统日志(Journal)
Linux 的 systemd-journald 服务默认会持续记录系统日志,运行数月后往往会占用数 GB 空间。我们可以通过以下命令安全回收:
# 查看当前系统日志占用的磁盘空间
journalctl --disk-usage
# 仅保留最近 7 天的日志
sudo journalctl --vacuum-time=7d
# 或者限制日志最大总体积不超过 200MB
sudo journalctl --vacuum-size=200M
为了防止日后再次膨胀,建议直接修改配置文件 /etc/systemd/journald.conf,限制持久化日志上限:
sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=200M/g' /etc/systemd/journald.conf
sudo systemctl restart systemd-journald
3. 清理软件包缓存与 Docker 悬空资源
针对 Ubuntu/Debian 系统的 APT 缓存及残留依赖:
sudo apt autoremove -y
sudo apt clean
如果服务器上部署了 Docker,未使用的历史镜像、构建缓存和已停止容器往往是占用大户,可通过一条命令安全清理所有未被当前运行容器引用的资源:
docker system prune -a -f --volumes
二、 配置 Swap 交换分区防止 OOM 崩溃
对于 1核1G 或 2核2G 的轻量级云服务器,在运行 MySQL、Java 应用或执行 npm run build 前端打包时,物理内存极易耗尽。通过划分 2GB 的云硬盘空间作为 Swap 虚拟内存,可以显著提升系统的抗峰值能力。
1. 创建并激活 2GB Swap 文件
在终端依次执行以下命令:
# 1. 创建大小为 2GB 的交换文件
sudo fallocate -l 2G /swapfile
# 2. 设置严格的权限(仅 root 可读写,防止安全警告)
sudo chmod 600 /swapfile
# 3. 格式化为 swap 文件系统
sudo mkswap /swapfile
# 4. 立即启用 Swap
sudo swapon /swapfile
# 5. 验证是否生效
free -m
2. 配置开机自动挂载与内核调优
将挂载信息写入 /etc/fstab,确保华为云 ECS 重启后依然生效:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
同时,调整内核的 swappiness 参数(默认通常为 60)。将其调低至 10 或 20,代表优先使用物理内存,仅在物理内存紧张时才动用 Swap,从而兼顾性能与稳定性:
# 临时生效
sudo sysctl vm.swappiness=15
# 永久写入配置文件
echo 'vm.swappiness=15' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
三、 编写自动化巡检与定时清理脚本
为了让服务器长期保持健康状态,我们可以编写一个轻量级维护脚本,交由 Linux 自带的 crontab 定时执行。
1. 创建运维脚本
新建脚本文件 /opt/scripts/auto_maintain.sh:
sudo mkdir -p /opt/scripts
sudo tee /opt/scripts/auto_maintain.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/auto_maintain.log"
echo "========== 维护任务开始: $(date '+%Y-%m-%d %H:%M:%S') ==========" >> $LOG_FILE
# 1. 清理超过 7 天的 systemd 日志
journalctl --vacuum-time=7d >> $LOG_FILE 2>&1
# 2. 清理 /tmp 下超过 10 天未访问的临时文件
find /tmp -type f -atime +10 -delete 2>/dev/null
# 3. 记录当前内存与磁盘剩余情况
echo "[当前内存状态]" >> $LOG_FILE
free -m >> $LOG_FILE
echo "[当前磁盘状态]" >> $LOG_FILE
df -h / >> $LOG_FILE
echo "========== 维护任务结束 ==========" >> $LOG_FILE
echo "" >> $LOG_FILE
EOF
# 赋予可执行权限
sudo chmod +x /opt/scripts/auto_maintain.sh
2. 添加 Crontab 定时任务
设置每周日凌晨 3 点 30 分自动运行一次该清理脚本:
(sudo crontab -l 2>/dev/null; echo "30 3 * * 0 /opt/scripts/auto_maintain.sh") | sudo crontab -
添加完成后,可通过 sudo crontab -l 查看已生效的计划任务列表。
总结
通过对日志体积的定量限制、Swap 缓冲机制的引入以及定时巡检脚本的部署,我们可以大幅降低华为云 ECS 实例在长期无人值守运行下的故障率。这套基础运维操作不依赖任何第三方重型监控组件,非常适合个人开发者与中小型业务服务器作为初始化标准流程执行。
- 点赞
- 收藏
- 关注作者
评论(0)