背景:定时任务使用SNMP协议定时获取交换机的mac表并入库。
现象:SNMP4j源码等待交换机响应时调用了Object的wait(long timeout)方法,时间设置为12秒,但是在wait方法这里阻塞了最多十几个小时以上。
1. 使用arthas查看卡死的线程
2. 使用arthas查看线程调用栈
3. 调用栈最终阻塞代码的位置截图
waitMillis应该是固定的12s,并没有很大,所以线程预期应该在12s时中止等待状态,除非一直在接收数据。
但这个线程到从凌晨现在已经阻塞了十几个小时,不应该是java的原生wait方法出问题,所以应该是程序正在接受数据接收了十几个小时。
当天晚上开始运行定时任务,次日在服务器上抓包:
tcpdump -i eno2 -xx host xxxx -w ./dump1.pcap
得知程序确实一直在接受和发送snmp报文,但实际总报文(开头提到的mac表)并没有很大。
解决方法:让运维人员手动清空问题交换机的mac表。问题得到解决
结果并不是程序的问题。