filebeat占用文件句柄磁盘满

简介: 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


完美收官!下期再见!



相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
安全 网络安全 数据安全/隐私保护
DMZ是什么?它是如何工作的?
DMZ,中文通常译为“隔离区”或“非军事化区”,是在网络安全领域中用来描述一个逻辑或物理的网络子段,这个子段通常位于组织的内部网络和外部网络(如互联网)之间。DMZ的主要目的是提供一个受限制且受控的环境,允许对外提供服务的服务器放置在此区域,从而在一定程度上保护内部网络的安全。
3702 1
|
8月前
|
Ubuntu Linux 测试技术
Linux系统离线安装Docker完整指南
本文详细介绍在Ubuntu 24等Linux系统中离线安装Docker的完整流程,适用于内网隔离环境。涵盖安装包下载、`docker.service`配置、安装与卸载脚本编写、权限设置、镜像测试及用户组配置,并包含docker-compose的离线部署方法,助力高效完成生产环境搭建。
9722 4
Linux系统离线安装Docker完整指南
|
10月前
|
Prometheus 监控 Cloud Native
测试开发必看!JVM调优10大技巧,性能瓶颈瞬间搞定
JVM调优是提升Java应用性能、稳定性的关键手段。通过优化内存配置与GC策略,在吞吐量与停顿时间间平衡,结合压测与监控工具分析指标,持续迭代优化,助力高并发系统高效运行。
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
289 1
|
存储 缓存 监控
手动清除Ubuntu系统中的内存缓存的步骤
此外,只有系统管理员或具有适当权限的用户才能执行这些命令,因为这涉及到系统级的操作。普通用户尝试执行这些操作会因权限不足而失败。
2172 22
|
存储 缓存 Java
Java性能优化: 如何减少Java程序的内存占用?
Java性能优化: 如何减少Java程序的内存占用?
2382 2
|
消息中间件 监控 Kafka
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
【8月更文挑战第13天】Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
1664 3
|
消息中间件 负载均衡 监控
RabbitMQ精讲9:镜像模式集群搭建,整合KeepAlived+HaProxy组件
RabbitMQ精讲9:镜像模式集群搭建,整合KeepAlived+HaProxy组件
1210 122
RabbitMQ精讲9:镜像模式集群搭建,整合KeepAlived+HaProxy组件
|
运维 监控 安全
系统故障排查与问题解决指南:步步为营,精准定位
【8月更文挑战第16天】系统故障排查与问题解决是一项复杂而艰巨的任务,需要运维人员具备扎实的专业知识、丰富的实践经验以及良好的沟通能力和团队合作精神。通过遵循本文提供的指南,您可以更加高效地应对系统故障挑战,保障系统的稳定运行和业务的持续发展。
1234 2