如何诊断VPS上的“设备上没有剩余空间”异常错误?
如何诊断VPS上的“设备上没有剩余空间”异常错误?
这种明明磁盘空间还充足,却频繁报“无剩余空间”的问题确实闹心,尤其是涉及到客户服务时,绝对不能放任不管。结合你描述的AlmaLinux 8.5(类CentOS)+Nginx+PHP-FPM的VPS环境,我给你梳理几个关键的诊断和排查方向:
一、优先排查inode耗尽问题
你已经注意到inode占比从3%涨到7%,这很可能是核心原因!很多人只关注磁盘容量,却忽略了inode——每个文件/目录都需要一个inode来记录元数据,哪怕文件本身很小,inode耗尽后系统照样会报“无空间”错误。
- 等问题重现时,立刻执行命令查看全系统inode使用情况:
df -i,重点看各挂载点的IUse%列,尤其是/tmp、/var/lib/php/sessions/这类临时文件或会话文件集中的目录。 - 针对你怀疑的PHP Session问题,可以直接统计Session存储目录的文件数量:
ls -l $(php -r "echo ini_get('session.save_path');") | wc -l,再用du -sh查看该目录的磁盘占用,对比inode消耗情况,就能快速确认是不是Session文件爆量了。
二、检查“已删除但被进程占用”的文件
有时候文件已经被删除,但进程还在持有它的句柄,这部分空间不会被系统释放,也会导致“假的”空间不足:
- 问题出现时,执行
lsof | grep deleted,这个命令会列出所有被进程占用但已标记为删除的文件。如果看到大文件或者大量小文件,就能定位到是哪个进程在“占着空间不释放”。 - 比如你的rsyslog日志提到
/var/lib/rsyslog/imjournal.state.tmp,可以重点看看rsyslog进程是否持有这类临时文件的句柄,必要时先尝试重启rsyslog服务(systemctl restart rsyslog),不用直接重启整个服务器。
三、优化临时文件清理策略
你用find /tmp -atime +1 -delete作为定时任务清理/tmp,这个方法本身没问题,但可以优化得更稳妥:
- 先确认定时任务是否正常执行:查看
/var/log/cron日志,搜索该任务的执行记录,排查是否有报错。 - 可以改用系统原生的
tmpwatch工具(AlmaLinux 8默认预装),它专门针对临时文件做清理,配置更灵活,比如tmpwatch 24 /tmp就能自动删除24小时未访问的文件,比find命令更适配系统的临时文件管理逻辑。
四、临时应急+持续监控方案
在彻底定位问题前,可以先做几个低风险的应急和监控措施:
- 别让PHP直接触发服务器重启,风险太高!可以改成让PHP检测到异常时,自动重启php-fpm服务(
systemctl restart php-fpm)或者清理Session目录,这样影响面小很多。 - 给inode和磁盘空间加实时监控:比如用
watch -n 30 df -h -i每隔30秒查看一次变化,或者写个简单脚本,当inode占比超过80%时给你发告警邮件,提前预警问题。 - 你设置的带SSL认证的网页执行命令的方法非常实用,等问题重现时,优先跑
df -h、df -i、lsof | grep deleted这几个命令,拿到第一手排查数据。
验证你的PHP Session猜想
你怀疑$_SESSION生成过多临时文件,这个验证起来很简单:
- 先查看php.ini里的
session.gc_maxlifetime配置,看看Session默认多久过期,如果设置得太长,会导致大量过期Session堆积。 - 手动清理一次Session目录后,监控它的文件数量增长速度,如果短时间内就暴涨,那基本实锤了。这时候可以调小
session.gc_maxlifetime,或者确保PHP的Session自动清理机制正常(session.gc_probability和session.gc_divisor不能全为0,默认是1和1000,即每1000个请求触发一次清理)。
备注:内容来源于stack exchange,提问作者Dan Bray
相关产品推荐
相关产品推荐

