在 CentOS 上 Filebeat 占用内存过高,通常不是“内存泄漏”,而是配置或使用方式导致的。下面按常见原因 → 排查方法 → 解决建议来说明。
Filebeat 会为每个 文件 维护状态(inode、offset、harvester)。
典型场景
/var/log/** 递归匹配✅ 表现:
filebeat.registry 文件很大✅ 解决:
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/*.log
# 不要写成 /** 或递归过深
并限制:
filebeat.registry.flush: 1s
每个被读取的文件 = 1 个 harvester(goroutine)
原因
✅ 优化:
close_inactive: 5m
close_removed: true
clean_removed: true
Filebeat 默认使用内存队列。
queue.mem:
events: 4096
max_message_bytes: 10mb
✅ 如果 events 设置几万,内存直接爆
✅ 建议:
queue.mem:
events: 2048
或改用磁盘队列(更稳):
queue.disk:
path: /var/lib/filebeat/diskqueue
max_size: 10GB
Filebeat 会 缓存未发送事件
✅ 表现:
✅ 检查:
filebeat test output
✅ 解决:
bulk_max_sizeoutput.elasticsearch:
bulk_max_size: 1000
老版本(如 6.x / 早期 7.x)有已知内存问题
✅ 建议:
✅ 建议:
processorsps -eo pid,comm,rss,vsz | grep filebeat
ls -l /proc/$(pidof filebeat)/fd | wc -l
ls -lh /var/lib/filebeat/registry
filebeat -e -d "*"
filebeat.inputs:
- type: log
paths:
- /var/log/app/*.log
close_inactive: 5m
close_removed: true
clean_removed: true
queue.mem:
events: 2048
output.elasticsearch:
hosts: ["http://es:9200"]
bulk_max_size: 1000
Filebeat 内存高 = 文件太多 + 队列太大 + 输出慢
如果你愿意,可以把:
filebeat.yml发出来,我可以帮你针对性调优。