ELK的一次吞吐量优化
博客转载自:https://blog.csdn.net/ypc123ypc/article/details/69945031
问题一
- 最近发现kibana的日志传的很慢,常常查不到日志,由于所有的日志收集都只传输到了一个logstash进行收集和过滤,于是怀疑是否是由于logstash的吞吐量存在瓶颈。一看,还真是到了瓶颈。
优化过程
- 经过查询logstash完整配置文件,有几个参数需要调整
# pipeline线程数,官方建议是等于CPU内核数 pipeline.workers: 24 # 实际output时的线程数 pipeline.output.workers: 24 # 每次发送的事件数 pipeline.batch.size: 3000 # 发送延时 pipeline.batch.delay: 5
PS
:由于我们的ES集群数据量较大(>28T),所以具体配置数值视自身生产环境
优化结果
- ES的吞吐由每秒9817/s提升到41183/s
问题二
- 在查看logstash日志过程中,我们看到了大量的以下报错
[2017-03-18T09:46:21,043][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 429 ({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$6@6918cf2e on EsThreadPoolExecutor[bulk, queue capacity = 50, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@55337655[Running, pool size = 24, active threads = 24, queued tasks = 50, completed tasks = 1767887463]]"}) [2017-03-18T09:46:21,043][ERROR][logstash.outputs.elasticsearch] Retrying individual actions
我们首先想到的是来调整ES的线程数,但是官网写到”Don’t Touch There Settings!”, 那怎么办?于是乎官方建议我们修改logstash的参数pipeline.batch.size
- 在ES5.0以后,es将bulk、flush、get、index、search等线程池完全分离,自身的写入不会影响其他功能的性能。
来查询一下ES当前的线程情况: - es性能存在问题一般需要查看es集群当前线程使用的情况:
- GET _nodes/stats/thread_pool?pretty
-
{ "_nodes": { "total": 6, "successful": 6, "failed": 0 }, "cluster_name": "dev-elasticstack5.0", "nodes": { "nnfCv8FrSh-p223gsbJVMA": { "timestamp": 1489804973926, "name": "node-3", "transport_address": "192.168.3.***:9301", "host": "192.168.3.***", "ip": "192.168.3.***:9301", "roles": [ "master", "data", "ingest" ], "attributes": { "rack": "r1" }, "thread_pool": { "bulk": { "threads": 24, "queue": 214, "active": 24, "rejected": 30804543, "largest": 24, "completed": 1047606679 }, ...... "watcher": { "threads": 0, "queue": 0, "active": 0, "rejected": 0, "largest": 0, "completed": 0 } } } } }
其中:”bulk”模板的线程数24,当前活跃的线程数24,证明所有的线程是busy的状态,queue队列214,rejected为30804543。那么问题就找到了,所有的线程都在忙,队列堵满后再有进程写入就会被拒绝,而当前拒绝数为30804543。
优化方案
- 问题找到了,如何优化呢。官方的建议是提高每次批处理的数量,调节传输间歇时间。当batch.size增大,es处理的事件数就会变少,写入也就愉快了。
-
vim /etc/logstash/logstash.yml # pipeline.workers: 24 pipeline.output.workers: 24 pipeline.batch.size: 10000 pipeline.batch.delay: 10
具体的worker/output.workers数量建议等于CPU数,batch.size/batch.delay根据实际的数据量逐渐增大来测试最优值。
做完这些,世界又清净了。
posted on 2020-10-28 10:43 luzhouxiaoshuai 阅读(433) 评论(0) 编辑 收藏 举报