Site icon Mr. 沙先生

Filebeat harvester 的 file handler close 與 clean 機制

自從用 Filebeat 後發現在系統中常常被 logrotate 掉的檔案還存在系統中,即使已經刪除了,但還是會被 Filebeat 抓住不放掉,導致硬碟常常爆滿。

要檢查是否有被 Filebeat 抓住被刪除的檔案,可以用 lsof 去查看

$ lsof | grep filebeat

如果看到類似以下訊息,尤其是最後有出現 (deleted) 的話,恭喜你刪除的檔案依然被 Filebeat 抓著不放,所以硬碟空間並沒有被釋放掉。

filebeat 8442 filebeat 29u REG 253,17 3926560 0 1499 /var/log/apache2/access.log (deleted)

這個問題其實在 elastic 有蠻多人提出來的:

然後你的硬碟就會呈現飛高高的狀態,一直下不來。

如果重啟 Filebeat 服務,就會發現硬碟空間瞬間被釋放掉 XDD …

Harvester Close

其實原因就是 Filebeat harvester 並不知道什麼時候該放掉你的檔案,在官方文件中有談到 close_* 參數是有關於 Filebeat 如何放掉檔案的參數

可以從每一個參數的特性去調整不同的 Log 性質,減少 harvester 佔用的系統資源,在我的環境多是以 Web 為主的服務,我的設定提供參考:

close_inactive: 5m
close_renamed: true
close_removed: true
close_eof: false
close_timeout: 3600

Harvester Clean

Harvester 的採集依據主要是以 registry 作為記錄每個檔案採集到的位置,registry 會記錄每個檔案的狀態,如果 Clean 設定不當,則有可能造成:

除非你要採集的 Log 檔案多到炸掉,否則 registry 的問題比較小,但在這裡也了解一下 clean_* 的參數意義:

如果沒有特殊狀況,clean 的參數可以保持預設即可。

參考資料:

Exit mobile version