看着像偶发问题,实际往往有固定触发条件,复现一次比猜十次有用。 网站上传图片全部失败,PHP 日志写 No space left on device,可是 df -h 显示根分区只用了五成,连 touch 一个空文件都直接失败。

先把影响面控制住,再谈彻底修复,顺序反了容易在高峰期出二次故障。

先分清是哪一类原因

  1. 大量小文件把 inode 表耗尽,它和块空间是两套彼此独立的配额
  2. session 与缓存目录堆积了几百万个临时文件,长期没人清理
  3. 邮件队列里全是几 KB 的退信,前后积压了好几个月

按顺序处理

1. 确认到底是 inode 还是块空间用完

df -i / /var && df -h /

2. 按目录统计小文件数量,找出重灾区

for d in /var/*; do echo $(find $d -xdev | wc -l) $d; done

3. 清理一周前的退信与临时文件

find /var/spool/postfix -type f -mtime +7 -delete

4. 把 session 目录换到独立分区并限制数量

php -i | grep session.save_path

怎么确认已经恢复

df -i 的已用百分比从一百回落到六成以下,重新上传图片成功,新建空文件也不再报错。

容易忽略的地方

inode 总数在 mkfs 那一刻就定死了,事后只能加盘或者重建文件系统;删除之前要确认路径没被软链串到别处,否则清了也不释放。 如果按上面的顺序做完仍不生效,把配置和日志按时间对齐再看一遍,通常能发现被忽略的一层。

作者 9823189