问题描述:
向后台发送了一个URL请求,竟然一直卡住,没有返回,就一直卡着
问题分析定位:
一开始还以为是网络,还是什么其它奇怪的原因,毕竟之前好好的。
这里应该第一时间思考环境的变化,网络、程序版本、还是什么地方变化了。
后来又试了好几次,发现还是一样,想到了将Pod的数目改成了2个,于是估计是等待锁或者死锁之类的。
通过以下链接获取调试信息:
curl “127.0.0.1:43411/debug/pprof/goroutine?debug=1” > 1.out
curl “127.0.0.1:43411/debug/pprof/goroutine?debug=2” > 1.log
搜索卡住的请求方法名,果真搜到一些,goroutine 17002 [semacquire, 5 minutes]:表示17002这个goroutine正在等待获取锁,等了5分钟了。
又有一个正在运行中的同名方法,估计是大家都在等它的锁,看来代码,果然有一个锁。
但是这个goroutine调用栈最上层是SetDataNodeCarry,看到其方法内部,发现其也加了一个锁,不过其就是简单的对一个字段的变更进行加锁。
分析其使用的锁相关的代码,大家没有重叠,每一次加锁只不过是保证数据的原子性和一致性而已,所以不会有死锁的问题。
阅读SetDataNodeCarry附近的代码,有一个for availCarryCount < needSelectedNum {},之前没仔细看,这里竟然可能是一个死循环,分析了一下环境的变化,果然是因为环境不同了,导致这里的循环无法跳出。
总结
遇到此类问题首先不能慌,之后不能逃避问题。
需要将问题尽可能地记录,以便于还原,同时还要基于现在的情况进行调试,千万不能想着重启会好,不能逃避问题。
后面解决问题的步骤还可以,不过这个问题本身也不是很难。
------------记录
总结