背景

项目中使用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 Timeout​stackoverflow.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超时问题记录相关推荐

  1. java事务超时时间,java – 如何在WebSphere Liberty Batch中配置事务超时?

    > javax.transaction.global.timeout的作用是什么? >我是否需要在CheckpointAlgorithm中实现checkpointTimeout()方法? ...

  2. xml提示无法连接到远程服务器,异步调用WebService时,如何捕捉“无法连接远程服务器”异常...

    在winform窗体中调用webservice,过程如下: ①Form1中弹出Form2 Form2 form2 = new Form2(); form2.ShowDialoag(); ②Form2中 ...

  3. Linux的SSH登录超时自动断开连接设置

    关于ssh登录超时断开连接的设置有两个方面可以设置 1.修改sshd服务的配置文件sshd_config的内容 #ClientAliveInterval 0   指定了服务器向客户端请求消息的时间间隔 ...

  4. 但是尚未从池中获取连接_SQLServer超时时间已到,但是尚未从池中获取连接

    小编最近开发了一个项目,数据库是SQLServer2008R2,在WinForm程序通过API接口短时间大批量上传数据时,出现了错误"超时时间已到,但是尚未从池中获取连接",数据是 ...

  5. Xmanager连接Linux桌面异常解决方案

    Xmanager连接Linux桌面异常解决方案 异常如下: Xdmcp: Timed out, state 3. Retransmissions: 0 Xdmcp: sent a QUERY mess ...

  6. 连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704

    连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704 参考文章: (1)连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=4 ...

  7. 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 ...

  8. TCP连接耗尽攻击异常报文攻击与防御

    TCP连接耗尽攻击与防御 TCP是面向连接的协议,其通信双方必须保持连接状态,并且通过确认.重传.滑动窗口等机制,保证数据传输的可靠性和稳定性.攻击者利用 TCP 的上述特点,利用TCP连接消耗被攻击 ...

  9. 金蝶提示系统检测到服务器异常,金蝶提示连接云服务器异常

    金蝶提示连接云服务器异常 内容精选 换一换 本节操作指导用户关闭Windows操作系统云服务器的防火墙,以及防火墙添加例外端口的操作.本节操作以2012操作系统云服务器为例.防火墙开启和设置安全组是对 ...

最新文章

  1. debian7get源,自动设置get源
  2. 浅谈如何学习深度学习(经验之谈,仅供参考)
  3. python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度
  4. 深度学习-词嵌入(word2vec)
  5. 六个步骤,从零开始教你搭建基于WordPress的个人博客
  6. 快手小剧场推出独立APP“追鸭”
  7. JS实现:鼠标悬停图片,图片由彩色变为灰色
  8. web开发 java如何连接数据库并取得数据,实现 增,删,改,查
  9. 饭卡 01背包 DP
  10. ajax 异步加载 list集合数据
  11. android 水印背景功能,Android 给View添加剧复的文字水印背景 相似钉钉通信录的背景效果...
  12. 苏宁数据中台架构实践,高清技术版
  13. Windows XP14个小技巧
  14. 剑指offer第二版(C++实现)
  15. 揭密360急速免杀系列教程
  16. win10如何打来计算机的工具,电脑系统教程:Win10自带解压缩文件工具如何使用
  17. mac android apk反编译
  18. selenium+python爬取京东评论最多的计算机配置信息
  19. 声称“100%有效”的Molnupiravir,究竟是什么?
  20. matlab画bar图 图例与颜色不对应

热门文章

  1. 从源码分析DEARGUI之add_menu_items
  2. 在一个成熟的分布式系统中 如何下手做高可用?
  3. Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源
  4. 面试题: mysql数据库 已看1 简单的sql练习
  5. Amh/Nginx更改网站根目录
  6. Kafka: Connect
  7. 《统计学习方法》-李航、《机器学习-西瓜书》-周志华总结+Python代码连载(一)--模型选择+误差评估
  8. fastText中的子词嵌入和高效文本分类:简单高效性能好
  9. 新手探索NLP(七)——情感分析
  10. Oracle 优化器_访问数据的方法_单表