背景

项目中使用http://golang.org/x/crypto/ssh来建立SSH连接,最近使用过程中功能发生异常,使用pprof查找时,发现会有大量的业务goroutine卡在client.NewSession()方法上,被hang住,没有被超时处理。review之前同事写的代码已经将clientConfig赋予了超时属性,继续trace发现源码是将config中的Timeout定义为

这样,也就是说,并未给NewSession赋予超时时间,开始琢磨怎么加上超时时间,让goroutine正确关闭。

解决方式

原本计划是通过包装,然后自己写超时channel来强制关掉该协程,但是觉得go包应该做了类似设计。

幸运地,发现了和我们类似情况的老铁。


提问的开发小哥,想要通过conn.SetDeadline()方式去设定超时,但这种方案,对于需要长连接的SSH通道,需要发送心跳去保持连接。

卡卡西发动写轮眼[1]

参考文献