这周三线上股票板块的Elasticsearch集群发生了很严重的内存泄漏,本身数据量不大的一个集群,占用内存却非常的高,甚至内存占用已经超过了数据总量。最终是通过临时重启解决问题。
虽然重启释放掉了内存空间,但问题原因没找到,就意味着还有可能发生。由于这是一个新搭建不久的集群,也是本人迷之自信,直接上6.3.0。就我目前对Elasticsearch的了解和解决方案,各种招数都试了,还是没能找到原因。所以对版本产生了怀疑。因为当时运行了很久稳定的5.3版本集群并没有出现这种情况。最后证明跟版本无关。
后来在网上找到wood大叔(携程吴晓刚)写的博客。
参考:https://www.jianshu.com/p/d4f7a6d58008
看了之后如梦初醒,惊人的相似。竟然复现了这个问题,并且直到6.3版本仍然有这个bug。
说一下我们的使用场景:
- 主要是搜索股票相关数据,包括行情数据、财务数据、新闻数据等等
- 数据来源不同,有些是同事爬取的,有些是合作推送,有些则是直接购买(如:聚源)
- 有些数据实时进Elasticsearch,有些数据则是批量导入,每天导入一次
我们这之所以会内存泄漏,就是因为每天一次的这个批量导入。而且事实是另外的5.3版本之所以没有出现这个问题,是那个集群完全是实时,没有bulk操作。
批量导入后,log4j日志报错,log4j使用的是thread local,首先是bulk线程引用了log4j的ParameterizedMessage对