线上升级完分词后,线下测试与压测都没有什么问题,统一大规模上线一段时间后频繁的出现数据节点所在的服务器节点 CPU 飚的非常高,查看日志只看到:
java.lang.OutOfMemoryError: unable to create new native thread,但是并没有从中可以发现有价值的内容。
通过 linux 命令:top、ps aux | grep pid 等命令确定了哪个节点异常后,首先想到是不是数据不均衡导致的,采用:
GET /_cat/segments/xxx_index?v 查看发现 es 经过 hash 计算数据还是比较均衡的。
通过 jstack 打印 Java线程栈的状态,以及通过 es api 接口查看线程池的状态:GET _cat/thread_pool,发现 index 时有异常,进一步查看 index 线程池状态:GET _cat/thread_pool/index
可以 formate:GET /_cat/thread_pool/index?v&h=ip,port,type,name,active,rejected,completed,size,queue,queue_size
这个命令查看到的结果发现 rejected 和 queue 数据量居多,表明拒绝的 和 排队的持续增高,绝对有异常。那么进而通过命令:GET /_nodes/hot_threads 来查看当前有问题的热的线程到底在干什么操作,从这里大概就可以看出问题了。定位到是分词的时候做歧义处理采用递归循环导致无法退出卡死的现象。
以上都是通过 es 的 dev_tools 来查看问题。具体和 jstatck pid 查出来的问题是一样的。
Elasticsearch调优篇 08 - Elasticsearch 线上问题修复完整总结
原文:https://www.cnblogs.com/liang1101/p/13189025.html