我正在使用受Elastic Docker Compose启发的ElasticSearch,Logstash,Filebeat和Kibana运行Docker设置。我需要在系统中初始加载15 GB og日志文件(Filebeat-> Logstash-> ElasticSearch),但我遇到了一些性能问题。
似乎Filebeat / Logstash正在为ElasticSearch输出太多工作。一段时间后,我开始在ElasticSearch中看到一堆错误:
[INFO] [o.e.i.IndexingMemoryController] [f8kc50d]现在为分片[log-2017.06.30]限制索引:分段写入无法跟上
我发现这篇关于如何禁用合并限制的旧文档文章:https://www.elastic.co/guide/en/elasticsearch/guide/master/indexing-performance.html#segments-and-merging。
PUT /_cluster/settings
{
"transient" : {
"indices.store.throttle.type" : "none"
}
}
但是在当前版本(ElasticSearch 6)中,它给了我这个错误:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "transient setting [indices.store.throttle.type], not dynamically updateable"
}
],
"type": "illegal_argument_exception",
"reason": "transient setting [indices.store.throttle.type], not dynamically updateable"
},
"status": 400
}
如何解决上述问题?
VM有4个CPU核心(Intel Xeon E5-2650),ElasticSearch分配4GB RAM,Logstash和Kibana各1GB。使用" swapoff -a"禁用交换。启用X-pack和监视。我只有一个ES节点用于此日志服务器。我是否需要为此初始批量导入设置多个节点?
EDIT1:
更改 number_of_replicas 和 refresh_interval 似乎可以让它表现更好。还在测试。
PUT /log-*/_settings
{
"index.number_of_replicas" : "0",
"index.refresh_interval" : "-1"
}
答案 0 :(得分:2)
最有可能的瓶颈是IO(您可以确认此运行iostat,如果您发布ES监控屏幕截图也会很有用),因此您需要减轻压力。
默认ES配置会导致批量加载期间生成许多索引段。要解决此问题,对于批量加载,请增加 index.refresh_interval (或将其设置为-1) - 请参阅doc。默认值为1秒,这会导致每1秒创建一个新段,同时尝试增加批量大小并查看是否有帮助。
此外,如果您使用旋转磁盘,请将 index.merge.scheduler.max_thread_count 设置为1.这将只允许一个线程执行段合并,并将减少段合并和索引之间的IO争用。