背景
项目中使用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![7ecf9ee9dc4024a83ba3ecc3d85ea257.png](https://i-blog.csdnimg.cn/blog_migrate/e73c71d5ae15f5032ebd087ee36b34d0.png)
提问的开发小哥,想要通过conn.SetDeadline()方式去设定超时,但这种方案