内容纲要
概要描述
inceptor server 运行一段时间会自动重启,gc 情况都是正常的;Inceptor Server 日志中报错为 java.lang.OutOfMemoryError: unable to create new native thread。
详细说明
正常情况下,看到 java.lang.OutOfMemoryError 应该首先怀疑是内存占用问题;但是这个报错里面具体的 call stack 是 unable to create new native thread,所以应该首先排查相关的连接数问题;重点关注数量是否异常多,以及数量是否一直在增长。
排查思路
-
检查报错服务所在节点的连接数
# netstat -n | grep ^tcp | awk '{print $NF}' | sort -nr | uniq -c -
检查 inceptor server 的所有连接数
# cat /proc/$(ps -ef|grep -v grep |grep io.transwarp.inceptor.InceptorServer2 |awk '{print $2}')/status |grep Threads -
是否有本机(Local Address)异常连接端
# netstat -nalp|grep ^tcp|awk '{print $4}'|uniq -c |sort -nr |head -
是否有远端(Foreign Address)异常连接
# netstat -nalp|grep ^tcp|awk '{print $5}'|uniq -c |sort -nr |head -
是否有异常状态的端口连接
# netstat -nt | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'
问题原因
最终发现是某个 ip 的 22 端口连接数很多,并且不停增长。经过排查业务发现,是 tdt 的 sftp 算子与 inceptor 的连接不会释放,导致 inceptor server 运行一段时间后,stack 里面保留了很多的与 22 端口的连接;
可以通过 inceptor server 的 jstack 信息里面过滤这个 ip 确认,如果数量超过了实际正在使用的连接数;
解决方案
联系星环科技全球技术支持中心 获取新的 inceptor server jar包做替换,可以解决这个问题;
附录
已知的可能造成这种线程泄露的问题记录如下:
- tdt 的 sftp/ftp 算子;22/21 端口
- hyperbase 表的 drop 、truncate 操作;2181 端口