磁碟寫滿快速排查與解決

Mr-houzi發表於2021-03-18

磁碟寫滿快速排查與解決

問題引子

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 318 10:13 test20210101.log
-rw-r--r-- 1 www www        0 318 10:13 test20210102.log
-rw-r--r-- 1 www www        0 318 10:13 test20210103.log
-rw-r--r-- 1 www www        0 318 10:13 test20210104.log
-rw-r--r-- 1 www www        0 318 10:13 test20210201.log
-rw-r--r-- 1 www www        0 318 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 協議》,轉載必須註明作者和本文連結

相關文章