Filebeat占用文件句柄

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filebeat占用文件句柄相关的知识,希望对你有一定的参考价值。

参考技术A

平台使用整套的ELK日志框架:服务写本地文件日志,由Filebeat监控本地日志,并写入ES。
本地Filebeat配置如下:

问题:文件句柄占用,导致磁盘无法释放。重启Filebeat后可清理掉占用的磁盘。

收到问题后,感觉是一个很常见的问题,就直接百度了一下,果然是一下就有很多的线索。结合一些帖子,对现有服务器做了排查,如下:

这里有两个问题:

可设置:
close_older:1h
force_close_files:false
由于目前服务日志滚动的频率不是很高,文件更名后,1h左右不会被删除。所以可以尝试使用close_older配置在文件删除之前释放句柄。

=====================
2019/7/17更新:
调研后发现,close_older的默认值就是1h,所以该方案不会让原本的问题变得更好。

虽然问题可能会被解决,但对Filebeat还不够理解,并且上述提出的两个问题,没有很好的解答。因此,我继续对Filebeat做进一步的学习和实验。

资料链接: https://www.jianshu.com/p/6282b04fe06a
Filebeat主要组件:prospector和harvester,如图:

filebeat保持文件状态:

filebeat保证至少一次交付:
每次交付会有状态,对端需要ACK确认。

注意:
Filebeat的至少一次交付保证包括日志轮换和删除旧文件的限制。如果将日志文件写入磁盘并且写入速度超过Filebeat可以处理的速度,或者在输出不可用时删除了文件,则可能会丢失数据。
在Linux上,Filebeat也可能因inode重用而跳过行。有关inode重用问题的更多详细信息,请参阅filebeat常见问题解答。(后续遇到的话,继续研究,本次略过)

首先看一下close_renamed的解释:
close_renamed
Only use this option if you understand that data loss is a potential side effect.
When this option is enabled, Filebeat closes the file handler when a file is renamed. This happens, for example, when rotating files. By default, the harvester stays open and keeps reading the file because the file handler does not depend on the file name. If the close_renamedoption is enabled and the file is renamed or moved in such a way that it’s no longer matched by the file patterns specified for the , the file will not be picked up again. Filebeat will not finish reading the file.
WINDOWS: If your Windows log rotation system shows errors because it can’t rotate the files, you should enable this option.
经过测试后发现,采用filebeat监听一个文本文件,通过mv将文件更改,close_renamed是管用的,但通过rm删除文件,close_renamed是不管用的。

结论:未重现生产环境的现象。

阶段性结论:升级生产环境filebeat版本后,检查问题是否解决。

后续研究:

close_inactive
启用此选项时,如果文件在指定的持续时间内没有更新,Filebeat会关闭文件句柄。如果关闭的文件再次发生变化,则会启动一台新的harvester,并在scan_frequency过去后采集最新的更改。建议将close_inactive设置为大于日志文件两次更新间隔时间的最大值。例如,如果日志文件每隔几秒更新一次,则可以安全地将close_inactive设置为1m。如果有更新频率非常不同的日志文件,则可以使用具有不同值的多个prospectors配置。将close_inactive设置为较低的值意味着文件句柄会更快关闭。但是,这具有副作用,即如果harvester关闭,则不会实时发送新的日志行。关闭文件的时间戳不取决于文件的修改时间,关闭文件的时间戳为修改文件的时间+close_inactive。例如,如果close_inactive设置为5分钟,那么在收割机读取文件的最后一行之后,5分钟的倒计时开始。您可以使用时间字符串,如2h(2小时)和5m(5分钟)。默认值是5m。

scan_frequency
指定扫描指定路径目录下是否有新的文件产生。例如,指定1以尽可能频繁地扫描目录,而不会导致Filebeat过于频繁地扫描。我们不建议将此值设置为<1秒。
如果您需要近实时发送日志行,请勿使用非常低的scan_frequency,但应调整close_inactive,以便文件处理程序保持打开状态并持续轮询您的文件。
默认设置是10秒。
注意区分backoff

总结filebeat进程写满磁盘的情况处理


采用filebeat收集日志,日志文件频繁rotate,造成filebeat占用文件不释放,只要filebeat保持着被删除文件Open状态,操作系统就不释放磁盘空间,导致可用磁盘空间逐渐减小。

使用lsof命令查看filebeat保持着的文件资源,可以发现许多被filebeat占用空间的失效文件(deleted)文件。


技术分享图片

deleted状态的文件没有释放,始终占据磁盘空间


解决办法:

查看filebeat配置文件位置: /etc/filebeat/filebeat.yml

技术分享图片

在配置文件中添加close_timeout: 5m,保证每隔5分钟file handler被关闭,不管是否遇到EOF符号。

需要注意的是,该close_timeout参数在Filebeat没有处理到文件末尾而文件被删除的情况下,会导致数据丢失。

filebeat.prospectors:
- type: log
?? paths:
??? - /opt/apps/ecm/service/storm/1.0.1/package/apache-storm-1.0.1/logs/workers-artifacts/xyz*/*/worker.log
?? tail_files: false
?? force_close_files: true
?? close_timeout: 5m
processors:
- add_cloud_metadata: ~
output.logstash:
?? hosts: ["10.109.3.193:6667"]
?? loadbalance: true
?? worker: 1

以上是关于Filebeat占用文件句柄的主要内容,如果未能解决你的问题,请参考以下文章

FileBeat常见问题

关闭其它进程占用的文件句柄

Linux文件句柄占用数量查看与设置

强制解锁文件占用

逆向对抗技术之ring3解除文件句柄,删除文件

linux下查看系统进程占用的句柄数