hive server客户端连接泄漏导致hs重启

举报
Nature_L 发表于 2021/07/13 11:05:54 2021/07/13
【摘要】 1 问题描述从某个时间点开始,Manager页面hiveserver状态在良好和恢复中频繁变化,后台检查hiveserver频繁重启。2 问题分析1.     从hive.log日志可见健康检查多次失败,NodeAgent因健康检查多次失败认为服务已经异常,重启HiveServer进程,Manager页面状态显示正在恢复。2.     健康检查为NodeAgent调用HiveServer的j...

1 问题描述

从某个时间点开始,Manager页面hiveserver状态在良好和恢复中频繁变化,后台检查hiveserver频繁重启。

2 问题分析

1.     hive.log日志可见健康检查多次失败,NodeAgent因健康检查多次失败认为服务已经异常,重启HiveServer进程,Manager页面状态显示正在恢复。

2.     健康检查为NodeAgent调用HiveServerjmx接口实现,机制为通过jdbc的方式连接hiveserver执行sql确认状态正常。查看日志,健康检查失败的原因为连接超时Connection timed out

3.     通过 dmesg | grep SYN 命令查看hiveserver节点的系统运行情况。发现有大量的“SYN flooding”日志,如下图所示:

所以HiveServer节点OS 存在TCP请求队列溢出的情况,一般为短时间大量连接导致。出现该错误后会导致建立TCP连接超时。

 4.     查看HiveServer日志,存在在一个时间窗口(hive.server.timewindow.delaytime =60s) 内建立的session超过了数量限制(hive.server.timewindow.maxsessions.in.delaytime=500), 说明对应HiveServer节点存在短时间建立大量连接的情况。

 

5.     使用netstat 命令检查到HiveServer的端口,发现绝大部分连接为一个ip节点 xxx建立。

 

6.     停止该节点的相关业务后,HiveServer恢复正常,未出现健康检查失败的情况。

3 根本原因

短时间内大量业务大量连接HiveServerOS TCP 队列满,有“SYN flooding”的日志打印。TCP队列满后,健康检查连接HiveServer超时,多次超时失败后,重启了HiveServer

4 解决措施[Corrective Action]

应急措施:

通过快速找到连接HiveServer的异常节点,再到异常节点确认异常进程,停止异常进程的方式进行应急。具体操作步骤如下:

1)     登陆hiveserver节点,查看连接hiveserver服务端的客户端数量,并按客户端IP进行排序统计:

netstat -anp | grep 21066 | awk '{print $4}' | grep -v 21066 | wc -l

netstat -anp | awk '{print $4, $5}' | grep 21066 | awk '{print $1}' | grep -v 21066 | awk -F ':' '{print $1}' | sort -n | uniq -c | sort -n

2)     到对应节点执行如下命令,找到连接HiveServer较多的进程:

netstat -antp | grep 21066 | awk '{print $7}'|sort|uniq -c

3)     结合业务情况,停止对应的业务进程。

 

优化措施:

1.     调整控制节点的TCP相关参数,从而支持更多的连接和更快的回收连接。建议调整的参数如下:

net.ipv4.tcp_max_syn_backlog=8192     半连接队列最大长度,端口最大 backlog 内核限制

net.core.somaxconn=4096               定义了系统中最大的全连接队列(已连接队列)的长度

net.ipv4.tcp_tw_reuse = 1                重用处于TIME_WAIT状态的连接

net.ipv4.tcp_tw_recycle = 1               回收处于TIME_WAIT状态的连接

net.ipv4.tcp_fin_timeout = 30            处于FIN-WAIT-2的时间

具体操作步骤如下:

1)  hiveserver所在节点的/etc/sysctl.conf文件中修改或增加参数的值。

2)  执行以下命令,使修改生效

# sysctl –p

3)  检查参数是否生效

# sysctl -a | grep tcp_max_syn_backlog

net.ipv4.tcp_max_syn_backlog = 8192

# sysctl -a | grep net.core.somaxconn

net.core.somaxconn = 4096

# sysctl -a | grep net.ipv4.tcp_tw_reuse

net.ipv4.tcp_tw_reuse = 1

# sysctl -a | grep net.ipv4.tcp_tw_recycle

    net.ipv4.tcp_tw_recycle = 1

# sysctl -a | grep net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 30

2.     限制单个IPHiveServer连接数:hiveserver支持限制每个客户端ip最大的连接数,以及每个用户在每个客户端ip的最大的连接数,超过配置值后抛出异常。

hive.server2.limit.connections.per.ipaddress          IP 可建立的连接数限制

hive.server2.limit.connections.per.user.ipaddress      单用户单IP可建立的连接数限制

参数评估方法如下:

假如SQL 的平均执行时间为 m 分钟,则需要在hiveserver 的审计日志中,统计业务高

峰时间段,分钟内建立的单IP OpenSession的记录数以及单IP 单用户OpenSession

的记录数。

建议同时结合业务的实际使用情况进行评估。

参数配置需在HiveServer内增加自定义参数,并重启HiveServer生效。

3.     针对业务程序,需要排查异常业务是否存在连接未释放的情况,避免连接泄漏。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。