部门主要做数据采集服务,采集过程使用到两级代理,都是自建服务。昨晚在做优化和测试的时候遇到了一个奇怪问题,在本地测试时代理服务很快,但是部署到开发测试机之后会有卡顿,而且是秒级的,本机安装的虚拟机测试也很快。
然后就不停的尝试,但是还是没有效果通过打印日志发现,二级代理很快就返回了,但是一级代理过了一会才收到数据,初步怀疑是不是一级代理没有设置TCP_NODELAY标志,导致虽然应用层打印是返回了,但是网络层会延迟发送。然后就不停的尝试,但是还是没有效果。怀疑跟TCP_NODELAY标志无关,因为TCP_NODELAY只会影响40毫秒左右。
由于对netty和代理服务代码不是很熟悉,对打印log的地方产生了怀疑。之后通过tcpdump将开发测试服务器和本地测试服务器网络包进行了抓取(这里有个小技巧,由于网端口产生的数据包很多,比较难以分析,所以我将测试和代理服务都部署在同一台机器,通过抓取lo端口包进行分析),然后通过wireshark打开抓取的网络包文件。测试及代理服务如下:
通过分析开发测试机的抓包,发现关键部分如下:
上图53030对应二级代理的v1端口,6014对应一级代理的s2端口,7978对应测试程序的c端口,63030对应一级代理的s1端口。可以发现二级代理很快就返回了数据(其中蓝条表示一级代理收到数据的响应ACK),但是一级代理过了3秒左右的时间才返回了数据,所以问题出在一级代理上面。进一步排查发现是一级代理上面有一个filter在本地和测试开发机表现不同造成的,问题也很快被解决。
虽然问题很快得到解决,但是问题排查过程中用到的一些方法和思考值得学习和反思,比如抓包测试方案等。最后通过siege连续发送2次请求对两级代理keep-alive长连接进行了验证😀。