本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
通常情況下,您的Linux實例所擁有的磁盤空間是有限的。如果您的應用服務部署在Linux實例上,隨著應用服務的持續運行和存儲文件的不斷增加,磁盤剩余空間將逐漸減少。當您的磁盤空間不足時,服務將無法繼續將文件寫入磁盤,從而可能導致服務異常。本文介紹判斷磁盤空間不足的方法及其相應的解決方案。
問題現象
在Linux系統的云服務器ECS實例中創建文件或運行應用時,如出現No space left on device
的錯誤提示,這表明您的磁盤空間已不足。此時,您需排查導致磁盤空間不足的原因,并根據具體情況采取相應措施以解決磁盤不足的問題。
可能原因
磁盤空間不足的問題通常有以下幾類原因:
磁盤分區空間使用率達到100%。
磁盤分區Inode使用率達到100%。
磁盤存在已刪除未釋放的僵尸文件。
說明已刪除的文件可能由于在刪除之前其文件句柄處于打開狀態,從而導致在文件刪除時未能釋放文件空間。
掛載點被覆蓋。
說明如果原有文件系統的目錄下已經存在大量文件,在該掛載點(目錄)掛載新設備后,原掛載點將被覆蓋。然而,您系統內的應用可能仍會繼續對原有文件系統空間進行讀寫操作,此時可能會出現您的應用報告空間不足的情況,然而在使用
df
或du
命令查看磁盤文件目錄的容量使用情況時卻無法反映出這一點。這是因為df
或du
命令統計的是當前掛載點所對應的分區的使用情況。inotify watches達到上限。
說明inotify是Linux系統中一種監控文件系統事件的機制,廣泛應用于實時監控文件系統中的文件變化。該錯誤實際上與磁盤空間無關,并不表示磁盤存儲空間已滿。本文檔對這一報錯進行了補充說明,以便幫助您排查并解決該問題。
排查方法和解決方案
出現No space left on device
錯誤提示的原因有多種,請根據具體問題的原因進行相應處理。
以下排查方法和解決方案需要遠程連接到需要安裝的ECS實例。具體操作,請參見使用Workbench工具以SSH協議登錄Linux實例。
在以下操作中,如需通過刪除文件來釋放磁盤空間,請務必在刪除之前確認該文件已不再需要,以防止因刪除文件導致的數據丟失或對您的業務產生不利影響。建議在手動刪除文件之前進行磁盤備份,您可以選擇自行拷貝文件,或通過快照方式進行數據備份。關于如何創建快照,請參見創建快照。
磁盤分區空間使用率達到100%
排查方法
檢查磁盤的當前使用率,并識別高占用的文件。
執行以下命令,查看磁盤使用率。
df -h
回顯信息如下所示。示例中分區
/dev/vda3
的使用率達到100%。執行以下命令,進入根目錄,查看哪個目錄占用磁盤空間較大。
sudo du -sh /* | sort -rh | head -n 10
回顯信息如下所示。從圖示中可以看出,
/home
目錄占用空間最大,因此需要繼續查看/home
目錄下哪個文件或目錄占用空間較大。請您根據實際情況進行操作。執行以下命令,逐級查看哪個目錄占用磁盤空間較大。
例如在本示例中,進入較大的
/home
目錄,繼續查看/home
目錄下哪個文件或目錄較大。sudo du -sh /home/* | sort -rh | head -n 10
回顯信息如下所示。從圖示可以看出,
ecs-user
目錄占用了最大的存儲空間,因此需要進一步檢查ecs-user目錄下的具體文件或子目錄,以確定哪些項占用了較大空間。以此類推,最終定位到在
/home/ecs-user/
目錄下有無效的可刪除的大文件。
解決方案
請您根據業務場景及實際情況進行判斷,并采取相應措施。
磁盤分區Inode使用率達到100%
磁盤分區Inode是文件系統中的一個重要概念,文件系統內每個文件和目錄都由一個唯一的Inode標識。每個磁盤分區在格式化時會預分配一定數量的Inodes,但是如果文件系統中存在大量小文件或目錄,Inode資源也可能成為系統資源的瓶頸。當所有Inodes都被分配完畢,即使磁盤還有剩余空間,也無法再創建新的文件或目錄。此時,需要清理不必要的文件以釋放Inode,或者增加Inode數量來解決磁盤分區Inode使用率達到100%的問題。
排查方法
執行以下命令,查詢Inode使用率。
df -i
解決方案
如果Inode使用率達到或者接近100%,可以通過以下兩種方式進行處理:
如果不方便格式化磁盤以增加Inode數量,可以參考以下步驟,清理Inode占用量高的文件或者目錄。
執行以下命令,分析根目錄下的每個二級目錄有多少個文件。
for i in /*; do echo $i; sudo find $i | wc -l; done
系統顯示類似如下信息。圖示例可以看出
/mnt
目錄下的文件數最多,因此需要繼續查看/mnt
目錄下哪個目錄文件數最多,文件數越多說明Inode占用越高。請您根據實際情況進行操作。執行以下命令,以查看本示例中
Inode
使用率最高的/mnt
目錄下哪個文件或目錄的Inode
使用率較高。以此類推,最終定位
Inode
使用率過高的文件或目錄,然后進行相應的清理操作。
如果不允許清理磁盤中的文件,或者在清理可清理文件后
Inode
使用率仍然較高,則需要通過備份數據、重新格式化磁盤以增加Inode數量、再將數據拷回的方式,完成數據的保留并增加文件系統的Inode數量。執行以下命令,查詢磁盤分區格式。
lsblk -f
回顯結果示例如下:
如上所示,目標磁盤的分區格式為ext4。
請根據您實際的磁盤分區格式,參考以下示例進行操作,以實現
Inode
數量的增加。ext*文件系統
警告卸載文件系統,這可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。
重新格式化磁盤時磁盤內的數據將被刪除,請確保數據已經得到有效備份后,再進行以下操作。您可以自行拷貝文件,也可以通過快照方式進行數據備份,創建快照的具體操作請參見創建快照。
執行以下命令,以卸載文件系統。 本示例以卸載
/mnt/device_vdc
為例,請您根據實際情況進行操作。sudo umount /mnt/device_vdc
執行以下命令,以重新建立文件系統并增加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值。
執行以下命令,以重新掛載目錄。本示例以將
/dev/vdc
設備掛載至/mnt/device_vdc/
目錄為例,請您根據實際情況進行操作。sudo mount /dev/vdc1 /mnt/device_vdc/
(可選)執行以下命令,查看并確認修改后的Inode節點數。
df -i
系統顯示如下信息,表明Inode數量調整成功,您可以繼續拷貝備份數據,以恢復相關數據或應用。
xfs文件系統
警告卸載文件系統,這可能會導致您的應用服務中斷,請選擇您業務合適的時間進行。
重新格式化磁盤時磁盤內的數據將被刪除,請確保數據已經得到有效備份后,再進行以下操作。您可以自行拷貝文件,也可以通過快照方式進行數據備份,創建快照的具體操作請參見創建快照。
執行以下命令,以卸載文件系統。 本示例以卸載
/mnt/device_vdc
為例,請您根據實際情況進行操作。sudo umount /mnt/device_vdc
執行以下命令,以重新建立文件系統并增加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值。
執行以下命令,以重新掛載目錄。本示例將/dev/vdc設備掛載在/mnt/device_vdc/目錄,請您根據實際情況進行操作。
sudo mount /dev/vdc /mnt/device_vdc/
(可選)執行以下命令,查看并確認修改后的Inode節點數。
df -i
系統顯示類似如下信息,表示Inode數調整成功,您可以繼續拷貝備份數據,以恢復相關數據或應用。
存在僵尸文件
如果磁盤分區容量和Inode容量均正常,可能是系統中存在大量已被刪除(顯示為deleted
)的文件,這些文件仍被系統內進程占用,導致系統無法釋放相應的磁盤空間。由于這些文件已被標記為刪除,通過df
或du
命令無法進行統計。如果僵尸文件數量過多,將占用較大的磁盤空間。您可以參考以下步驟以查看并刪除僵尸文件。
排查方法
如果系統沒有預裝lsof,選擇以下合適命令,安裝lsof。
Alibaba Cloud Linux、CentOS
sudo yum install -y lsof
Debian、Ubuntu
sudo apt install -y lsof
執行以下命令,查看僵尸文件占用情況。
sudo lsof | grep delete | sort -k7 -rn | more
系統顯示類似如下信息,其中第7列為對應文件的大小(單位為Byte),您可以將第七列值累加起來看總文件大小和您非預期的磁盤使用空間是否接近,接近即為僵尸文件占用了您磁盤空間。
解決方案
如果存在僵尸文件,可通過以下兩種方式釋放句柄清除僵尸文件,以釋放磁盤空間。
重啟服務器清除
重啟服務器,系統會退出現有的進程,釋放調用的deleted文件的句柄。
警告重啟服務器可能會影響業務,請您選擇合適時間進行重啟。
通過kill命令清除
根據
lsof
命令列出的PID進程號(通常為第二列),使用kill
命令結束占用這些文件的服務進程。執行以下命令,列出PID進程號。
lsof | grep delete
根據您的業務情況,確保對應進程可以停止或者重啟,執行以下命令,停止占用這些文件的服務進程。
kill <進程號>
警告如果服務器正在運行業務,可能會影響到業務,請慎重操作。
掛載點被覆蓋
在排除了上述三個原因后,如果仍無法確定磁盤空間不足的原因,可能是由于掛載點被覆蓋所導致。您可以通過以下方法進行確認。
排查方法
運行以下命令,查看掛載信息。
mount
回顯信息如下所示。
可以看到有兩個設備被掛載到了/mnt/device_vdc目錄下,所以該目錄可能存在掛載點覆蓋。
運行以下命令,查看當前分區掛載信息。
df -h
回顯結果示例如下,
解決方案
解決掛載點被覆蓋的問題,通常通過先取消磁盤分區掛載,再檢查原掛載目錄下的空間占用情況。
運行以下命令,卸載文件系統。 本示例以卸載/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和相關設置的詳細信息。
相關文檔
如果您的磁盤空間經常不足或數據存儲需求急劇增加,建議根據業務情況對存儲方案進行優化。有關詳細信息,請參見以下優化建議。
如果您的磁盤空間存儲大量的圖片、視頻等文件,且沒有高并發讀寫的情況,可以考慮使用對象存儲OSS。OSS是一款海量、安全、低成本、高可靠的云存儲服務,可以根據數據量的增加自動擴展存儲空間,無需手動擴容。您可以使用ossfs將OSS Bucket掛載到ECS實例上,應用程序無需修改代碼即可像操作本地文件一樣操作OSS中的文件。具體操作,請參見使用ossfs將OSS Bucket掛載到Linux系統的本地目錄。
如果您的業務場景對高并發讀寫和共享有要求,可以考慮使用文件存儲NAS來存儲文件。NAS提供了簡單的可擴展文件存儲以供與ECS配合使用,可提供高性能、高并發的共享存儲服務,可以根據數據量的增加自動擴展存儲空間,無需手動擴容。詳細操作,請參見NAS 快速入門(Linux)。
如果您在磁盤中存儲了大量日志文件,可以考慮將日志存儲到日志服務SLS,便于查詢日志的同時,減少磁盤占用。詳細操作,請參見日志服務_快速入門。