RPC 模块的调用测试不像 HTTP 调用那样方便,需要自己写客户端并模拟请求参数,比较麻烦,不过通过 tcpcopy 可以复制线上流量,变相请求 rpc 模块来达到测试目的。
一、概念及安装使用
二、采坑记录
1. MTU 不匹配
日志中出现这个错误的原因是机器网卡的 MTU 值小于1500,ifconfig
查看网卡信息:
发现 MTU = 1400,确实是这个问题导致的。
解决办法:使用 tcpcopy 命令的时候手动设置 MTU 的值,让其小于等于 1400 即可。命令如下:
/opt/tcpcopy/sbin/tcpcopy -x 9201-10.19.80.99:9201 -s 10.19.80.99 -c 10.19.80.81 -M 1400
至于什么是 MTU?参考这篇文章。
2. 路由设置未生效
这是由于某些机器的安全策略问题,路由设置可能不会生效,导致响应包都回到了真正的客户端。
具体解决办法有两种:
-
抛弃第三台辅助机,流量打回到线上机,同时在线上机上屏蔽掉来自测试机的流量。
- 测试机器和 intercept 部署到一台机器
tcpcopy 端 -c 参数采用 tcpcopy 所在的线上机器 ip 地址
- 在线上机器设置 iptables 黑洞来过滤掉测试服务器的响应包
iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址
- 千万要注意在测试服务器不要设置路由了,否则会受到干扰
-
抛弃第三台辅助机,在测试机上屏蔽到返回给线上机的流量。
-
tcpcopy 方式不变,intercept 需要如下改变:
./configure --traditional
,这种方式等同于1.0以下版本的默认方式,intercept 将采用 iptables 的方式来获取响应包,并干掉响应包。 - 如果采用 IP Queue 模块(内核 < 3.5,默认采用 IP Queue):
modprobe ip_queue
# if not runningiptables -I OUTPUT -p tcp --sport port -j QUEUE
./intercept
- 如果采用 NFQueue 模块(内核 >= 3.5,默认采用 NFQueue):
iptables -I OUTPUT -p tcp --sport port -j NFQUEUE
./intercept
-
以上解决方案来自 wangbin679 在 GitHub 上的回答,感谢!
如果 make 的时候报如下错误:
说明缺少相应的依赖包,执行 yum install libnetfilter_queue-devel.x86_64
安装即可。
PREVIOUSCMS 的两大问题