连接超时这种异常怎么处理比较好_Golang中SSH.NewSession超时问题记录
背景
项目中使用http://golang.org/x/crypto/ssh来建立SSH连接,最近使用过程中功能发生异常,使用pprof查找时,发现会有大量的业务goroutine卡在client.NewSession()方法上,被hang住,没有被超时处理。review之前同事写的代码已经将clientConfig赋予了超时属性,继续trace发现源码是将config中的Timeout定义为
// Timeout is the maximum amount of time for the TCP connection to establish.
//建立TCP连接的超时时间
// A Timeout of zero means no timeout.
Timeout time.Duration
这样,也就是说,并未给NewSession赋予超时时间,开始琢磨怎么加上超时时间,让goroutine正确关闭。
解决方式
原本计划是通过包装,然后自己写超时channel来强制关掉该协程,但是觉得go包应该做了类似设计。
幸运地,发现了和我们类似情况的老铁。
SSH Connection Timeoutstackoverflow.com
提问的开发小哥,想要通过conn.SetDeadline()方式去设定超时,但这种方案,对于需要长连接的SSH通道,需要发送心跳去保持连接。
卡卡西发动写轮眼[1]
// Conn wraps a net.Conn, and sets a deadline for every read
// and write operation.
type Conn struct {net.ConnReadTimeout time.DurationWriteTimeout time.Duration
}func (c *Conn) Read(b []byte) (int, error) {err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout))if err != nil {return 0, err}return c.Conn.Read(b)
}func (c *Conn) Write(b []byte) (int, error) {err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))if err != nil {return 0, err}return c.Conn.Write(b)
}
func SSHDialTimeout(network, addr string, config *ssh.ClientConfig, timeout time.Duration) (*ssh.Client, error) {conn, err := net.DialTimeout(network, addr, timeout)if err != nil {return nil, err}timeoutConn := &Conn{conn, timeout, timeout}c, chans, reqs, err := ssh.NewClientConn(timeoutConn, addr, config)if err != nil {return nil, err}client := ssh.NewClient(c, chans, reqs)// this sends keepalive packets every 2 seconds// there's no useful response from these, so we can just abort if there's an errorgo func() {t := time.NewTicker(2 * time.Second)defer t.Stop()for range t.C {_, _, err := client.Conn.SendRequest("keepalive@golang.org", true, nil)if err != nil {return}}}()return client, nil
}
参考文献
[1]https://stackoverflow.com/questions/31554196/ssh-connection-timeout
连接超时这种异常怎么处理比较好_Golang中SSH.NewSession超时问题记录相关推荐
- java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?
> javax.transaction.global.timeout的作用是什么? >我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法? ...
- xml提示无法连接到远程服务器,异步调用WebService时,如何捕捉“无法连接远程服务器”异常...
在winform窗体中调用webservice,过程如下: ①Form1中弹出Form2 Form2 form2 = new Form2(); form2.ShowDialoag(); ②Form2中 ...
- Linux的SSH登录超时自动断开连接设置
关于ssh登录超时断开连接的设置有两个方面可以设置 1.修改sshd服务的配置文件sshd_config的内容 #ClientAliveInterval 0 指定了服务器向客户端请求消息的时间间隔 ...
- 但是尚未从池中获取连接_SQLServer超时时间已到,但是尚未从池中获取连接
小编最近开发了一个项目,数据库是SQLServer2008R2,在WinForm程序通过API接口短时间大批量上传数据时,出现了错误"超时时间已到,但是尚未从池中获取连接",数据是 ...
- Xmanager连接Linux桌面异常解决方案
Xmanager连接Linux桌面异常解决方案 异常如下: Xdmcp: Timed out, state 3. Retransmissions: 0 Xdmcp: sent a QUERY mess ...
- 连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704
连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704 参考文章: (1)连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=4 ...
- kettle4.1 连接 mysql8 库异常:org.gjt.mm.mysql.Driver
问题描述: mysql版本:8.0.16 kettle版本:4.1 使用kettle4.1 连接 mysql8 库异常:org.gjt.mm.mysql.Driver 默认mysql驱动版本:mysq ...
- TCP连接耗尽攻击异常报文攻击与防御
TCP连接耗尽攻击与防御 TCP是面向连接的协议,其通信双方必须保持连接状态,并且通过确认.重传.滑动窗口等机制,保证数据传输的可靠性和稳定性.攻击者利用 TCP 的上述特点,利用TCP连接消耗被攻击 ...
- 金蝶提示系统检测到服务器异常,金蝶提示连接云服务器异常
金蝶提示连接云服务器异常 内容精选 换一换 本节操作指导用户关闭Windows操作系统云服务器的防火墙,以及防火墙添加例外端口的操作.本节操作以2012操作系统云服务器为例.防火墙开启和设置安全组是对 ...
最新文章
- debian7get源,自动设置get源
- 浅谈如何学习深度学习(经验之谈,仅供参考)
- python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度
- 深度学习-词嵌入(word2vec)
- 六个步骤,从零开始教你搭建基于WordPress的个人博客
- 快手小剧场推出独立APP“追鸭”
- JS实现:鼠标悬停图片,图片由彩色变为灰色
- web开发 java如何连接数据库并取得数据,实现 增,删,改,查
- 饭卡 01背包 DP
- ajax 异步加载 list集合数据
- android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...
- 苏宁数据中台架构实践,高清技术版
- Windows XP14个小技巧
- 剑指offer第二版(C++实现)
- 揭密360急速免杀系列教程
- win10如何打来计算机的工具,电脑系统教程:Win10自带解压缩文件工具如何使用
- mac android apk反编译
- selenium+python爬取京东评论最多的计算机配置信息
- 声称“100%有效”的Molnupiravir,究竟是什么?
- matlab画bar图 图例与颜色不对应
热门文章
- 从源码分析DEARGUI之add_menu_items
- 在一个成熟的分布式系统中 如何下手做高可用?
- Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源
- 面试题: mysql数据库 已看1 简单的sql练习
- Amh/Nginx更改网站根目录
- Kafka: Connect
- 《统计学习方法》-李航、《机器学习-西瓜书》-周志华总结+Python代码连载(一)--模型选择+误差评估
- fastText中的子词嵌入和高效文本分类:简单高效性能好
- 新手探索NLP(七)——情感分析
- Oracle 优化器_访问数据的方法_单表