你是否碰看過 Linux 環境下,檔案已經刪除,但空間未被釋放的情況?這篇小文就會介紹一下,這種問題的一個場景,以及對應的解決方案。
我們的一台應用程式伺服器,作業系統是Red Hat Linux,監控警報,/opt/applog檔案系統使用率超閾值,整體容量為50G,但發現實際檔案容量20G,剩下的30G空間是什麼?
我們知道,Linux 環境下,任何事物,都是以文件的形式存在,系統在後台,為每個應用程序,分配了一個文件描述符,他為應用程式和作業系統之間的交互操作提供了通用的接口,既然是文件,就會佔用空間,此時可以使用lsof 指令,他可以列出,當前系統正在打開的文件。
>lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ... filebeat 111442 app 1r REG 253,3 209715229 1040407 /opt/applog/E.20171016.info.012.log filebeat 111442 app 2r REG 253,3 209715254 385080 /opt/applog/E.20171015.info.001.log (deleted) ...
表頭各字段,意義如下:
COMMAND:進程的名稱
PID:進程識別碼
USER:進程擁有者
FD:檔案描述符,應用程式透過檔案描述符識別該檔案。如cwd、txt等
TYPE:檔案類型,如DIR、REG等
DEVICE:指定磁碟的名稱
SIZE:檔案的大小
NODE:索引節點(檔案在磁碟上的標識)
NAME:開啟檔案的確切名稱
可以看出,有些行中,NAME標識了(deleted)
/opt/applog/E.20171015.info.001.log (deleted)
#他的意義,就是這檔案已被刪除,但開啟檔案的句柄,並未關閉,再看COMMAND 的名稱是filebeat,USER 進程擁有者是app,這是我們的記錄程序,app 使用者開啟了filebeat 進程。
插播一下日誌擷取平台
傳統的開源日誌平台,即 ELK,由 ElasticSearch、Logstash 和 Kiabana 三個開源工具組成,其中:
常見的部署圖,如下所示
#對於上面提到的 filebeat 又是什麼?和 ELK 有什麼關聯?
知乎上有一段大牛饒琛琳的介紹(《ELKstack 權威指南》作者),非常精闢,引自 https://www.zhihu.com/question/54058964/answer/137882919
#因為 logstash 是 jvm 跑的,資源消耗比較大,所以後來作者又用 golang 寫了一個功能較少但是資源消耗也小的輕量級的 logstash-forwarder。不過作者只是一個人,加入 #簡單來講,filebeat 就是日誌擷取的進程 agent,負責擷取應用程式日誌檔案。 對於我上面的這個問題,之所以有大量的(deleted),未釋放文件句柄,還有個背景,就是由於磁碟空間非常有限,臨時加了任務,每小時刪除12小時前的日誌,換句話說,定時任務會自動刪除此時filebeat 正在開啟的一些文件,於是這些文件,就變為了未釋放的文件,因此實際文件刪除了,但空間未被釋放。 解決方案1: #為了迅速釋放空間佔用,最直接的方法,就是 kill -9 filebeat 進程,此時空間會釋放。但不是從根本解決,定時任務還會刪除這些,filebeat 開啟的文件,導致空間滿。 解決方案2: 即如果一個檔案在某個時間段內沒有發生過更新,則關閉監控的檔案handle,預設1小時。
force_close_files: true
#
filebeat 的設定檔 filebeat.yml,其實有兩個參數:
說明:Close older closes the file handler for which were not modified for longer then close_older. Time strings like 2h (2 hours), 5m (5 minutes) can be used.
即當檔案名稱有變化時,包括改名和刪除,會自動關閉一個檔案。
說明:This option closes a file, as soon as the file name changes. This config option is recommended on windows only. Filebeat keeps the files it's reading open. This canly cause ues whues whle ues ” the file will not be fully removed until also Filebeat closes the reading. Filebeat closes the file handler after ignore_older. During this time no new file with the same name can be created. Turning this time no new file with the same name can be created. Turning this loss on file with the same name can be created. Turning this. rotate files. It can happen that after file rotation the beginning of the new file is skipped, as the reading starts at the end. We recommend to leave this option on false but lower the ignore_older value release
以上是為什麼刪除檔案後空間不會釋放?的詳細內容。更多資訊請關注PHP中文網其他相關文章!