站点运营

站点运营:磁盘空間與 inode 自查,別让日誌把服務器塞满

磁盘寫满通常没有明顯征兆,却能同时让資料库寫入、session 儲存和文件上传一起失灵。這篇文章整理一套磁盘與 inode 自查思路:两個必看的指标、常见的空間大戶、合理的排查顺序,以及日誌轮轉與清理时容易踩的坑。

站点运营

站点运营:磁盘空間與 inode 自查,別让日誌把服務器塞满

站点打不開,第一反應往往是程序、資料库或網絡,但有一類故障经常被忽略:服務器磁盘寫满了。它不會给你漂亮的报错頁面,常见表現是資料库拒绝寫入、session 無法儲存、日誌寫不進去、上传失敗,甚至遠程登入都變得困难。更麻烦的是,很多站点在磁盘涨到 100% 之前毫無征兆。

磁盘满之前,先看两個指标

容量和 inode 是两件事。容量被占满說明文件太大,inode 被占满說明文件太多。一個目錄里堆了几十萬個几 KB 的小文件,容量看起来還很空,但系統已经無法建立新文件。

  • df -h:看各分区已用百分比,重点盯根分区和存放資料的挂载点。
  • df -i:看 inode 使用率,缓存目錄、session 目錄、邮件队列容易先在這里爆掉。
  • du -sh 逐层往下钻,定位到底是哪一個目錄在膨胀。

养成先看這两個數的习惯,比出故障後再逐個目錄翻要快得多。

常见的空間大戶

  • 應用日誌、訪問日誌、错誤日誌,尤其是不做轮轉的日誌。
  • 备份文件:本地留一份、异地留一份,结果本地那份忘了清。
  • 缓存與临时文件:模板缓存、图片缩略图、上传中轉目錄。
  • 會话文件:長期没人清理的 session 目錄,几十萬個小文件很常见。
  • 舊版本發布包:每次發版留一個目錄,一年下来就是几十 GB。
  • 資料库的 binlog、慢查询日誌、临时表文件。

排查顺序建议

  1. 先用 df 確認是容量問题還是文件數量問题。
  2. 用 du 從根目錄逐层定位到具体目錄,不要一上来就全盘搜尋大文件。
  3. 確認這些文件里哪些可以删、哪些必须保留。
  4. 清理前记錄目前數值,清完再對比,確認释放量符合预期。
  5. 最後回到源头,补上轮轉、保留策略或清理定时任務。

日誌是最容易失控的一块

多數站点的磁盘是被日誌吃掉的。日誌的價值在于能回查問题,所以不建议直接關掉,而是要有轮轉和保留期。

  • 按天或按大小切分,單個文件不要長到一 GB 以上。
  • 保留 7 到 30 天,视业務和合規要求而定。
  • 轮轉後压缩,压缩比通常很可观。
  • 错誤日誌和訪問日誌分開,訪問日誌可以只保留必要字段。
  • 定期確認轮轉真的在执行,而不是配置文件寫好了却從未生效。
清理生产环境的文件之前,先確認没有進程正在寫入,也不要随手删掉仍被進程引用的日誌文件。已经刪除但仍有句柄存在的文件不會释放空間,df 看起来毫無變化,這種情况需要重啟對應進程才能回收。

清理时的几個注意点

  • 备份文件按策略刪除,確認异地副本可用再删本地。
  • 不要直接删正在使用的 session 或缓存目錄,先看程序是否支持優雅清理。
  • 大文件刪除後空間没释放,用 lsof 检查是否還有進程持有句柄。
  • 让磁盘長期维持在 80% 以下,给日誌暴涨和临时文件留出缓冲。

把盯守變成日常動作

  • 给容量和 inode 使用率配上阈值提醒,80% 提示,90% 升級處理。
  • 每周固定時間看一眼增長曲线,比每天临时救火轻松。
  • 把清理脚本和轮轉策略寫進运维文档,換人接手时不至于断档。
  • 扩容不是唯一答案,先確認没有可以回收的部分。

磁盘和 inode 属于那種平时没人注意、出問题时最要命的资源。把它纳入常規自查,配合日誌轮轉和保留策略,能省下不少半夜被叫醒的時間。