简介

TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去。
曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。
现在此工具已经广泛应用于各大互联网公司。
 

特点介绍

1)实时
2)效果真实
3)低负载,不影响在线
4)操作简单
5)分布式
6)零成本
7)意义非凡
 

功能

1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测
试工具真实地多),也可以提前发现一些bug
 
2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开
发者有信心上线
 
3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
 
4)流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求
 
5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实
 
6)热备份
 
7)实战演习(架构师必备) 
 

使用方法

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可以帮助你解决上述难题。

性能测试:tcpcopy的更多相关文章

  1. 基于TCPCopy的Dubbo服务引流工具-DubboCopy

    TCPCopy顾名思义,就是一个可以将tcp流量复制的工具(其实也可以复制UDP).有了这样一个工具,我们就可以真实的复制线上流量,然后将这些流量复制到我们的测试服务器上.这样就可以很容易模拟线上真实 ...

  2. 数据库性能测试---前阿里数据库团队资深DBA杨奇龙

    杨奇龙 前阿里数据库团队资深DBA 主要负责淘宝业务线,经历多次11.11,有海量业务访问DB架构设计经验. 目前就职于有赞科技DBA,负责数据库运维工作,熟悉MySQL 性能优化,故障诊断,性能压测 ...

  3. goreplay,tcpcopy

    流量拷贝工具试用 https://github.com/buger/goreplaynginx mirror openresty 通过lua tcpcopy 支持 HTTP 请求的录制和重放,可以在线 ...

  4. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  5. 性能测试工具 wrk 安装与使用

    介绍 今天给大家介绍一款开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以 ...

  6. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

    .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...

  7. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  8. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  9. PostgreSql性能测试

    # PostgreSql性能测试 ## 1. 环境+ 版本:9.4.9+ 系统:OS X 10.11.5+ CPU:Core i5 2.7G+ 内存:16G+ 硬盘:256G SSD ## 2. 测试 ...

随机推荐

  1. MiL → SiL → PiL → HiL 是什么?

    基于模型的快速原型开发通常分为四个过程:MiL → SiL → PiL → HiL 1. MiL(Model in Loop)模型在环  在PC上基于模型的测试,它的输出是经过验证的控制算法模型.验证 ...

  2. CSS3 用border写 空心三角箭头 (两种写法)

    之前一直在寻找这种空心三角箭头, 终于知道了原理! 自己记录一下,顺便分享给之前跟我一样想要的撸友们~ 第一种写法 利用常见的 after伪元素 <!DOCTYPE html> <h ...

  3. iview table表中使用render函数props传值出现问题

    使用iview中的table表格时避免不了使用render函数渲染自定义内容,或者渲染组件.但是在正常使用时出现了props传值无法识别, 按照官网介绍使用props如下: render: (h, p ...

  4. vue2.0开发聊天程序(八) 初步完成

    项目地址 服务器源码地址:https://github.com/ermu592275254/chat-socket 网页源码地址:https://github.com/ermu592275254/ch ...

  5. JavaScript 的Date构造函数太迷惑了。。。

    1 new Date(2021,0,1,0,0,0,0) ===> Fri Jan 01 2021 00:00:00 GMT+0800 (中国标准时间) 2 new Date(2021,1,1, ...

  6. 三种获取数据的方法fetch和ajax和axios

    一 .fetch用法 ( 本人比较喜欢fetch,代码精简,虽说目前axios比较流行,但是fetch很多大厂已经开始用fetch开始封装了, 我觉得以后fetch会取代axios和ajax ) 1. ...

  7. JavaFX入门及相关问题

    下个星期是我们专业的课程设计专周,主要是做一个Java的桌面应用程序,老师上课讲的是用Swing来开发图形化界面,但是听朋友说到一个可视化的图形界面工具JavaFX,本 人愚笨,弄了一天才大致调试完成 ...

  8. 取地址与解引用 C指针浅析

    C语言指针入门需要掌握的两个概念就是取地址&和解引用*,下面我们按例子来理解这两个符号的使用. int main() { int a = 0; int* pa = &a;//取地址操作 ...

  9. MySQL---什么是事务

    什么是事务 一个数据库事务通常包含对数据库进行读或写的一个操作序列.它的存在包含有以下两个目的: 为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方 ...

  10. 踩了个DNS解析的坑,但我还是没想通

    hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...