logo

Linux服务器系统盘告急:全面排查与优化指南

作者:快去debug2025.09.25 20:24浏览量:0

简介:本文针对Linux服务器系统盘空间耗尽问题,提供从诊断到解决的完整方案,涵盖日志清理、缓存释放、存储优化等核心操作,助力运维人员快速恢复系统运行。

一、系统盘空间耗尽的危害与诊断

当Linux服务器系统盘(通常为/分区)空间耗尽时,会导致系统级服务异常、应用进程崩溃甚至无法登录。典型表现为:

  • 命令行操作报错”No space left on device”
  • 日志服务(如rsyslog)停止记录
  • 关键服务(如MySQL、Nginx)启动失败
  • 用户登录时提示”write error: No space left on device”

诊断三步法

  1. 使用df -h查看磁盘使用情况,重点关注/分区的Use%
    1. $ df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/vda1 50G 49G 200M 100% /
  2. 通过du -sh *定位大文件(建议在目标目录执行)
    1. $ cd /var
    2. $ du -sh * | sort -rh | head -10
    3. 12G log
    4. 8.2G cache
  3. 检查inode耗尽情况(df -i),当IUse%接近100%时,即使空间未满也会无法创建文件

二、紧急空间释放方案

1. 日志文件专项清理

系统日志是空间占用的重灾区,需按优先级处理:

  • 历史日志归档:使用logrotate工具自动轮转,或手动压缩

    1. # 压缩旧日志(保留最近7天)
    2. find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
    3. # 清空特定日志(谨慎操作)
    4. > /var/log/syslog
  • 日志服务配置优化:修改/etc/rsyslog.conf限制日志大小
    1. $ModLoad imuxsock
    2. $MaxMessageSize 64k
    3. $SystemLogRateLimitInterval 5
    4. $SystemLogRateLimitBurst 200

2. 缓存文件深度清理

  • APT/YUM缓存

    1. # Debian/Ubuntu
    2. apt-get clean
    3. # CentOS/RHEL
    4. yum clean all
  • Docker镜像缓存
    1. docker system prune -a --volumes
    2. # 保留最近3个镜像
    3. docker image prune -a --filter "until=240h"
  • 内存转储文件
    1. # 清理core dump文件
    2. find / -name "core.*" -delete
    3. # 禁用core dump(临时)
    4. echo "core file size (blocks) 0" > /proc/sys/kernel/core_pattern

3. 临时文件系统清理

  • 删除旧内核(保留最新2个):

    1. # Debian/Ubuntu
    2. dpkg --list | grep linux-image
    3. apt-get purge linux-image-4.4.0-XX-generic
    4. # CentOS/RHEL
    5. package-cleanup --oldkernels --count=2
  • 清理缩略图缓存
    1. rm -rf ~/.cache/thumbnails/*

三、长期存储优化策略

1. 分区方案重构

对于新部署系统,建议采用LVM分区方案:

  1. # 创建物理卷
  2. pvcreate /dev/vdb
  3. # 创建卷组
  4. vgcreate vg_system /dev/vdb
  5. # 创建逻辑卷(可扩展)
  6. lvcreate -L 100G -n lv_root vg_system
  7. # 格式化并挂载
  8. mkfs.ext4 /dev/vg_system/lv_root
  9. mount /dev/vg_system/lv_root /

2. 自动清理机制配置

  • 设置logrotate(示例配置):
    1. /var/log/nginx/*.log {
    2. daily
    3. missingok
    4. rotate 14
    5. compress
    6. delaycompress
    7. notifempty
    8. create 640 root adm
    9. sharedscripts
    10. postrotate
    11. [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    12. endscript
    13. }
  • 配置tmpwatch(自动清理临时文件):
    1. # 安装工具
    2. yum install tmpwatch
    3. # 配置每日清理(保留最近7天)
    4. echo "0 3 * * * /usr/sbin/tmpwatch 7d /tmp" > /etc/cron.daily/tmpclean

3. 监控告警体系搭建

  • 基础监控脚本

    1. #!/bin/bash
    2. THRESHOLD=90
    3. USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
    4. if [ "$USAGE" -gt "$THRESHOLD" ]; then
    5. echo "CRITICAL: Disk usage ${USAGE}% exceeds threshold ${THRESHOLD}%" | mail -s "Disk Alert" admin@example.com
    6. fi
  • Prometheus监控配置
    1. # node_exporter配置示例
    2. - job_name: 'node'
    3. static_configs:
    4. - targets: ['localhost:9100']
    5. metric_relabel_configs:
    6. - source_labels: [__name__]
    7. regex: 'node_filesystem_avail_bytes{device="rootfs",mountpoint="/"}'
    8. action: keep

四、特殊场景处理

1. 数据库文件处理

  • MySQL数据归档
    1. -- 创建归档表
    2. CREATE TABLE orders_archive LIKE orders;
    3. -- 迁移历史数据
    4. INSERT INTO orders_archive SELECT * FROM orders WHERE order_date < '2023-01-01';
    5. -- 删除原数据
    6. DELETE FROM orders WHERE order_date < '2023-01-01';
  • MongoDB压缩
    1. // 执行修复操作(需预留双倍空间)
    2. db.repairDatabase();
    3. // 或使用compact命令
    4. use mydb;
    5. db.runCommand({compact: 'mycollection'});

2. 容器化环境处理

  • Kubernetes节点清理

    1. # 清理未使用的镜像
    2. kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}' | while read pod image; do
    3. docker rmi $(docker images | grep "<none>" | awk '{print $3}')
    4. done
    5. # 清理空目录
    6. find /var/lib/kubelet/pods -type d -empty -delete

五、预防性维护建议

  1. 实施存储配额
    1. # 设置用户磁盘配额
    2. edquota -u username
    3. # 启用项目配额
    4. quotaon -vug /dev/vg_system/lv_root
  2. 建立备份策略
    1. # 增量备份方案
    2. tar -czf /backup/system_$(date +%Y%m%d).tar.gz --listed-incremental=/backup/snapshot.file /etc /var
  3. 定期健康检查
    1. # 每周检查脚本
    2. 0 2 * * 1 /usr/local/bin/check_disk.sh >> /var/log/healthcheck.log

通过系统化的诊断流程、针对性的清理策略和预防性的维护机制,可有效解决Linux服务器系统盘空间耗尽问题。建议运维团队建立标准化操作流程(SOP),将空间监控纳入日常巡检体系,结合自动化工具实现问题预判与快速响应。对于关键业务系统,建议采用分布式存储云存储方案,从根本上解决单点存储瓶颈问题。

相关文章推荐

发表评论

活动