基于Elasticsearch5.4的常见问题总结
最近项目中用到了elasticsearch5.4(es)是比较新的一个版本,使用的过程中出现了很多的问题,很是头疼,但是问题最终还是解决掉了。
问题一:esclient获取慢,并且不能获取client:failed to create a child event loop
由于业务的需要没上传一批文件都要加一次es索引,每加一次索引都要获取连接然后操作,尤其是大批量的时候,获取的次数显然非常多,而且出现这个问题的主要原因在于我们在循环频繁的操作es,比如一批文件100个,我们就要获取100次,为了降低es client获取的时间,最终采取了一个方案,那就是在服务启动的时候初始化连接,一次性获取,然后在后边直接调用,整个批次文件上传完成后,最后添加es索引,而不是一个文件一个文件的去添加了。这种方式显然不需要每个批次都获取连接,大大提升了执行效率。
首先,我们在服务启动的时候,在启动类中初始化静态es client:
private static elasticsearchutil elasticsearchutil=new elasticsearchutil(); public static transportclient client=elasticsearchutil.getclient();
然后在用到的时候直接调用:
client client=main.client;
这样可以大大减少es client的连接次数,从而提升效率。
es代码如下:
public transportclient getclient() { string[] iparr = configutil.getvalue("esip").split(","); settings settings = settings.builder().put("thread_pool.generic.core",5) .put("thread_pool.generic.max", 10) .put("processors", 5) .put(constants.esclustername,configutil.getvalue("clustername")).build(); transportclient client = new prebuilttransportclient(settings); for (string ip : iparr) { transportaddress address = new inetsockettransportaddress (inetaddresses.forstring(ip),9300); client.addtransportaddresses(address); } return client; }
问题2:内存溢出:java.lang.outofmemory:unable to create new native thread
在项目开发过程中,发生内存溢出是很让人头疼的一件事,在使用es的过程中,就遇到了,而且很频繁,尤其是在大批量压力测试的时候根本进行不下去,从jvm内存调优方面想了很多办法,没有什么效果,问题依然得不到解决,最后在看源码的时候,发现了一个原因,和报错异常结合来看,这是由与es在使用过程中,自动创建了大量的线程,超出了系统的容纳量,所以导致了内存溢出,研究源码的时候发现:es创建的线程数是可以通过设置来控制的。下面是默认的es创建线程数:
thread_pool.generic.core=默认值---4 thread_pool.generic.max=默认值-- min(512,max(4*processor数,128)) processor数=cpu的processor数
我们的cpu是10核40线程
从计算结果来看,如果使用默认值的话,es可以创建的线程数是一个很大的数值,这远远超出了系统本身的容纳数,主要是调整setting的数值,经过调整,我们将es的默认值改变如下:
settings settings = settings.builder().put("thread_pool.generic.core",5) .put("thread_pool.generic.max", 10) .put("processors", 5) .put(constants.esclustername,configutil.getvalue("clustername")).build(); 这是之前的 settings settings = settings.builder().put("thread_pool.generic.core",5) .put(constants.esclustername,configutil.getvalue("clustername")).build();
经过测试,es创建了很少的线程数,并且满足我们的开发需求,再也没有出现过内存溢出的问题了。
以上这篇基于elasticsearch5.4的常见问题总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: 微信官方正式宣布上线沟通接口:App可跳转至公众号
下一篇: 用iOS模拟器安装App的方法
推荐阅读
-
基于Elasticsearch5.4的常见问题总结
-
基于控制台的快递管理系统(学习总结)
-
基于PHP常用字符串的总结(待续)
-
基于Linux调试工具strace与gdb的常用命令总结
-
解析SQLite中的常见问题与总结详解_MySQL
-
基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理_html/css_WEB-ITnose
-
基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts
-
基于Pandas读取csv文件Error的总结
-
iOS中UITableView使用的常见问题总结
-
基于java中的流程控制语句总结(必看篇)