报错是这么冒出来的。磁盘还剩四成空间,网站却开始间歇 502,白天能开晚上报错。df -h 看不出异常,df -i 一查 inode 已经到 100%,缓存目录里堆了几百万个小文件。
中间走过弯路,把「访问日志按天切分,切出来的旧文件一直留着」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。缩略图每种尺寸存一个文件,历史尺寸从来没有清理。少数情况下是会话文件写在本地目录,过期了也没人回收。
不容易想到的是,队列任务的临时文件失败后不清理,残留越积越多。
动手时先看 inode 使用率而不是容量
df -i /
接着找出小文件最多的目录
find /var/www -xdev -type d | while read d; do echo "$(find $d -maxdepth 1 | wc -l) $d"; done | sort -nr | head
随后清理过期缩略图与旧日志
find /var/www/wp-content/uploads -name '*-150x150.*' -mtime +180 -delete
给会话目录加定期回收
find /var/lib/php/sessions -type f -mmin +1440 -delete
恢复的判定其实很直接。inode 使用率降到六成以下,502 不再出现,蜘蛛当日抓取成功率回到九成九,日志里的 5xx 归零。
只盯磁盘容量会漏掉 inode 这一层,小文件多的站点先看 df -i 再谈扩容,加盘解决不了目录项被占满。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
