ElasticSearch 开发总结——java.lang.OutOfMemory:unable to create new native thread

 1.ElasticSearch 批量建索引,集群出现以下错误

java.lang.OutOfMemoryError: unable to create new native thread
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread

 不能创建线程?这个错误,很诡异!!!

常规操作,按照以下思路,开始解决

(1)ElasticSearch和JDK版本不对应?

通过官网,查询JDK1.8和ElasticSearch5.4版本是相对应的,没有问题;

(2)上Stack Overflow 搜索发现相关的内容

elasticsearch JDBC -RIVER java.lang.OutOfMemoryError: unable to create new native thread

可惜没有解决方案没用;

(3)搜索之后,发现几个帖子比较靠谱:

Elasticsearch5.4常见问题总结

java.lang.OutOfMemoryError:Unable to create new native thread原因探查

其中,第二个帖子提到:由于32位Java进程大小已耗尽其内存地址空间,因此操作系统将拒绝本地内存分配

 细想一下,貌似刚刚借用的服务器是32位的操作系统!!!简单对比,就发现了错误。

通过更换操作系统为64位,ElasticSearch集群已经正常

2.接下来的思考

(1)32位操作系统到底最大能创建多少线程?

询问前辈得到答案:32位大概5000个,64位大概100000个;这个答案有待验证。

不过, ElasticSearch必须依赖JDK,自然是需要知道32位jdk最大支持的线程个数

其中,jvm内存使用上限 给了一些答案

(2)ElasticSearch为什么不能创建线程了?

ElasticSearch在创建索引,搜索,合并索引等操作过程中,需要创建大量的线程,垃圾回收器并没有及时回收线程占用的堆空间,可能引起这个错误!

查看elasticsearch.yml配置文件有以下配置,有关线程可以设置 :

threadpool.index.type: fixed
threadpool.index.size: 100
threadpool.index.queue_size: 500

通过配置,让线程个数固定下来,最终满足了业务需求

(3)线程池的类型和个数,如何设定?

官方文档给出了答案:

Thread Pool Types

 一定要关注你的 CPU 核心数,最多设置成核心数的两倍

(4)关于线程池个数的设置,如果是生产环境,请慎重!!!

         官网并不建议对此进行设置!!!

3.小结

(1)服务器的开发,一般使用64位操作系统,尤其是在高并发的时候;

(2)保证安装软件的版本和操作系统的版本保持一致,最好都使用64位;

(3)安装任何软件,建议安装官网指引安装,杜绝版本不一致引起的问题;

你可能感兴趣的:(ElasticSearch)