Linux 下刪除了文件,空間爲什麼不釋放?

本文由高效運維社區核心成員投稿發佈
golang

做者簡介windows

劉晨服務器

網名 bisal,Oracle 技術愛好者,擁有 Oracle 10g/11g OCP、Oracle 11g OCM認證,Oracle YEP 成員,目前就任於一家央企,負責系統應用運維工做。
微信

你是否遇見過 Linux 環境下,文件已經刪除,可是空間未被釋放的狀況?這篇小文就會介紹一下,這種問題的一個場景,以及相應的解決方案。

咱們的一臺應用服務器,操做系統是 Red Hat Linux,監控報警,/opt/applog文件系統使用率超閾值,總體容量爲50G,但發現實際文件容量20G,剩下的30G空間是什麼?restful

咱們知道,Linux 環境下,任何事物,都是以文件的形式存在,系統在後臺,爲每一個應用程序,分配了一個文件描述符,他爲應用程序和操做系統之間的交互操做提供了通用的接口,既然是文件,就會佔用空間,此時可使用 lsof 指令,他能夠列出,當前系統正在打開的文件。app

>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:打開文件的確切名稱jvm

能夠看出,有一些行中,NAME標識了(deleted)分佈式

/opt/applog/E.20171015.info.001.log (deleted)ide

他的含義,就是這文件已被刪除,但打開文件的句柄,並未關閉,再看 COMMAND 的名稱是 filebeat,USER 進程全部者是 app,這是咱們的日誌採集進程,app 用戶開啓了 filebeat 進程。

插播一下日誌採集平臺

傳統的開源日誌平臺,即 ELK,由 ElasticSearch、Logstash 和 Kiabana 三個開源工具組成,其中:

  • Elasticsearch 是個開源分佈式搜索引擎,分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful 風格接口,多數據源,自動搜索負載等。

  • Logstash 是一個開源的採集工具,他能夠對日誌進行收集、過濾,並將其存儲供之後使用。

  • Kibana 是一個開源的圖形 Web 工具,能夠爲 Logstash 和 ElasticSearch 提供日誌分析友好的 Web 界面,能夠彙總、分析和搜索重要數據日誌。

常見的部署圖,以下所示

8521dcb23cf3953188ee53fd8ab35d2e.jpeg

對於上面提到的 filebeat 又是什麼?和 ELK 有什麼聯繫?

知乎上有一段大牛饒琛琳的介紹(《ELKstack 權威指南》做者),很是精闢,引自 https://www.zhihu.com/question/54058964/answer/137882919

由於 logstash 是 jvm 跑的,資源消耗比較大,因此後來做者又用 golang 寫了一個功能較少可是資源消耗也小的輕量級的 logstash-forwarder。不過做者只是一我的,加入http://elastic.co公司之後,由於 es 公司自己還收購了另外一個開源項目 packetbeat,而這個項目專門就是用 golang 的,有整個團隊,因此 es 公司乾脆把 logstash-forwarder 的開發工做也合併到同一個 golang 團隊來搞,因而新的項目就叫 filebeat 了。

04cac62aaeadbf808cd7512013de22fe.jpeg

簡單來說,filebeat 就是日誌採集的進程 agent,負責採集應用日誌文件。

對於我上面的這個問題,之因此有大量的(deleted),未釋放文件句柄,還有個背景,就是因爲磁盤空間很是有限,臨時加了任務,每小時刪除12小時前的日誌,換句話說,定時任務會自動刪除此時 filebeat 正在打開着的一些文件,因而這些文件,就變爲了未釋放的文件,所以實際文件刪除了,但空間未被釋放。

解決方案1:

爲了迅速釋放空間佔用,最直接的方法,就是 kill -9 filebeat 進程,此時空間會釋放。但並非從根本解決,定時任務還會刪除這些,filebeat 打開的文件,致使空間滿。

解決方案2:
filebeat 的配置文件 filebeat.yml,其實有兩個參數:

  • close_older: 1h
    說明: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.

即若是一個文件在某個時間段內沒有發生過更新,則關閉監控的文件handle,默認1小時。

  • force_close_files: false
    說明: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 can cause issues when the file is removed, as 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 feature on the other hand can lead to loss of data on 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 to release files faster.

即當文件名稱有變化時,包括更名和刪除,會自動關閉一個文件。

這兩個參數結合起來,根據應用需求,一個文件30分鐘內不更新,則須要關閉句柄,文件更名或刪除,須要關閉句柄

close_older: 30m
force_close_files: true

能夠知足,filebeat 採集日誌,以及定時刪除歷史文件,這兩個任務的基本要求。

若是您以爲此篇文章對您有幫助,歡迎關注微信公衆號:bisal 的我的雜貨鋪,您的支持是對我最大的鼓勵!共同窗習,共同進步:)

a21ba0ce2aad0ef796daf16e8a8e15dd.jpeg

相關文章
相關標籤/搜索