在 CentOS 上 Filebeat 占用内存过高,通常不是“内存泄漏”,而是 配置或数据量不合理 导致的。下面给你一套排查 + 优化方案,从最常见到进阶逐步来。
top -p $(pidof filebeat)
或
ps -eo pid,cmd,%mem,rss --sort=-rss | grep filebeat
一般:
如果你采集的是:
限制采集速率
processors:
- rate_limit:
limit: "1000/s"
减少并发
filebeat.registry.flush: 5s
queue.mem:
events: 2048
flush.min_events: 512
flush.timeout: 1s
老版本(如 6.x / 早期 7.x)内存管理较差。
filebeat version
✅ 强烈建议升级到 7.17+ 或 8.x
yum update filebeat
# 或手动下载 rpm
grep -R "paths" /etc/filebeat/
❌ 不推荐:
paths:
- /var/log/*
✅ 推荐:
paths:
- /var/log/nginx/access.log
- /var/log/app/*.log
Elasticsearch 输出
output.elasticsearch:
hosts: ["localhost:9200"]
bulk_max_size: 512
worker: 1
Logstash 输出
output.logstash:
hosts: ["localhost:5044"]
pipelining: 0
queue.mem:
events: 4096
flush.min_events: 512
✅ 改为更保守:
queue.mem:
events: 1024
flush.min_events: 256
flush.timeout: 1s
filebeat export config
lsof -p $(pidof filebeat) | wc -l
如果 几千个 fd,说明:
✅ 解决:
close_inactive: 5m
clean_inactive: 72h
ignore_older: 48h
如果是容器日志:
✅ 建议:
如果内存已经很高:
systemctl restart filebeat
⚠️ 只是临时方案,不解决根本问题。
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
close_inactive: 5m
clean_inactive: 72h
ignore_older: 48h
queue.mem:
events: 1024
flush.min_events: 256
flush.timeout: 1s
output.elasticsearch:
hosts: ["localhost:9200"]
bulk_max_size: 512
你可以直接贴出:
1️⃣ filebeat version
2️⃣ filebeat.yml 配置(脱敏)
3️⃣ 日志类型(Nginx / Java / Docker / K8s)
我可以 直接帮你给出最优配置。