Linux伺服器硬碟空間不足無法寫入,硬碟還有剩餘,原來是Inodes惹的禍!

Ubuntu系統當你遇到硬碟空間不足無法寫入的問題

伺服器中,即使硬碟空間看起來還有剩餘,但仍可能遇到文件的情況。這通常是由於 已用完導致的。

當遇到硬碟無法寫入而還有剩餘時,很可能是inodes 用盡導致。可以透過清理小文件、調整或歸檔儲存等方法解決問題,同時配合監控和最佳化設計來避免類似問題再次發生。

Linux伺服器硬碟空間不足無法寫入,硬碟還有剩餘,原來是Inodes惹的禍!

什麼是inodes?

inodes 是檔案系統中的資料結構,用於儲存檔案的元資訊(例如檔案權限、擁有者、建立時間等)。
每個檔案都會佔用一個inode,無論檔案的大小是多少。如果inodes 耗盡,即使硬碟還有,也無法建立新的檔案。

如何檢查硬碟和inodes 使用情況?

檢查磁碟空間

df -h

這會顯示硬碟的使用情況(以人類可讀的格式)。

檢查inodes 使用情況

df -i

輸出範例:

Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1000000 999999 1 100% /

IUse% 表示inodes 的使用率,如果IUse% 達到100%,表示inodes 已耗盡。

  • 小檔案過多,大量小檔案會消耗大量inodes,特別是日誌檔案、暫存檔案等。
  • 檔案系統類型,某些檔案系統(如ext4)在建立時會固定分配inodes 數量,無法動態調整。
  • 應用問題,應用程式可能會不斷產生小文件,導致inodes 被迅速耗盡。

inodes 佔用100%的解決方法

首先刪除系統的日誌文件

sudo rm -rf /var/log/*.log

刪除系統日誌檔案後,發現inodes 的使用率依舊是100%或只減少了一點點,這時,需要找出在系統中哪些目錄檔案佔用過大。

一般在Linux中,/home存放的是網站程式文件,系統程式文件一般在/var目錄中。

下面排查哪些目錄佔用過大,查看一下根目錄下資料夾大小,依大小排序。

du -h --max-depth=1 / | sort -hr

依目錄大小進一步排查在var目錄中哪些目錄佔用檔案大,依照這個方法,排查其它目錄。

du -h --max-depth=1 /var | sort -hr

在檢查過程中,發現/usr/local/lsws/logs 佔用了9.4G,進入目錄中看到一個auditmodsec.log 檔案就佔了差不多8G

auditmodsec.log 是ModSecurity 的稽核日誌文件,記錄了觸發安全規則的HTTP 請求及其回應資料。

繼續排查發現/var/lib/lsphp/session/lsphp83 目錄佔用空間過大,而且檔案數量太多。

/var/lib/lsphp/session/lsphp83 目錄是與LiteSpeed PHP (lsphp) 會話相關的儲存目錄。這個目錄通常與LSAPI (LiteSpeed SAPI) 相關,它是LiteSpeed Web Server 用來處理PHP 腳本的API。

/var/lib/lsphp/session是LiteSpeed PHP 會話檔案存放的目錄。 PHP 會話檔案在這裡儲存並按會話ID 命名。

如果會話目錄中的檔案過多或過大,可能會導致儲存空間不足問題。定期清理無效的會話文件。

上面提到的inodes佔用100%。大多就是這個目錄的問題,由於/var/lib/lsphp/session資料夾內的文件數量巨大,導致inodes佔用100%,硬碟無法寫入文件,除了硬碟滿了之外還有一個就是inodes佔用100%

這兩種問題都會導致硬碟無法寫入內容,當硬碟無法寫入檔案後,web或資料庫在運作過程中都需要寫入暫存檔案。無法寫入臨時檔案會導致網站癱瘓,資料庫癱瘓等等問題。

清理和管理會話文件

可以使用cron 定期清理過期的會話文件,防止目錄佔用過多空間。通常,過期會話檔案會根據系統設定自動清理,或者可以透過設定session.gc_maxlifetime 來控制。

首先在php的設定檔中啟用回收管理。

在PHP 中,Session 垃圾回收(Garbage Collection, GC) 是用來清理過期會話資料的機制。根據你的環境需求(例如開發環境、高流量生產伺服器等),可以對session.gc_probability、session.gc_divisor 和session.gc_maxlifetime 做出最佳化設定。

以下是啟用回收的最佳設定建議,具體視你的實際場景而定。

關鍵參數最佳化解釋

session.gc_probability

作用: 控制每次會話初始化時觸發垃圾回收的機率。
推薦設定:
開發環境: 1,便於頻繁清理會話資料以減少調試幹擾。
生產環境: 1,確保垃圾回收機制開啟。

session.gc_divisor

作用: 與session.gc_probability 一起決定垃圾回收的觸發機率。垃圾回收的機率公式為:
複製程式碼
垃圾回收機率= gc_probability / gc_divisor
推薦設定:
開發環境: 100(即1/100 的機率觸發垃圾回收)。
高流量生產環境: 1000(即1/1000 的機率觸發垃圾回收,降低效能開銷)。

session.gc_maxlifetime

作用: 設定會話檔案的最大存活時間(秒)。超過此時間未使用的會話將被視為“垃圾”。
推薦設定:
開發環境: 依需求調整,通常設定較短時間(如1440 秒= 24 分鐘)。
生產環境: 較長時間,根據應用程式需求和使用者習慣設定。
例如:
普通電商平台:3600(1 小時)
企業後台系統:7200(2 小時)或更高,如14400(4 小時)。

; 啟用垃圾回收機制,生產環境推薦設定session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 14400 ; 設定為4 小時,依業務需求可調整

或使用cron 作業或其他工具定期清理會話數據,而非依賴PHP 的垃圾回收機制

find /var/lib/lsphp/session/lsphp83 -type f -mmin +240 -delete

上述指令清理最後修改時間超過240 分鐘的會話檔案。

好了,到這裡Ubuntu系統遇到無法寫入的問題已經解決完了!

5/5 - (1 vote)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *