全部產品
Search
文件中心

Elastic Compute Service:解決Linux執行個體磁碟空間滿問題

更新時間:Dec 11, 2024

通常情況下,您的Linux執行個體所擁有的磁碟空間是有限的。如果您的應用服務部署在Linux執行個體上,隨著應用服務的持續運行和隱藏檔的不斷增加,磁碟剩餘空間將逐漸減少。當您的磁碟空間不足時,服務將無法繼續將檔案寫入磁碟,從而可能導致服務異常。本文介紹判斷磁碟空間不足的方法及其相應的解決方案。

問題現象

在Linux系統的Elastic Compute Service執行個體中建立檔案或運行應用時,如出現No space left on device的錯誤提示,這表明您的磁碟空間已不足。此時,您需排查導致磁碟空間不足的原因,並根據具體情況採取相應措施以解決磁碟不足的問題。

可能原因

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

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

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

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

    說明

    已刪除的檔案可能由於在刪除之前其檔案控制代碼處於開啟狀態,從而導致在檔案刪除時未能釋放檔案空間。

  • 掛載點被覆蓋。

    說明

    如果原有檔案系統的目錄下已經存在大量檔案,在該掛載點(目錄)掛載新裝置後,原掛載點將被覆蓋。然而,您系統內的應用可能仍會繼續對原有檔案系統空間進行讀寫操作,此時可能會出現您的應用報告空間不足的情況,然而在使用dfdu命令查看磁碟檔案目錄的容量使用方式時卻無法反映出這一點。這是因為dfdu命令統計的是當前掛載點所對應的分區的使用方式。

  • inotify watches達到上限。

    說明

    inotify是Linux系統中一種監控檔案系統事件的機制,廣泛應用於即時監控檔案系統中的檔案變化。該錯誤實際上與磁碟空間無關,並不表示磁碟儲存空間已滿。本文檔對這一報錯進行了補充說明,以便協助您排查並解決該問題。

排查方法和解決方案

出現No space left on device錯誤提示的原因有多種,請根據具體問題的原因進行相應處理。

說明

以下排查方法和解決方案需要遠端連線到需要安裝的ECS執行個體。具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

警告

在以下操作中,如需通過刪除檔案來釋放磁碟空間,請務必在刪除之前確認該檔案已不再需要,以防止因刪除檔案導致的資料丟失或對您的業務產生不利影響。建議在手動刪除檔案之前進行磁碟備份,您可以選擇自行拷貝檔案,或通過快照方式進行資料備份。關於如何建立快照,請參見建立快照

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

排查方法

檢查磁碟的當前使用率,並識別高佔用的檔案。

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

    df -h

    回顯資訊如下所示。樣本中分區/dev/vda3的使用率達到100%。

    image

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

    sudo du -sh /* | sort -rh | head -n 10

    回顯資訊如下所示。從圖示中可以看出,/home目錄佔用空間最大,因此需要繼續查看/home目錄下哪個檔案或目錄佔用空間較大。請您根據實際情況進行操作。

    image

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

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

    sudo du -sh /home/* | sort -rh | head -n 10

    回顯資訊如下所示。從圖示可以看出,ecs-user目錄佔用了最大的儲存空間,因此需要進一步檢查ecs-user目錄下的具體檔案或子目錄,以確定哪些項佔用了較大空間。

    image

    以此類推,最終定位到在/home/ecs-user/目錄下有無效的可刪除的大檔案。

    image

解決方案

請您根據業務情境及實際情況進行判斷,並採取相應措施。

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

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

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

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

排查方法

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

df -i

image

解決方案

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

  • 通過清理Inode佔用高的檔案或者目錄,以降低Inode的使用量

    如果不方便格式化磁碟以增加Inode數量,可以參考以下步驟,清理Inode佔用量高的檔案或者目錄。

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

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

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

      image

    2. 執行以下命令,以查看本樣本中Inode使用率最高的/mnt目錄下哪個檔案或目錄的Inode使用率較高。

      image

    3. 以此類推,最終定位Inode使用率過高的檔案或目錄,然後進行相應的清理操作。

  • 通過重新格式化磁碟,以增加Inode的數量

    如果不允許清理磁碟中的檔案,或者在清理可清理檔案後Inode使用率仍然較高,則需要通過備份資料、重新格式化磁碟以增加Inode數量、再將資料拷回的方式,完成資料的保留並增加檔案系統的Inode數量。

    1. 執行以下命令,查詢磁碟分割格式。

      lsblk -f

      回顯結果樣本如下:

      image

      如上所示,目標磁碟的分區格式為ext4。

    2. 請根據您實際的磁碟分割格式,參考以下樣本進行操作,以實現Inode數量的增加。

      ext*檔案系統

      警告
      • 卸載檔案系統,這可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。

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

      1. 執行以下命令,以卸載檔案系統。 本樣本以卸載/mnt/device_vdc為例,請您根據實際情況進行操作。

        sudo umount /mnt/device_vdc
      2. 執行以下命令,以重建立立檔案系統並增加Inode節點的數量。

        本樣本以磁碟分割為/dev/vdc、檔案系統類型為ext4、Inode節點數為163,840為例,請您根據實際情況進行操作。

        sudo mkfs.ext4 /dev/vdc -N 163840
        說明

        在Linux系統中,對於ext*分區格式的Inode數量通常是根據磁碟容量大小產生的,通常採用1:16KB的比例。例如,以40GB雲端硬碟為例,其Inode節點數通常為2,621,440,而其支援的最大值為2^32(約為43億)。您可以根據實際的雲端硬碟容量大小乘以一定的放大係數(例如1.2)來選擇適合您業務需求的Inode值。

      3. 執行以下命令,以重新掛載目錄。本樣本以將/dev/vdc裝置掛載至/mnt/device_vdc/目錄為例,請您根據實際情況進行操作。

        sudo mount /dev/vdc1 /mnt/device_vdc/
      4. (可選)執行以下命令,查看並確認修改後的Inode節點數。

        df -i

        系統顯示如下資訊,表明Inode數量調整成功,您可以繼續拷貝備份資料,以恢複相關資料或應用。

        image

      xfs檔案系統

      警告
      • 卸載檔案系統,這可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。

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

      1. 執行以下命令,以卸載檔案系統。 本樣本以卸載/mnt/device_vdc為例,請您根據實際情況進行操作。

        sudo umount /mnt/device_vdc
      2. 執行以下命令,以重建立立檔案系統並增加Inode節點的數量。

        本樣本以磁碟分割為/dev/vdc、檔案系統類型為xfs、將預設maxpct=25改為40為例,請您根據實際情況進行操作。

        sudo mkfs.xfs -f -i maxpct=40 /dev/vdc
        說明

        在Linux系統中,xfs分區格式的Inode數量通常是根據磁碟容量大小產生的,受磁碟容量和maxpct參數的共同影響。預設情況下,容量在1TB以下的檔案系統Inode比例為25%,容量在50TB以下的檔案系統比例為5%,而超過50TB的檔案系統比例則為1%。您可以根據實際需求選擇適合您業務的Inode值。

      3. 執行以下命令,以重新掛載目錄。本樣本將/dev/vdc裝置掛載在/mnt/device_vdc/目錄,請您根據實際情況進行操作。

        sudo mount /dev/vdc /mnt/device_vdc/
      4. (可選)執行以下命令,查看並確認修改後的Inode節點數。

        df -i

        系統顯示類似如下資訊,表示Inode數調整成功,您可以繼續拷貝備份資料,以恢複相關資料或應用。

        image

存在殭屍檔案

如果磁碟分割容量和Inode容量均正常,可能是系統中存在大量已被刪除(顯示為deleted)的檔案,這些檔案仍被系統內進程佔用,導致系統無法釋放相應的磁碟空間。由於這些檔案已被標記為刪除,通過dfdu命令無法進行統計。如果殭屍檔案數量過多,將佔用較大的磁碟空間。您可以參考以下步驟以查看並刪除殭屍檔案。

排查方法

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

    Alibaba Cloud Linux、CentOS

    sudo yum install -y lsof

    Debian、Ubuntu

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

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

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

解決方案

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

  • 重啟伺服器清除

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

    警告

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

  • 通過kill命令清除

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

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

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

      kill <進程號>
      警告

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

掛載點被覆蓋

在排除了上述三個原因後,如果仍無法確定磁碟空間不足的原因,可能是由於掛載點被覆蓋所導致。您可以通過以下方法進行確認。

排查方法

  1. 運行以下命令,查看掛載資訊。

    mount

    回顯資訊如下所示。

    image

    可以看到有兩個裝置被掛載到了/mnt/device_vdc目錄下,所以該目錄可能存在掛載點覆蓋。

  2. 運行以下命令,查看當前分區掛載資訊。

    df -h

    回顯結果樣本如下,

    image

解決方案

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

運行以下命令,卸載檔案系統。 本樣本以卸載/mnt/device_vdc為例,請您根據實際情況進行操作。

警告

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

sudo umount /mnt/device_vdc

取消磁碟分割的掛載後,需檢查原掛載目錄下的空間佔用情況,並根據具體情況採取相應的處置方案。

inotify watches達到上限

如果您在使用如tail -f命令時遇到類似tail: cannot watch '...': No space left on device的報錯,說明您的系統存在inotify watches達到上限的情況,您可以通過提高系統的inotify watches上限來規避這個問題。

排查方法

執行以下命令,查看inotify watches當前的上限值。

cat /proc/sys/fs/inotify/max_user_watches

解決方案

執行以下命令,修改inotify watches的上限值。

sudo sysctl fs.inotify.max_user_watches=<新的上限值>

<新的上限值>替換為您希望設定的新的inotify watches上限值。

說明

提升該上限值可能導致inotify佔用更多系統記憶體。因此,在修改上限值之前,請仔細考慮系統的記憶體和效能情況以及可能產生的影響。您可以執行man 7 inotify命令瞭解更多關於inotify watches和相關設定的詳細資料。

相關文檔

如果您的磁碟空間經常不足或資料存放區需求急劇增加,建議根據業務情況對儲存方案進行最佳化。有關詳細資料,請參見以下最佳化建議。

  • 如果您的磁碟空間儲存大量的圖片、視頻等檔案,且沒有高並發讀寫的情況,可以考慮使用Object Storage Service。OSS是一款海量、安全、低成本、高可靠的雲端儲存體服務,可以根據資料量的增加自動擴充儲存空間,無需手動擴容。您可以使用ossfs將OSS Bucket掛載到ECS執行個體上,應用程式無需修改代碼即可像操作本地檔案一樣操作OSS中的檔案。具體操作,請參見使用ossfs將OSS Bucket掛載到Linux系統的本地目錄

  • 如果您的業務情境對高並發讀寫和共用有要求,可以考慮使用Apsara File Storage NAS來隱藏檔。NAS提供了簡單的可擴充檔案儲存體以供與ECS配合使用,可提供高效能、高並發的共用儲存服務,可以根據資料量的增加自動擴充儲存空間,無需手動擴容。詳細操作,請參見NAS 快速入門(Linux)

  • 如果您在磁碟中儲存了大量記錄檔,可以考慮將日誌儲存到Log ServiceSLS,便於查詢日誌的同時,減少磁碟佔用。詳細操作,請參見Log Service_快速入門