1.现象
线上环境 HiveServer2报:在前 5分钟内暂停所花的平均时间过长
hs2角色日志如下:
2.分析
看到上面的报错和日志,第一个直觉就是 hs2 GC出问题了,于是使用 jstat命令进行分析:
jstat -gcutil 82775 5000 5
这里先简单介绍一下 jstat这条命令:
-gcutil,打印 gc统计信息
82775,java进程ID
5000,5000ms
5,5次
所以这条命令的含义为:每间隔 5000ms打印一次 进程 82775的 gc统计信息,一共打印 5次
接下来分析这个 hs2的 gc统计信息:
从上图可以很明显得看出 ygc的次数非常多,5s内甚至能产生 3次 ygc,而且根据 ygct看到 gc时间确实很长。
另外,可以看到 eden区内存占用率几乎随时都是 99%的状态。
综上,问题出在 新生代含有大量对象,且无法及时释放,进而导致频繁 ygc。
于是带着上面的结论再次认真查看角色日志:
日志中确实有别的异常,从 jetty.server可以联想到应该是 hs2的 webui出问题了,进而查看如下:
可以看到很多个 tcp连接均处于 close_wait状态,这部分资源自然无法释放,那么到此为止初步判断导致频繁 gc的原因就是这些没有及时释放掉的 tcp连接了。
3.解决
带着分析的结论去查阅相关资料,发现有可能是这个 jetty server线程数不足导致请求没法及时处理的。
补充:hs2自带的 webui服务即使用的 jetty。
因此,修改 hive.server2.webui.max.threads=100,其默认值为 50。
然后重启整个 hive服务,问题解决。