程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Linux大文件已刪除,但df查看已使用的空間並未減少解決

Linux大文件已刪除,但df查看已使用的空間並未減少解決

編輯:關於PHP編程

Linux大文件已刪除,但df查看已使用的空間並未減少解決


Linux大文件已刪除,但df查看已使用的空間並未減少解決

磁盤快滿了,這時候准備去刪除一些大文件

於是我使用ncdu 查看了一下當前系統占用資源比較多的是那些文件,到源頭了,那就把它給刪除了吧,

滿心歡喜的去查看磁盤情況。

磁盤並沒有多大的變化,這是怎麼回事。

有問題不可怕,干淨找baidu/google,找到原因了,說是雖然刪除了,但是沒有釋放資源。

從網上找了一些資料:

執行 lsof | grep deleted我發現有大量剛剛刪除文件的進程存在,果斷給他kill 掉。但是可能會造成一些影響,比如說一下正在寫的文件,之前那樣刪除的方法就是不對的。


1、錯誤現象

運維的監控系統發來通知,報告一台服務器空間滿了,登陸服務器查看,根分區確實沒有空間了,如下圖所示:

這 裡首先說明一下服務器的一些刪除策略,由於Linux沒有回收站功能,我們的線上服務器所有要刪除的文件都會首先移動到系統/tmp目錄下,然後定期清除/tmp目錄下的數據。這個策略本身沒有問題,但是通過檢查發現這台服務器的系統分區中並沒有單獨劃分/tmp分區,這樣/tmp下的數據其實是占用了根 分區的空間。既然找到了問題,那麼刪除/tmp目錄下一些大數據即可,執行如下命令,檢查/tmp下最大的三個數據文件,如下圖所示:

1234[root@localhost~]#du-s/tmp/*|sort-nr|head-369206016/tmp/access_log36/tmp/hsperfdata_root36/tmp/hsperfdata_mapred

通過命令輸出發現在/tmp目錄下有個66G大小的文件access_log,這個文件應該是apache產生的訪問日志文件,從日志大小來看,應該是很久沒有清理apache日志文件了,基本判定是這個文件導致的根空間爆滿,在確認此文件可以刪除後,執行如下刪除操作:

[root@localhost ~]# rm /tmp/access_log

接著查看系統根分區空間是否釋放,如下圖所示:

從輸出可以看到,根分區空間仍然沒有釋放,這是怎麼回事?

2、解決思路

一般說來不會出現刪除文件後空間不釋放的情況,但是也存在例外,比如文件被進程鎖定,或者有進程一直在向這個文件寫數據等等,要理解這個問題,就需要知道Linux下文件的存儲機制和存儲結構。

一個文件在文件系統中的存放分為兩個部分:數據部分和指針部分,指針位於文件系統的meta-data中,數據被刪除後,這個指針就從meta-data中清除了,而 數據部分存儲在磁盤中,數據對應的指針從meta-data中清除後,文件數據部分占用的空間就可以被覆蓋並寫入新的內容,之所以出現刪除 access_log文件後,空間還沒釋放,就是因為httpd進程還在一直向這個文件寫入內容,導致雖然刪除了access_log文件,但文件對應的指針部分由於進程鎖定,並未從meta-data中清除,而由於指針並未被刪除,那麼系統內核就認為文件並未被刪除,因此通過df命令查詢空間並未釋放也 就不足為奇了。

3、問題排查

既然有了解決問題的思路,那麼接下來看看是否有進程一直在向acess.log文件中寫數據,這裡需要用到Linux下的lsof命令,通過這個命令可以獲取一個已經被刪除但仍然被應用程序占用的文件列表,命令執行如下圖所示:

從 輸出結果可以看到,/tmp/acess.log文件被進程httpd鎖定,而httpd進程還一直向這個文件寫入日志數據,從第七列可知,這個日志文件大小僅70G,而系統根分區總大小才100G,由此可知,這個文件就是導致系統根分區空間耗盡的罪魁禍首,在最後一列的“deleted”狀態,說明這個 日志文件已經被刪除,但由於進程還在一直向此文件寫入數據,空間並未釋放。

4、解決問題

到 這裡問題就基本排查清楚了,解決這一類問題的方法有很多種,最簡單的方法是關閉或者重啟httpd進程,當然也可以重啟操作系統,不過這並不是最好的方 法,對待這種進程不停對文件寫日志的操作,要釋放文件占用的磁盤空間,最好的方法是在線清空這個文件,可以通過如下命令完成:

[root@localhost ~]# echo " " >/tmp/acess.log

通過這種方法,磁盤空間不但可以馬上釋放,也可保障進程繼續向文件寫入日志,這種方法經常用於在線清理Apache、Tomcat、Nginx等Web服務產生的日志文件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved