inode 用量爆表怎麼辦?檔案數量限制清理與預防

網站某天突然無法上傳圖片、後台存檔失敗、信箱開始退信,磁碟空間明明還有一大半,主機商卻寄來一封「File Usage 即將超過上限」的警告——這多半不是空間不夠,而是 inode 用量爆表。inode 是主機對「檔案與資料夾總數量」的限制,跟容量是兩回事:一台還剩 5GB 空間的虛擬主機,可能因為快取外掛產生了三十幾萬個小檔案而先一步把 inode 用光,網站從此寫不進任何新檔。

這篇會先講清楚 inode 到底卡在哪、怎麼在 cPanel 與 SSH 兩種介面查出真正肥大的資料夾,再給一套能照做的清理順序與長期預防設定。WooCommerce 商店因為訂單、log 與 session 檔特別容易踩雷,後面會單獨拆解。

inode 是什麼?跟磁碟空間有什麼不同?

inode 是 Linux 檔案系統用來記錄「一個檔案或資料夾」的索引節點,裡面存的是檔案的大小、權限、擁有者、建立與修改時間等中繼資料,不含檔名本身也不含實際內容。重點只有一句:主機上每一個檔案、每一個資料夾,不論大小,都各佔用一個 inode。

所以 inode 用量等於「檔案數量」,磁碟空間用量等於「檔案總容量」,兩者各有各的上限,誰先滿誰就先讓網站出問題。一個常被引用的比喻很好懂:一張千元鈔是 1 個檔案、一千個一元硬幣是 1000 個檔案,總值一樣,但後者吃掉的 inode 是前者的一千倍。

這也解釋了開頭那個矛盾:磁碟還很空、網站卻寫不進檔案。一個 WordPress 站的圖片、快取、外掛檔案多半是幾 KB 到幾百 KB 的小檔,容量加起來不大,數量卻很驚人,inode 往往比容量先見底。

主機為什麼要限制 inode 數量?

虛擬主機限制 inode,是為了保護同一台實體伺服器上所有用戶的共同效能。檔案系統在做檢索、備份、還原這些動作時,成本跟檔案「數量」高度相關,而不是跟總容量相關:備份一個 30 萬個小檔的帳號,比備份一個同樣容量、但只有幾千個大檔的帳號慢得多,也更吃 I/O。

問題常出在程式寫得不好或管理疏忽,累積出大量「幽靈檔案」。最典型的就是品質不佳的快取外掛,每產生一份快取就寫一個實體檔案,長期下來可能堆出數十萬個沒人會去讀的小檔。這些檔案單個容量極小,存在感很低,卻會拖慢整台主機的檔案系統檢索效率,連帶影響鄰居用戶。主機商設 inode 上限,等於是替共享環境設一道防火牆,數量高低則依方案而異。

inode 用量超過上限時,網站會發生什麼事?

inode 一旦觸頂,系統就再也寫不進任何新檔案,連網站運作時要暫存的小檔都建不出來,於是會以各種看似不相關的症狀爆發出來。常見的有:

  • 媒體庫無法上傳新圖片或檔案,上傳到一半失敗
  • 後台編輯文章或頁面時存檔失敗、改了沒反應
  • 外掛與佈景主題無法更新或安裝
  • 信箱收不到新信,寄信端收到 mailbox is full: retry timeout exceeded 的退信
  • 前台跳出 PHP 錯誤,或登入 phpMyAdmin 時出現 Error 500 畫面
  • 嚴重時連 cPanel 都登不進去,或登入後設定存不起來

要特別注意的是,超過 inode 上限跟超過磁碟容量會引發幾乎一樣的錯誤訊息,光看症狀分不出來。所以遇到上述狀況,第一步永遠是回 cPanel 首頁,把 File Usage(inode)與 Disk Usage(容量)兩個數字都看一眼,先確認是哪一個先滿,再決定怎麼處理。

另外提醒一個容易錯失的時機:如果發現 inode 已超標但 cPanel 還能登入,請立刻動手刪檔,不要拖。一旦系統完全鎖定,可能連刪檔的操作介面都打不開,反而更難救。

怎麼查 inode 用量?cPanel 與 SSH 兩種做法

查 inode 用量有兩條路,先看總量、再找肥大的位置。

第一條是 cPanel 介面,適合所有人。登入 cPanel 後,看頁面右側的統計欄(Statistics 或 General Information 區塊),找到「File Usage」這一列,數字格式是「已使用 / 上限」,例如 71,992 / 350,000 就代表用了約 7.2 萬、上限 35 萬。斜線左邊是目前佔用、右邊是方案允許的最大值。同一區塊的「Disk Usage」則是容量。要更細的分布,可以開「Files」分類底下的「Disk Usage」工具,它會列出各資料夾的檔案數與容量。

要注意 cPanel 的統計不是即時更新。刪完檔案後數字可能要等幾分鐘才會回落,先別急著重刪。

第二條是 SSH 指令,適合有指令列權限、想精準定位的人。連上 SSH 後,最實用的是用 du 直接按 inode 數排序,找出哪個資料夾檔案最多:

du --inodes --max-depth=2 ~/public_html | sort -nr | head -20

--inodesdu 統計檔案數而非容量,--max-depth=2 往下兩層、sort -nr | head -20 由多到少列出前 20 名。想看得更深就把深度調大。如果只是要算某個資料夾底下總共有幾個檔案,用這行最快:

find ~/public_html/wp-content/cache -type f | wc -l

跑這類指令時,檔案非常多的資料夾會跑得比較久,屬正常現象,耐心等它跑完即可。

哪些資料夾最容易把 inode 吃光?

對 WordPress 站來說,inode 暴增幾乎都集中在固定幾個地方,知道往哪裡找就省一半工。

多尺寸縮圖是頭號元兇。 每上傳一張圖,WordPress 不會只存一份,而是依照後台與佈景主題註冊的尺寸,自動再生出縮圖、中尺寸、大尺寸等多份副本。光是預設就常見三到五份,佈景主題若又用 add_image_size 額外註冊幾種尺寸,一張原圖很可能變成七、八個實體檔案。換算一下:100 篇文章、每篇平均 5 張圖、每張生成 5 份,光圖片就吃掉 2500 個 inode,這還沒算原圖以外的版本累積。

快取與暫存檔是第二名。 快取外掛、頁面快取、wp-content/cachetmp 暫存資料夾、以及外掛產生的記錄檔,都會持續長出大量小檔。設定不良的快取機制堆出幾萬個檔案並不罕見。

其餘常見的 inode 消耗源包括:

  • 未刪除的舊備份:備份外掛留在站內的封存檔,一份備份本身就含上萬個檔案
  • 停用但沒刪除的外掛與佈景主題:停用只是不執行,檔案還躺在伺服器上照樣佔 inode,要按「刪除」才會真正釋放
  • 回收桶內的文章、頁面、媒體:丟進垃圾桶不等於刪除,相關附件檔仍在
  • 伺服器 log 檔:多網域同時記錄時,log 數量會快速膨脹
  • 信箱郵件:每封信都算一個檔案,長期沒清的收件匣、垃圾信匣、退信會默默累積成數萬個 inode

inode 爆表了該怎麼清理?

清理的原則是「先處理數量最多、又最安全可刪的」,依下面順序做,邊做邊回 cPanel 看 File Usage 是否回落(記得它有延遲)。

第一、清空快取與暫存檔。 這通常是 CP 值最高的一步。用快取外掛內建的「清除快取 / Purge All」功能整批清掉,再到 wp-content/cache 確認殘檔有沒有清乾淨。清完後若 inode 大幅下降,問題多半就出在這。

第二、刪掉站內舊備份。 備份外掛留在伺服器上的封存檔先下載到本機保存,再從外掛介面或檔案管理員刪除站內那份。備份「不應該」長期存在網站目錄裡,這是最常被忽略卻最肥的一塊。

第三、刪除停用的外掛與佈景主題。 進「外掛 → 已安裝的外掛」,把確定不用的直接刪除,不是停用;佈景主題同理,只留目前啟用的與一個官方預設主題當備援即可。動手前先做一份完整備份比較保險。

第四、清理媒體庫與多餘縮圖尺寸。 先在「設定 → 媒體」把用不到的縮圖尺寸寬高設為 0,停止再生;佈景主題額外註冊的尺寸則要用外掛來停用或重新生成。已經產生的多餘尺寸副本,可以用媒體清理類外掛掃出未被任何文章引用的檔案後再刪。確認某些尺寸完全用不到,也能直接到 wp-content/uploads 移除對應的副本檔。

第五、清空回收桶與草稿。 把文章、頁面、媒體的垃圾桶清空,順手刪掉長期不會發布的舊草稿。

第六、清理信箱。 如果信箱跟網站在同一台主機(共享方案常見),到 Webmail 或 cPanel 的 Email 相關工具清掉垃圾信、退信與用不到的信箱帳號;要保留的信先用郵件軟體下載到本機再從伺服器刪除。

最後一個觀念要記牢:刪檔後一定要清空垃圾桶。不論是 WordPress 的回收桶還是 Webmail 的垃圾匣,東西還在桶裡就還佔著 inode,沒清空等於沒刪。另外,只動手刪自己 public_html、子網域、附加網域底下的檔案,以及自己的信件;跟 public_html 同層的系統檔案、cPanel 的 mail 系統資料夾不要碰,誤刪會讓網站或郵件功能壞掉。如果上面全清過 inode 還是接近上限,那就是真的需要升級主機方案了。

WooCommerce 商店為什麼更容易踩到 inode 限制?

跑 WooCommerce 的站比一般部落格更吃 inode,因為電商情境天生會產生大量小檔案,而且很多是背景自動長出來、店主根本不會主動去看的。

最容易失控的是 log 檔。WooCommerce 與各種金流、物流、同步類外掛會把運作記錄寫進 wp-content/uploads/wc-logs(或外掛各自的 log 目錄),每天、甚至每筆交易都可能新增一個檔案,沒設定保留期限的話會一路累積。這裡只是客觀說明 log 來源,金流串接本身的設定不在本文範圍。

第二是 session 與暫存檔。購物車、結帳流程會用到大量暫態資料,若外掛把這些寫成實體檔案而非進資料庫,又沒有定期回收,session 檔的數量會相當可觀。

第三是 商品圖片的縮圖倍數效應放大。商店頁、分類頁、單品頁、購物車縮圖往往各需要不同尺寸,佈景主題與 WooCommerce 註冊的圖片尺寸通常比一般部落格多,等於同一張商品圖被切成更多份副本,inode 消耗直接翻倍。

針對 WooCommerce,清理時要額外把 wc-logs 與相關外掛的 log 目錄納入檢查,並在外掛設定裡縮短 log 保留天數;session 檔則確認交易類外掛有開啟定期清理。其餘步驟跟前一節相同。

怎麼預防 inode 再次爆表?

清完只是止血,要不再復發得靠固定維護與幾個一次性設定。

一次性的設定先做好:到「設定 → 媒體」把用不到的縮圖尺寸寬高歸零,佈景主題多註冊的尺寸用外掛精簡掉,從源頭砍掉每張圖的副本數量;上傳前先用壓縮工具或壓縮類外掛把圖片瘦身,檔案小也順便加快載入。影片一律不要上傳到 WordPress,改放 YouTube 或 Vimeo 再嵌入,省下大量空間與 inode。

針對會自動長檔的快取、log、暫存與 session,最有效的是排一支定時清理的 cron job,定期清掉 tmp、快取目錄與過期 log;哪些暫存檔可以安全刪除,動手前可以先跟主機商確認,避免誤刪到系統需要的檔案。

剩下的靠習慣維持。建議每一到三個月做一輪例行檢查:登入 cPanel 看一眼 File Usage 的趨勢、清空回收桶與草稿、清理快取與退信、把站內備份下載後移除。大改版或裝拔大量外掛之後也順手看一次,數字異常跳高就代表有東西在偷長檔,趁早抓比等爆掉再救輕鬆得多。

說到底,inode 用量管理不是什麼高深技巧,而是「定期回頭看一眼、該刪的別留」的紀律。把縮圖尺寸、快取與 log 這三個最會偷長檔的地方管好,再養成每季巡一次 cPanel 數字的習慣,就能讓網站一直待在安全水位,不會再被那封「File Usage 即將超過上限」的信打亂步調。

相關文章
標籤: inode, WooCommerce, 虛擬主機, cPanel, WordPress 優化