公司业务系统中有一个功能是某个系统客户端要定时加载目标jar包到系统中实现功能的热扩展,线上出了一个很奇怪的异常,是jar包提供端出现了connect reset by peer,隔一段时间就会报异常
并且业务功能并没有受到影响,但是毕竟是生产环境,一点错误都有可能造成损失,问题还是要看的啊
首先定位问题,该异常由jar包提供端抛出,jar删除后便不再抛出,由此基本可以缩小范围至客户端加载jar包代码,但是光看代码似乎并没有什么大的问题
所以我需要看看服务端抛异常的时候究竟在干什么,这里就用到了tcpdump
,用这个工具将服务端的tcp日志打印出来
服务端部署在docker容器中,首先使用nsenter
将命名空间锁定到容器的pid1
2
3
4
5
6//获取容器id/name
docker ps | grep xxx
//获取PID
docker inspect --format "{{.State.Pid}}" container_id/name
使用nsenter切换网络命名空间
nsenter -n -t pid
之后查找客户端所在的ip地址,也就是tcpdump
中要用到的host信息,我们要锁定查找范围为服务端到客户端之间的所有连接
使用命令tcpdump host 你的host -w tcphistory.pcap