一、磁盘空间不足的常见表现

当服务器磁盘空间不足时,系统通常会表现出以下几种症状:

  1. 应用程序日志报错,例如"No space left on device"
  2. 数据库服务突然崩溃,特别是MySQL这类需要临时空间的系统
  3. 系统命令执行失败,甚至简单的ls都可能无法执行
  4. 新文件无法创建,已有文件无法修改

最近我就遇到一个典型案例:某电商平台的订单服务突然宕机,排查发现是日志文件把/var分区撑爆了。下面这个命令可以快速查看磁盘使用情况(Linux环境示例):

# 查看各分区使用情况(人类可读格式)
df -h

# 输出示例:
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        50G   48G  2.0G  96% /
tmpfs           3.9G     0  3.9G   0% /dev/shm

注释:使用率超过90%就需要警惕,特别是/var、/等关键分区。

二、应急处理三板斧

2.1 快速释放空间

最直接的解决方法是找到并删除大文件。推荐组合命令:

# 查找当前目录下大于100MB的文件(Linux)
find . -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh

# 查找最近3天修改过的日志文件
find /var/log -name "*.log" -mtime -3 -size +10M

注释:-size参数可调整(+50M、+1G等),-mtime表示修改时间。

2.2 日志文件处理

日志是常见的"磁盘杀手",正确的处理方式应该是:

# 清空日志文件而不删除(保持文件描述符)
echo "" > /var/log/messages

# 使用logrotate进行日志轮转(需要提前配置)
logrotate -f /etc/logrotate.d/nginx

2.3 临时空间扩展

如果无法立即删除文件,可以创建临时挂载点:

# 使用内存作为临时存储(tmpfs)
mkdir /emergency_storage
mount -t tmpfs -o size=2G tmpfs /emergency_storage

警告:tmpfs数据会在重启后消失,仅作应急使用。

三、进阶处理方案

3.1 LVM空间调整

对于使用LVM的情况(Linux环境):

# 查看VG剩余空间
vgs

# 扩展LV(假设有剩余PE)
lvextend -L +5G /dev/mapper/vg-root
resize2fs /dev/mapper/vg-root

注意:这需要预先配置LVM,且VG中有剩余空间。

3.2 Docker磁盘清理

容器环境常有存储泄漏问题:

# 清理已停止的容器及其存储
docker system prune -a

# 查看docker磁盘使用详情
docker system df

3.3 数据库应急处理

以MySQL为例的紧急措施:

-- 清理二进制日志(需确保已备份)
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';

-- 临时收缩InnoDB表空间
SET GLOBAL innodb_fast_shutdown = 0;
ALTER TABLE large_table ENGINE=InnoDB;

四、预防性措施

4.1 监控体系建设

推荐使用Prometheus+Alertmanager配置类似告警规则:

# prometheus告警规则示例
- alert: DiskSpaceCritical
  expr: 100 - (node_filesystem_avail_bytes{mountpoint="/"} * 100 / node_filesystem_size_bytes{mountpoint="/"}) > 90
  for: 5m
  labels:
    severity: critical

4.2 自动化清理脚本

定时任务的Shell脚本示例:

#!/bin/bash
# 自动清理30天前的日志
LOG_DIR="/var/log/app"
MAX_USAGE=90

current_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $current_usage -ge $MAX_USAGE ]; then
    find $LOG_DIR -type f -name "*.log*" -mtime +30 -delete
fi

4.3 存储架构优化

建议采用的分区方案:

/       20G  (系统)
/var    50G  (日志)
/home   剩余空间
/data   单独磁盘(业务数据)

五、技术方案对比

方法 优点 缺点 适用场景
直接删除文件 立即见效 可能误删重要数据 紧急情况
日志轮转 可持续预防 需要预先配置 所有生产环境
LVM扩展 不中断服务 需要未分配空间 虚拟化环境
临时挂载 快速缓解 数据易丢失 极端紧急情况

六、血的教训

去年我们有个MongoDB集群宕机,就是因为没人注意到数据目录所在分区的inode用尽(虽然磁盘空间还有剩余)。现在我们的监控系统会同时检查:

# 检查inode使用情况
df -i

# 查找大量小文件的目录
find /data -type d | while read dir; do echo "$(find $dir -type f | wc -l) $dir"; done | sort -n

七、终极解决方案

对于关键业务系统,建议:

  1. 使用独立存储设备(如SAN/NAS)
  2. 实施分层存储策略(热/冷数据分离)
  3. 部署Ceph等分布式存储系统
  4. 每周进行存储容量规划会议