服務器磁盘寫满,不一定會在第一時間表現為“打不開”。更常见的情况是:資料库寫入失敗、缓存文件生成不了、日誌停止记錄、上传功能报错,蜘蛛来抓时拿到 500 或空白頁。inode 耗尽也是類似,明明 df -h 顯示還有空間,但系統就是無法建立新文件。對站点运营来说,這類問题不需要等到出事才處理,日常巡检就能提前發現。
先分清两個指标:空間和 inode
df -h 看的是分区剩余空間,df -i 看的是 inode 使用率。两者要分開看,因為它們的“凶手”不一样。
- 空間被占满:通常是日誌、备份包、缓存、视频或附件等大文件。
- inode 被占满:通常是大量小文件,比如缓存碎片、會话文件、缩略图、临时上传分片。
如果只看空間不看 inode,可能出現“還有 20G 空闲,却寫不進任何文件”的情况。建议把 df -h 和 df -i 一起加入巡检命令。
常见占满来源,按優先級排查
- 日誌目錄:訪問日誌、错誤日誌、慢查询日誌、應用日誌。如果没做轮轉,單個文件涨到几 GB 很常见。
- 缓存目錄:頁面缓存、對象缓存、模板编译缓存。缓存本身是好事,但失效文件長期不清理就會堆积。
- 备份文件:本地备份、資料库導出、打包下载。备份最好异地存放,不要把服務器当仓库。
- 临时文件與會话:上传临时目錄、session 文件、队列重试文件。數量多的时候,inode 消耗很快。
- 邮件队列:如果站点發信量大,队列积压也會占用空間。
一套可执行的自查流程
登入服務器後,可以按下面的顺序看,不必一次做得很复杂。
- 執行 df -h 和 df -i,记錄使用率超過 80% 的分区。
- 進入可疑分区,用 du -sh * 逐层查看目錄大小,找出增長最快的目錄。
- 用 find 查找大文件,例如按大小排序,定位最近修改的異常文件。
- 對 inode 高的分区,統計目錄下的文件數量,重点看缓存和 session 目錄。
- 检查 logrotate 配置,確認日誌是否按天或按大小轮轉,是否压缩,保留多少份。
- 检查备份脚本,確認备份文件是否清理,有没有把舊备份留在同分区。
如果發現是日誌涨得太快,不要急着直接删。先確認日誌是否還需要用于排查,再决定压缩、截断還是轉移。直接清空正在寫入的日誌文件,可能導致進程繼續往已刪除的文件句柄里寫,空間不會立刻释放。
清理时的几個注意点
清理的目标是释放空間,不是制造新的故障。删之前先確認文件归属、是否被進程占用、是否有备份。
- 正在被應用寫入的日誌,優先用轮轉和截断,而不是 rm。
- 缓存目錄可以清理,但要確認應用能自動重建,避免清完頁面變慢。
- 資料库文件、站点程序文件不要当作“大文件”直接删。
- 清理後复查 df -h 和 df -i,確認空間确實释放。
把巡检變成习惯
可以给分区設定阈值,比如使用率超過 75% 就發提醒。巡检频率不用太高,每周看一次磁盘和 inode,每月检查一次日誌轮轉和备份清理策略,通常就能避免突然寫满。维護窗口内做清理和調整,也比在流量高峰时临时處理更稳妥。
對蜘蛛池和站点运营来说,服務器能稳定寫入、稳定响應,URL 才能持續被發現和抓取。磁盘和 inode 這種底层問题,平时多看一眼,比事後救火省事得多。