线程死锁分析及定位方法
混合测试过程中,LR报超时错误。
分析:造成这种现象的原因有很多,可能是网络原因,但测试时用的是局域网,所以不可能是网络的问题。也可能是CPU使用过高导致服务器端负载过大,无法处理客户端的请求导致的,此时去检查应用服务器和数据库服务器的CPU,发现还没有达到60%,所以可以排除资源瓶颈问题(当时的测试场景资源指标是应用服务器CPU不能超过60%,数据库服务器CPU不能超过80%)。因为基准测试和负载测试都是测单个交易,而混合场景是把多个交易放到一起发压,既然是多个交易,就有可能存在死锁问题,而混合场景的测试目的是为了检测是否存在线程死锁和数据库死锁。
死锁是因为多线程访问共享资源,由于访问顺序不当造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B,在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿意释放自己的资源,造成两个线程都在等待,而无法执行的情况。
定位:用JDK自带的命令jstack -pid去查看线程信息,jstack很快就帮我们找到了死锁的位置(在实际运行中,往往dump一次信息,还不足以确认问题,建议多dump几次,如果每次dump都指向同一个问题,那么就可以确定是这个问题导致的线程死锁)
根据报错地址找到对应的代码,交由开发处理即可