今天下班某電商技術部leader發現個問題,說他們服務器硬盤滿了。把日志文件都刪掉了,可硬盤空間依舊滿。於是df -h查看了下各個掛載點的狀況(如下圖)。
/dev/sda3占用了100%,那么我們du -s -h ./*看下目錄的占用情況(如下圖)。
在工作中,我們也許會遇到這樣的問題,發現某個磁盤空間快滿了,於是,找到一些無用的大文件將其刪除后,發現磁盤空間還是沒有釋放掉,這是什么原因呢?如何解決呢?下面來重現一下整個過程:
查看磁盤空間情況
[@74.114 var]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 9.7G 284M 8.9G 4% /
/dev/xvda1 251M 13M 226M 6% /boot
none 1.1G 0 1.1G 0% /dev/shm
/dev/xvda10 97G 60G 33G 65% /home
/dev/xvda3 3.9G 2.7G 1.1G 72% /usr
/dev/xvda5 3.9G 3.6G 77M 98% /var
var分區快滿了,找到大文件,並刪除
[@74.114 var]# cd /var
[@74.114 var]# du –sh *
3.3G account
111M cache
53M log
0 mail
156K run
344K spool
…
[@74.114 var]# rm –rf account/*
df –h 看一下,卻依然是/var 為98%,一點都沒釋放。
[@74.114 var]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 9.7G 284M 8.9G 4% /
/dev/xvda1 251M 13M 226M 6% /boot
none 1.1G 0 1.1G 0% /dev/shm
/dev/xvda10 97G 60G 33G 65% /home
/dev/xvda3 3.9G 2.7G 1.1G 72% /usr
/dev/xvda5 3.9G 3.6G 77M 98% /var
但du –sh * 卻顯示沒有大文件了
[@74.114 ~]# cd /var && du –sh *
120K account
111M cache
53M log
0 mail
156K run
344K spool
…
猜想1:應該是刪除的內容依然被進程占用,內存沒釋放,所以用lsof |grep – I deleted 看了一下,發現如下:
[@74.114 account]# lsof |grep -i deleted
listserve 4833 blty 0u CHR 136,2 4 /dev/pts/2 (deleted)
listserve 4833 blty 1u CHR 136,2 4 /dev/pts/2 (deleted)
listserve 4833 blty 2u CHR 136,2 4 /dev/pts/2 (deleted)
Billing_P 16989 blty 0u CHR 136,0 2 /dev/pts/0 (deleted)
Billing_P 16989 blty 1u CHR 136,0 2 /dev/pts/0 (deleted)
Billing_P 16989 blty 2u CHR 136,0 2 /dev/pts/0 (deleted)
Billing_P 16990 blty 0u CHR 136,0 2 /dev/pts/0 (deleted)
Billing_P 16990 blty 1u CHR 136,0 2 /dev/pts/0 (deleted)
Billing_P 16990 blty 2u CHR 136,0 2 /dev/pts/0 (deleted)
發現時billing程序占用沒釋放,所以聯系項目經理將Billing_P停掉,重啟,依然沒有釋放任何空間。無果
猜想2:刪除的文件是accout目錄下的pacct文件,應該是由psacct產生和管理,重啟這個程序后是否會OK呢?解決
[@74.114 account]# /etc/init.d/psacct restart
最后看一下磁盤空間,磁盤空間釋放鳥~~
[@74.114 var]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 9.7G 284M 8.9G 4% /
/dev/xvda1 251M 13M 226M 6% /boot
none 1.1G 0 1.1G 0% /dev/shm
/dev/xvda10 97G 60G 33G 65% /home
/dev/xvda3 3.9G 2.7G 1.1G 72% /usr
/dev/xvda5 3.9G 100M 3.6M 4% /var
小建議:
以后處理相關問題時,如果發現du 和df 大小不一致的情況,可以通過lsof 查看,也許可以找到一些出現問題的原因,如果還是找不到問題,在允許的情況下不妨試一下重啟服務,也許問題就迎刃而解了。
重啟服務得不到解決的情況下,可以通過卸載磁盤分區來試着解決。
在決定刪除某些文件前,最好確定好這個文件被哪些服務使用,先停掉這些服務再刪除,這樣就很少出現空間釋放不了的情況了
linux磁盤掛載點目錄占用情況(圖)
掛載點下的目錄之和遠小於4.5G,那么是什么占用了硬盤呢?
以下為該問題的解答:
在apache/tomcat服務在運行狀態下,清空了運行服務的日志,從而導致了/dev/sda3 滿了的問題。一般情況下,大多數服務(包括腳本)在運行時,是不能刪除當前正在寫入的日志文件的。
原理分析:
(寫的不甚詳細,不明白的大家再google下。)
解決方法:
重啟該日志文件的相關服務或程序,如:為apache日志文件則重啟apache(如下圖,重啟后才硬盤空間占用正常)。