filebeat占用文件句柄磁盘满

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: filebeat作为日志采集客户端,相比较于java编写的fluent,有着低功耗的特性。但在一些极端情况下,忽视filebeat的一些特性配置,可能会带来灾难。之前发过一篇关于filebeat内存占用的案例和分析,今天再说下filebeat占用文件句柄、耗费主机磁盘甚至导致磁盘满的案例。


filebeat作为日志采集客户端,相比较于java编写的fluent,有着低功耗的特性。但在一些极端情况下,忽视filebeat的一些特性配置,可能会带来灾难。之前发过一篇关于filebeat内存占用的案例和分析,今天再说下filebeat占用文件句柄、耗费主机磁盘甚至导致磁盘满的案例。


案例1: 某某通信日志系统建设


案例描述:通信公司A日志量很大,需要搭建一套自己的日志管理系统,方式是基于ELK做,日志采集agent使用filebeat(5.3.2)。系统数据规模是400+esc,日增2T。主机端部署了filebeat后,12小时内所有主机触发磁盘使用率告警。排查后发现,filebeat持有大量被deleted的文件句柄不释放,把filebeat进程停掉后磁盘告警恢复,被占用的deleted文件句柄被释放。故障现象见下图:


3adee7eaa8327eaff85ce3f61e35fd2348c897b3


排查过程:

1.检查filebeat日志,发现日志里打了大量的io timeout,表明日志传输受阻,可能日志的生产速度>>采集速度;

2.检查filebeat的registry文件,发现registry里累积了超过1000+没有传输完成的文件;

3.检查所采集文件的滚动策略,约10s钟滚动切换一次,test.log->test.20180816.log;

4.发现宿主机配置crontab每分钟清理所有已被滚动不再更新的日志如test.20180816.log;


结论:

filebeat所采集的日志量大切滚动迅速,filebeat未能及时发送所采集的日志,未传输完成的日志文件的句柄被filebeat长期持有直到传输完成,如此以来原有crontab清理日志的机制失效,加上宿主机的磁盘本来就不富裕,累积一定事件后触发磁盘使用率告警。


根因分析:

默认配置下filebeat对日志的采集是贪心的,只要发现了日志就会坚持把日志采集完,否则会永久持有文件句柄不会“放手”,即使文件被删除。


解决方案:

1. 优化filebeat的配置项, 涉及到的filebeat配置项如下:


### State options

# Files for the modification data is older then clean_inactive the state from the registry is removed
# By default this is disabled.
#clean_inactive: 0

# Removes the state for file which cannot be found on disk anymore immediately
#clean_removed: true

# Close timeout closes the harvester after the predefined time.
# This is independent if the harvester did finish reading the file or not.
# By default this option is disabled.
# Note: Potential data loss. Make sure to read and understand the docs for this option.
#close_timeout: 0

# Defines if prospectors is enabled
#enabled: true


(1)close_inactive: 1m

       没有新日志采集后多长时间关闭文件句柄,默认5分钟,设置成1分钟,加快文件句柄关闭;

(2)close_timeout: 3h

       传输了3h后荏没有传输完成的话就强行关闭文件句柄,这个配置项是解决以上案例问题的key point;

       注意了,开了这个配置项旨在避免以上案例的问题,但是有丢数据的风险哦。鱼与熊掌不可兼得也。


(3)clean_inactive: 72h

        这个配置项也应该配置上,默认值是0表示不清理,不清理的意思是采集过的文件描述在registry文件里永不清理,在运行一段时间后,registry会变大,可能会带来问题。

(4)ignore_older: 70h

        设置了clean_inactive后就需要设置ignore_older,且要保证ignore_older < clean_inactive


完美收官!下期再见!



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
存储 监控 API
7.7 实现进程内存读写
内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在`Windows`系统中,内存进程读写可以通过一些`API`函数来实现,如`OpenProcess`、`ReadProcessMemory`和`WriteProcessMemory`等。这些函数提供了一种通用的方式来访问其他进程的内存,并且可以用来读取或写入不同类型的数据,例如整数、字节集、浮点数等。在开始编写内存读者功能之前我们先来实现一个获取特定进程内特定模块基址的功能,该功能的实现分为两部分首先我们封装一个`GetProcessModuleHandle`函数
104 0
|
5月前
Linxu查看进程内存占用
Linxu查看进程内存占用
43 2
|
3月前
|
索引
Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
【7月更文挑战第2天】Elasticsearch 查看磁盘占用 查看指定索引磁盘占用
|
4月前
|
Linux
linux查看磁盘容量和清理磁盘
linux查看磁盘容量和清理磁盘
37 5
|
4月前
|
存储 固态存储 文件存储
磁盘文件的读写是怎样进行的
深入理解磁盘文件读写操作
|
缓存 C++
谁是磁盘空间占用大户?
谁是磁盘空间占用大户?
|
监控 Shell Linux
Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
Shell - 监控某个进程的内存占用情况、主机CPU、磁盘空间等信息以及守护进程
280 0
|
关系型数据库 MySQL Linux
Linux 查看磁盘 查看磁盘IO并找出占用 并找出占用IO读写很高的进程
Linux 查看磁盘 查看磁盘IO并找出占用 并找出占用IO读写很高的进程
513 0
Linux 查看磁盘 查看磁盘IO并找出占用 并找出占用IO读写很高的进程
|
Web App开发 消息中间件 监控
日志量巨大时filebeat占用文件句柄导致磁盘被打满
生产环境日志收集集群的一次优化经历
6481 0
filebeat实践-内存占用-最大内存占用
filebeat作为日志采集agent, 是需要部署到生产服务器上的.不理解filebeat的工作机制,不了解filebeat在实际生产使用中的内存使用将会给你带来意想不到的麻烦.
10507 1