标题：tcpcopy
简介
TCPCopy是一种请求复制（所有基于tcp的packets）工具，可以把在线流量导入到测试系统中去。
曾经应用于网易的广告投放系统，urs系统，nginx hmux协议等系统，避免了上线带来的很多问题。
目前此工具已经广泛应用于各大互联网公司。
特点
1）实时
2）效果真实
3）低负载，不影响在线
4）操作简单
5）分布式
6）零成本
7）意义非凡
功能
1）分布式压力测试工具，利用在线数据，可以测试系统能够承受的压力大小（远比ab压力测
试工具真实地多）,也可以提前发现一些bug
2）普通上线测试，可以发现新系统是否稳定，提前发现上线过程中会出现的诸多问题，让开
发者有信心上线
3）对比试验，同样请求，针对不同或不同版本程序，可以做性能对比等试验
4）流量放大功能，可以利用多种手段构造无限在线压力，满足中小网站压力测试要求
5）利用TCPCopy转发传统压力测试工具发出的请求，可以增加网络延迟，使其压力测试更加真实
6）热备份
7）实战演习（架构师必备）[1]
使用方法
TCPCopy分为TCPCopyclient和TCPCopyserver。
其中TCPCopyclient运行在在线服务器上面，用来捕获在线请求数据包；TCPCopyserver
（监听端口为36524）运行在测试机器上面，在测试服务器的响应包丢弃之前截获测试服务器
的响应包，并通过TCPCopyclient和TCPCopyserver之间的tcp连接传递响应包的tcp和ip
头部信息给TCPCopyclient，以完成TCP交互。
使用方法如下：
TCPCopyserver （root用户执行）
1）启动内核模块ip_queue (modprobe ip_queue)
2）设置要截获的端口，并且设置对output截获
iptables -I OUTPUT -p tcp --sport port -j QUEUE 
3）./interception (<0.5)or./intercept (>=0.5)
注意（如果已经启动ip_queue和已经设置iptables，只需要运行第3项;测试完以后要记得删除上面设置的iptables条目）
TCPCopyclient （root用户执行）
tcpcopy 0.5之前版本：
./tcpcopy 本地ip地址1[：本地ip地址2：…] 本地port 远程ip地址远程port
注意（本地ip地址列表其实就是客户端所认为的服务器ip地址,如果前面有lvs，一般就是lvs的虚拟ip地址）
tcpcopy 0.5及其以后版本
./tcpcopy -x 服务器应用端口号-测试服务器ip地址：测试服务器应用端口
注意事项
（源代码转移到了github，敬请注意）
1）Linux平台，内核2.6+，需要支持netlink机制
2）TCPCopy中的tcpcopy和interception orintercept程序运行需要root权限
3）interception(intercept 0.5+)在同一台机器只需要运行一个实例，多个实例不支持
4）TCPCopyclient需要连接测试服务器的36524端口，所以要对外开放36524端口
5）TCPCopy由于依赖于抓包函数，压力大的时候，抓包函数本身不可靠，所以会丢包，进而丢失请求
6）由于interception(intercept 0.5+)程序密切跟ip queue内核模块相关，
所以当压力很大的时候请求丢失率很高，需要优化sysctl系统参数才能达到好的效果
（通过cat /proc/net/ip_queue，查看ip queue运行情况，如果Queuedropped的数值
不断增大，则需要修改ip_queue_maxlen参数，比如echo 4096>/proc/sys/net/ipv4/ip_queue_maxlen；
如果Netlinkdroppedde的数值不断增大，修改net.core.rmem_max和net.core.wmem_max
参数,比如sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216）
7）对于0.5版本以下的版本，复制同一台机器进程之间的请求，也即LocalRequests，
如果出现Messagetoo long，请设置lo MTU不超过1500，并且在配置文件中不要
设置127.0.0.1地址，要设置内网或者外网地址；0.5版本没有此问题
8）对于0.5版本以下的版本，TCP segmentation offloading相关问题（要注意网卡tso和gro
要关闭）如果tcpcopy所抓的数据包大小超过MTU（比如出现Messagetoo long），那么
由于raw socket output的原因，需要你改变在线设置，比如：ethtool -K eth1 tso off ;
ethtool -K eth1 gro off 
9）对于0.5版本及其以上版本，如果要复制127.0.0.1发出的请求到另外一台机器，需要设置-c参数
10）测试环境最好和在线环境一致，比如连接都保持keepalive
11）TCPCopy只与ip、tcp层的数据有关，如果请求验证与tcp层以上的协议有关，则系统不能正常运行。
例如：mysql连接协议，由于权限认证与tcp层上面的mysql协议有关，所以复制过去的请求会被目
标测试服务器认为非法请求，这个时候需要针对mysql协议作具体针对性的处理，tcpcopy程序才能正常运行
12）多层架构环境下，测试系统一定要独立，与在线系统没有业务关联，否则会影响在线
13）丢失请求率跟网络状况有关，最好在内网内复制请求
14）本系统不支持域名，只支持ip地址
15）针对长请求（比如上传文件），0.5版本以下不是很支持，0.5版本及其以上没有此问题
16）为了避免不必要的麻烦，关闭的时候先关闭tcpcopy，然后再关闭interception
总结
如果你对上线没有信心，如果你的单元测试不够充分，如果你对新系统不够有把握，如果你对
未来的请求压力无法预测，如果你想对比诸如apache和nginx的性能，如果你想放大在线流量，TCPCopy可以帮助你解决上述难题。[2]
测试举例
假设13，14是在线应用服务器，148是测试服务器（148配置和13差不多），
本地端口和远程端口都是12321（端口12321是我们的一个应用，类似于memcached应用）。
我们的目的就是为了确认目前在线服务器能否承受目前两倍的压力。
我们利用TCPCopy0.4进行测试：
目标测试服务器(148)
# modprobe ip_queue (if not run up)
# iptables -I OUTPUT -p tcp --sport 12321 -j QUEUE (if not set)
# ./interception 
在线服务器(13):
# ./tcpcopy xx.xx.xx.13 12321 xx.xx.xx.148 12321 
在线服务器(14):
# ./tcpcopy xx.xx.xx.14 12321 xx.xx.xx.148 12321 
13记录:grep 'Tue 11:08'access_0913_11.log |wc -l :89316，每秒处理1489次请求
14记录:grep 'Tue 11:08'access_0913_11.log |wc -l :89309，每秒处理1488次请求
148记录:grep 'Tue 11:08'access_0913_11.log |wc -l :178175，每秒处理2969次请求
请求丢失率为：(89316+89309-178175)/(89316+89309)=0.25%
从上面可以看出一台在线服务器能够承受目前压力的两倍。
我们来看负载情况：
TCPCopyclient自身负载占到12.3%和14%，TCPCopyserver占到17%，从负载来看，均不高。
内存也占得不多。