hive server客户端连接泄漏导致hs重启
1 问题描述
从某个时间点开始,Manager页面hiveserver状态在良好和恢复中频繁变化,后台检查hiveserver频繁重启。
2 问题分析
1. 从hive.log日志可见健康检查多次失败,NodeAgent因健康检查多次失败认为服务已经异常,重启HiveServer进程,Manager页面状态显示正在恢复。
2. 健康检查为NodeAgent调用HiveServer的jmx接口实现,机制为通过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 根本原因
短时间内大量业务大量连接HiveServer,OS 的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. 限制单个IP到HiveServer连接数:hiveserver支持限制每个客户端ip最大的连接数,以及每个用户在每个客户端ip的最大的连接数,超过配置值后抛出异常。
hive.server2.limit.connections.per.ipaddress 单IP 可建立的连接数限制
hive.server2.limit.connections.per.user.ipaddress 单用户单IP可建立的连接数限制
参数评估方法如下:
假如SQL 的平均执行时间为 m 分钟,则需要在hiveserver 的审计日志中,统计业务高
峰时间段,m 分钟内建立的单IP OpenSession的记录数以及单IP 单用户OpenSession
的记录数。
建议同时结合业务的实际使用情况进行评估。
参数配置需在HiveServer内增加自定义参数,并重启HiveServer生效。
3. 针对业务程序,需要排查异常业务是否存在连接未释放的情况,避免连接泄漏。
- 点赞
- 收藏
- 关注作者
评论(0)