磁碟寫滿快速排查與解決
問題引子
PHP 報錯如下,此問題基本可以確定是由於磁碟寫滿導致 session 不能寫入造成。
Warning: session_start(): open(/tmp/sess_rvo5pg9op1ej55vop0g72b0jeu, O_RDWR) failed: No space left on device (28)
解決寫滿問題
下面記錄一下,快速排查用到的幾個命令。
1.檢視磁碟佔用
> df -h
檔案系統 容量 已用 可用 已用% 掛載點
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 401M 3.5G 11% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 44G 44G 0 100% /
/dev/sda1 1014M 192M 823M 19% /boot
tmpfs 783M 0 783M 0% /run/user/0
可以看到根分割槽已經被寫滿,接下來要定位大檔案的位置進行清理。
2.定位大檔案位置
> du -sh *
-s 表示彙總, -h 表示以KB, MB, GB, TB格式進行人性化顯示。
0 bin
160M boot
4.3G data
0 dev
36M etc
15G home
0 lib
0 lib64
0 media
0 mnt
379M opt
0 proc
……
6.2G usr
332M var
這樣可以顯示出目錄下的檔案大小總和。然後,從根目錄開始一級一級的定位大檔案和大目錄的位置。
3.批量刪除檔案
一般磁碟寫滿都是日誌造成,日誌檔案一般以天為單位為一個記錄檔案,如下。
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210101.log
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210102.log
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210103.log
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210104.log
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210201.log
-rw-r--r-- 1 www www 0 3月 18 10:13 test20210204.log
對於這些檔案,我們要進行批量刪除。
基於檔名中的時間進行批量刪除
批量刪除2021年1月份的日誌
> ls | grep test202101 | xargs rm -f
基於檔案的修改時間(mtime)屬性進行批量刪除
批量刪除30天之前的以.log
結尾的檔案
> find ./ -type f -name "*.log" -mtime +30 -delete
rsync替換原理刪除大目錄
假設 testlog 下的大量檔案,先建立空目錄 blank,以空目錄替換 testlog ,此時 testlog 則為空。
這種方法要比 rm -rf testlogs/ 效率高。
> mkdir blank
> rsync -a --delete blank/ testlogs/
PS:
檢視某檔案或目錄屬於哪個分割槽
> df -h 目錄/檔名
本作品採用《CC 協議》,轉載必須註明作者和本文連結