全部產品
Search
文件中心

Simple Application Server:Linux執行個體磁碟空間滿和Inode滿的問題排查方法

更新時間:Jun 30, 2024

在Linux系統的Simple Application Server內建立檔案或者應用時出現No space left on device報錯提示,即表示您的磁碟空間不足。如果磁碟滿不符合您的預期使用,可根據本文判斷磁碟滿的原因並相應解決。

說明

如果磁碟滿是符合您預期的使用,則通過升配掛載資料盤或者擴容資料盤的方式即可解決,具體操作,請參見升級配置掛載資料盤擴容資料盤

可能原因

磁碟空間不足的問題通常有以下幾類原因:

  1. 磁碟分割空間使用率達到100%。

  2. 磁碟分割Inode使用率達到100%。

  3. 磁碟存在已刪除未釋放的殭屍檔案。

    說明

    已刪除檔案可能因刪除時檔案控制代碼被開啟,導致檔案刪除時檔案空間未能被釋放。

  4. 掛載點覆蓋。

    說明

    在原有檔案系統的目錄下已經存在大量檔案,掛載新磁碟後掛載點(目錄)被覆蓋。但您系統內的應用可能仍會繼續讀寫原有檔案系統空間,這時就有可能出現您的應用報空間不足,但您使用dfdu命令查看磁碟檔案目錄的容量使用方式時卻無法統計到,原因是dfdu命令統計的是當前掛載點對應的分區使用方式。

  5. inotify watches達到上限。

    inotify是Linux系統的一種監控檔案系統事件的機制,被廣泛用於即時監控檔案系統中的檔案變化。該錯誤實際上和磁碟空間沒有關聯,不表示磁碟儲存空間已滿。本文檔中對這一報錯進行補充說明,以便協助您做正確的排查。

排查方法和解決方案

請根據不同的問題原因,通過以下方式進行處理。

一、磁碟分割空間使用率達到100%

您可以通過清理佔用磁碟空間較大的檔案或目錄、擴容或新購磁碟等方式來解決磁碟分割空間使用率達到100%的問題。

清理佔用空間較大的檔案或者目錄

  1. 使用救援串連Linux伺服器。具體操作,請參見使用救援串連Linux伺服器

  2. 執行以下命令,查看磁碟使用率。

    df -h

    系統顯示類似如下資訊。例如,分區/dev/xvda1的使用率為15%。

    image

  3. 執行以下命令,進入根目錄,查看哪個目錄佔用磁碟空間較大。

    cd /
    du -sh *

    系統顯示類似如下資訊。圖樣本可以看出/usr目錄佔用空間最大,則需要繼續查看/usr目錄下哪個檔案或目錄佔用空間較大。請您根據實際環境進行操作。 image

  4. 執行以下命令,逐級查看哪個目錄佔用磁碟空間較大。

    例如本例中進入較大的 /usr目錄,繼續查看/usr目錄下哪個檔案或目錄較大。

    cd /usr
    du -sh *

    系統顯示類似如下資訊。圖樣本可以看出local目錄佔用空間最大,則需要查看local目錄下哪個檔案或目錄佔用空間較大,以此類推。image

  5. 結合業務情況判斷,進行以下處理。

    • 清理佔用空間較大且不再需要的檔案或目錄:結合業務情況判斷,刪除不再使用的檔案或目錄。

    • 擴容或新購雲端硬碟:如果業務不允許刪除磁碟中的檔案或通過清理檔案也無法釋放更多空間,您可以根據實際業務情境和需求擴容磁碟或者新購磁碟。具體操作,請參見雲端硬碟擴容指引建立雲端硬碟掛載資料盤

升級配置、擴容資料盤或掛載資料盤

如果您無法通過清理檔案釋放更多空間,可以考慮通過升級配置、擴容磁碟或者掛載資料盤(如果之前未掛載)的方式來解決。具體操作,請參見升級配置掛載資料盤擴容資料盤

二、磁碟分割Inode使用率達到100%

磁碟分割Inode是檔案系統中的一個重要概念,檔案系統內每個檔案和目錄都由一個唯一的Inode標識。每個磁碟分割在格式化時會預分配一定數量的Inodes,但是如果檔案系統中存在大量小檔案或目錄,Inode資源也可能成為系統資源的瓶頸。當所有Inodes都被分配完畢,即使磁碟還有剩餘空間,也無法再建立新的檔案或目錄,這就是Inode使用率達到100%現象。此時,需要清理不必要的檔案以釋放Inode,或者增加Inode數量來解決磁碟分割Inode使用率達到100%的問題。

說明

查詢Inode使用率

  1. 使用救援串連Linux伺服器。具體操作,請參見使用救援串連Linux伺服器

  2. 執行以下命令,查詢Inode使用率。

    df -i

    image

  3. 如果Inode使用率達到或者接近100%,可以通過以下兩種方式進行處理:

清理Inode佔用高的檔案或者目錄

  1. 執行以下命令,分析根目錄下的每個二級目錄下有多少個檔案。

    for i in /*; do echo $i; find $i | wc -l; done

    系統顯示類似如下資訊。圖樣本可以看出/usr目錄下的檔案數最多,則需要繼續查看/usr目錄下哪個目錄檔案數最多,檔案數越多說明Inode佔用越高。請您根據實際環境進行操作。

    image

  2. 逐層進入Inode佔用最高的目錄,繼續執行上述命令,逐步定位佔用過高空間的檔案或目錄,最後進行相應清理。

增加Inode數量

警告
  • Inode數量的調整需要重新格式化磁碟,磁碟內的資料將被刪除,請確保資料已經得到有效備份後,再進行以下操作。您可以自行拷貝檔案,也可以通過快照方式進行資料備份,建立快照的具體操作,請參見建立快照

  • Inode數量的調整需要卸載檔案系統,這可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。

    三、存在殭屍檔案

    如果磁碟分割容量和Inode容量都沒有問題,可能是系統中存在大量檔案已經被刪除(顯示為deleted)但是仍被系統內進程佔用,系統無法釋放磁碟空間,且由於這部分檔案已經被標記刪除,通過dfdu 命令無法統計到。如果殭屍檔案過多,會佔用較大的磁碟空間。您可以參考以下步驟查看並刪除殭屍檔案。

    1. 使用救援串連Linux伺服器。具體操作,請參見使用救援串連Linux伺服器

    2. 如果系統沒有預裝lsof,選擇以下合適命令,安裝lsof。

      • Alibaba Cloud Linux、CentOS等系統

        yum install -y lsof
      • Debian、Ubuntu等系統

        apt-get install -y lsof
    3. 執行以下命令,查看殭屍檔案佔用情況。

      lsof |grep delete | sort -k7 -rn | more

      系統顯示類似如下資訊,其中第7列為對應檔案的大小(單位為Byte),您可以將第七列值累加起來看總檔案大小和您非預期的磁碟使用空間是否接近,接近即為殭屍檔案佔用了您磁碟空間。image

    4. 如果存在殭屍檔案,可通過以下兩種方式釋放控制代碼清除殭屍檔案,以釋放磁碟空間。

      • 重啟伺服器清除

        重啟伺服器,系統會退出現有的進程,釋放調用的deleted檔案的控制代碼。

        重要

        重啟伺服器可能會影響業務,請您選擇合適時間進行重啟。

      • 通過kill命令清除

        根據lsof命令列出的PID進程號(通常為第二列),使用kill命令結束佔用這些檔案的服務進程。

        1. 執行以下命令,列出PID進程號。

          lsof |grep delete 
        2. 根據您的業務情況,確保對應進程可以停止或者重啟,執行以下命令,停止佔用這些檔案的服務進程。

          kill <進程號>
          重要

          如果伺服器正在運行業務,可能會影響到業務,請謹慎操作。

    四、掛載點覆蓋

    當您排除了上述三個問題,仍未找到非預期的磁碟空間使用,可能的原因是掛載點覆蓋。您可以用下述方法進行確認。

    如下圖所示案例,您可以看到30 GB的系統硬碟/dev/vda1使用率已經達到了95%,通過du可以看到,主要是/home目錄佔用了24 GB的空間。

    image

    但當我們把/dev/vdb1掛載到/home目錄後,如下圖所示,可以看到系統硬碟/dev/vda1使用率還是95%,整個根分區下最大的目錄僅有/usr佔用超過1 GB,無法找到具體哪個目錄佔用高,/home目錄統計到的使用空間僅為20 KB,不是此前看到的24 GB空間佔用,此現象即為掛載點覆蓋。

    image

    解決掛載點被覆蓋的問題,通常通過先取消磁碟分割掛載,再檢查原掛載目錄下的空間佔用情況。

    警告

    分區卸載可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。