背景
当前ElasticSearch集群数据写入使用Transport Client,由于Transport Client在8.0版本后弃用并且存在性能问题,所以要将数据写入的客户端迁移到Rest Client
现象
将客户端迁移为Rest Client之后,部分ElasticSearch节点出现内存被打满的现象,节点重启后过一段时间又被打满。dump进程内存后立刻回滚了客户端并将ElasticSearch集群节点全量重启。
问题分析
使用Eclipse Memory Analyzer Tools进行dump文件的内存分析,得到以下结果。


通过Dominator Classes可以看出是CopyBytesSocketChannel和Transport$ResponseHandlers占据了大部分内存,下面进行分别分析。
CopyBytesSocketChannel分析
CopyBytesSocketChannel为netty中的channel,每个TCP连接创建一个。
CopyBytesSocketChannel实例的数量和我们ES节点的连接数相同,异常的地方在于CopyBytesSocketChannel实例的大小。
通过上面的类内存占用排行可以看出多个类占用大小为16GB,这些类之间的引用关系如下:
CopyBytesSocketChannel -> DefaultChannelPipeline -> DefaultChanne

文章讲述了在将Elasticsearch集群从TransportClient迁移到RestClient后,遇到内存溢出的问题。通过内存分析发现Netty4CorsHandler和CopyBytesSocketChannel的内存占用,尤其是Netty4HttpRequest的大量堆积。解决方法是在Netty4CorsHandler的channelRead方法中及时释放请求引用,以避免内存泄漏。
最低0.47元/天 解锁文章
800





