文档章节

一次线上tcp连接数告警的解决方案

jerrik
 jerrik
发布于 2017/09/10 12:24
字数 818
阅读 14
收藏 0

         最近老大反馈某机器tcp连接数频繁告警,要我去定位下问题。接到任务后,首先分析一下问题:

 1.这个项目上线已有1-2年,以前未曾反馈tcp连接数超标的情况,难道是最近上线的xx需求导致的?

 2.tcp连接数一般都和网络问题有关,且该机器的业务有和银行打交道,且涉及到文件的上传与下载。

 3.查看下CPU和内存使用率是否偏高?

        首先用netstat查看了一下tcp连接,确实存在大量的ESTABLISHED连接,且一直有上升的趋势,这应该就是导致tcp连接数告警的主要原因.然后用jstack查看了线程堆栈,发现有大量的Connection Thread与xxx IP正在建立连接,该ip主要用来和银行进行sftp文件传输。

        打开IDE,全局搜索下使用了jsch的地方,果不其然,确实存在一个通用的文件上传与下载的服务类。

    这是一个全局的初始化方法,首先根据主机名、用户名和账号来创建一个会话,然后调用它的连接方法,一切都很自然,看不出毛病。

     

    下面来看一下文件上传的方法:

    首先获取sftp的通道,然后就直接使用jsch的内部方法实现文件的上传,最后调用disconnect()方法来释放连接。第一反应,有打开连接的方法,上传成功也将连接进行了关闭,怎么

会出现连接不释放的情况呢?

    

      接着看getChannelSftp()和disconnect()方法:

        

       

       根据创建的session来获取sftp渠道,然后调用sftp的connect()方法正式建立文件的输入输出通道。当文件上传、下载完毕,将sftp的渠道关闭,很正常的逻辑。

        但是在什么情况下会出现连接不释放的情况?看一下catch中的代码,当抛出了异常,系统会再次调用初始化init方法。跟进session.connect()方法,发现里面确实启动了一个名字为

Connection Thread的线程,且当调用disconnect()方法的时候 我们并没有手动的关闭掉该线程,而只是关闭了sftp通道而已,所以该线程一直都得不到释放。在init方法后,又重复调用了一次session连接方法,导致启动了两个线程。当时就认为应该是这个问题导致的。

       但是究竟是什么原因会导致抛出异常而发起重连呢?这里只能做一下猜测,或许是tcp连接主动断开导致重连然后频繁创建新的线程,或许是和银行发起文件传输的时候由于网络不稳定导致tcp自动重连,但是之前的线程已经建立。

        最终的解决办法就是去掉init后面的session.connect()方法和在调用disconnect()方法的时候 再调用session.disconnect();jsch的具体实现是手动中断掉之前创建的connection thread,然后将线程置空。

       博主第一次写文章,非喜勿骂,谢谢~

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
jerrik
粉丝 3
博文 11
码字总数 6574
作品 0
深圳
容量管理系统设计方案

版权声明:本文由谢海林原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/218 来源:腾云阁 https://www.qcloud.com/community 容量管理从本质来讲,主要...

偶素浅小浅
2016/11/16
3
0
【追光者系列】HikariCP连接池监控指标实战

摘自【工匠小猪猪的技术世界】--点击“阅读原文”关注 1.这是一个系列,有兴趣的朋友可以持续关注 2.如果你有HikariCP使用上的问题,可以给我留言,我们一起沟通讨论 3.希望大家可以提供我一...

chenssy
04/25
0
0
Connection reset

在使用HttpClient调用后台resetful服务时,“Connection reset”是一个比较常见的问题,有同学跟我私信说被这个问题困扰很久了,今天就来分析下,希望能帮到大家。例如我们线上的网关日志就会...

夜黑人模糊灬
07/20
0
0
Go在广发证券分布式行情和交易系统的应用和实践

作者简介:罗意,广发证券 IT 中后台系统架构师。2013 年初加入腾讯,主要负责腾讯微博的转发评论的逻辑层和存储层,后期负责微博后台的基础组件研发。2016 年加入广发证券信息技术部,主要负...

Go中国
07/02
0
0
运维的福音,深度剖析腾讯云自动运维平台

嘉宾介绍:祝海强,腾讯高级工程师。8年数据库经历,曾就职于第九城市、返利网任高级DBA。目前负责腾讯云CDB for MySQL运维团队,对MySQL、MSSQL等数据库运维、调优诊断具有丰富的经验。 一、...

OSC源创君
2016/11/17
3.4K
7

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式:简单工厂模式(静态共产方法模式)

简单工厂的构成包括三个角色: 1)抽象产品类 2)具体产品类(继承抽闲产品类) 3)工厂类(生产具体产品) 具体代码实现 1、抽象产品类 /** * 抽象类 */public abstract class Car ...

京一
5分钟前
0
0
Lombok使用

1 介绍 Lombok是一个简单的Java库,改工具可以通过注解自动地提供一些方法,简化开发。比如编写POJO时需要为每个属性提供getter()方法和setter()方法,这就可以使用Lombok实现。 2 配置 Lomb...

SuperHeroes
13分钟前
0
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
15分钟前
0
0
java虚拟机之内存模型

1. 概述 对于从事 C、C++ 程序开发的人员来说,在内存管理领域,他们既是拥有最高权力的「皇帝」又是从事基础工作的「劳动人民」 --- 既拥有每个对象的「所有权」,又担负着每一个对象生命开...

firepation
17分钟前
0
0
解决linux的-bash: ./xx: Permission denied

解决linux的-bash: ./xx: Permission denied 在linux下执行sh文件时提示下面信息: -bash: ./xx.sh: Permission denied解决:chmod 777 xx.sh 1 2 3 4 Linux chmod +755和chmod +777 ......

DemonsI
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部