百度TcpCopy,得到的结果是:TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去。曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。现在此工具已经广泛应用于各大互联网公司。近期接触到的项目就是关于线上引流的,因此普及了一下tcpcopy的架构。

TcpCopy顾名思义,就是一个可以将tcp流量复制的工具(其实也可以复制UDP)。有了这样一个工具,我们就可以真实的复制线上流量,然后将这些流量复制到我们的测试服务器上。这样就可以很容易模拟线上真实用户的访问,做一些功能上的,性能上的测试。而且经过实际测试发现TCPCopy对线上机器的资源消耗也是极低的。而请求复制,一般分为两类:

1)基于应用层的请求复制

2)基于底层数据包的请求复制

传统的做法一般从应用层面进行复制,比如基于服务器的请求复制,这种复制的好处就是实现起来相对简单,但也存在着若干缺点:

1)请求复制从应用层出发,穿透整个协议栈,这样就容易挤占应用的资源,比如宝贵的连接资源
2)测试跟实际应用耦合在一起,容易导致对在线系统的影响,比如有些基于服务器的复制,会导致用户请求的处理时间取决于最慢的请求处理时间(max(真正的请求处理时间,被复制的请求请求处理时间))
3)很难支撑压力大的请求复制(据若干用户反映,这种类型的请求复制,曾经严重影响在线系统)
4)很难控制网络延迟

基于底层数据包的请求复制,可以做到无需穿透整个协议栈,路程最短的,可以从数据链路层抓请求包,从数据链路层发包,路程一般的,可以在IP层抓请求包,从IP层发出去,不管怎么走,只要不走TCP,对在线的影响就会小得多。 因此从数据包的角度去做基于server的请求复制,方向是对的,而且潜力非常巨大,很可惜,tcpreplay的作者做了一点这方面的探索(flowreplay),就放弃了。

随之而来的就是TcpCopy是现在应用最为广泛的一种方式,它的 架构已历经三代,基本原理都一样,本质是利用在线数据包信息,模拟tcp客户端协议栈,欺骗测试服务器的上层应用服务。由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,因此只要基于数据包的方式,无论怎么实现(除非是tcp协议改的面目全非),都需要返回响应包的相关信息。下面就讲讲TcpCopy架构的三代演变:

1. 第一种架构

从上图可以看出,tcpcopy是从数据链路层(pcap接口)抓请求数据包,发包是从IP层发出去,测试服务器的TCP协议栈没有类似ip queue或者nfqueue的干扰,响应包会直接返回给在线机器(通过设置路由),tcpcopy可以在数据链路层捕获到这些响应包,这些响应包会到达IP层,一般最终被丢弃掉(除非是客户端IP地址就是这台在线机器的IP地址,会通过IP层,但会被TCP reset掉)。这个是TcpCopy的鼻祖 王波同学在 2009年设计并代码实现,仅仅300多行代码就支撑了网易广告投放系统的最初开发,并且上线零失误,解决上线前数百个问题,当然这个最简单的版本应用范围非常有限。 这种架构一般只能工作在同一网段,而且对于外网应用,一般只能复制单台在线流量给测试服务器,无法对网易广告投放系统进行深度问题发现和潜能挖掘。

第一种架构总结如下:

好处:

1)简单,粗暴
2)适合冒烟测试
3)测试结果比较真实

缺点:

1)相对而言,会更加影响在线,因为响应包信息全部回给在线机器了(当然这种还是比应用层面的请求复制,影响更小)
2)同一网段限制
3)对于外网应用,无法充分利用或者很难充分利用多台在线流量,从而无法为压力测试提供技术支持
4)内网应用严重受限制,因请求的客户端IP地址不能是被复制的在线机器的IP地址

2. 第二种架构

从上面图中我们可以看出,tcpcopy默认从IP层抓包,从IP层发包,与第一种架构不同的是,我们在测试服务器进行响应包的截获,并通过intercept程序返回响应包的必要信息给tcpcopy。这种架构为分布式压力测试提供了可能性,相比第一种架构,大大推动了tcpcopy的进化。
我们先从响应包的截获来分析,理论上,可以在测试服务器的IP层或者数据链路层进行截获响应包,我们具体分析如下:

1)在数据链路层抓,正常情况下,其响应数据包会返回给真正发起请求的客户端,这会或多或少影响到客户端的TCP(频繁地reset)模块,而且在压力大的时候,会给交换机、路由器甚至整个网络,带来不必要的干扰。
2)在测试服务器的IP抓响应包,正好有netlink技术来解决上面的问题,netlink是一种用户态进程与内核进行交互的技术,具体地我们可以利用内核模块ip queue(内核3.5以下版本)或者nfqueue(内核3.5或者以上版本)来达到捕获响应包的目的。
我们采用了第二种方式,也即上图中的IP层来截获响应包,当响应包传递给intercept后,我们就能copy到响应包信息的必要信息(一般为TCP/IP头部信息),传递给tcpcopy,我们还可以通过verdict告诉内核,该如何处理这些响应包,如果没有设置白名单的话,就会在IP层丢弃掉这些响应包,这时候你是无法利用tcpudmp来抓到这些响应包的(tcpdump工作在数据链路层)。
这种设计的好处就是可以支持复制多台在线流量到一台测试服务器中去,我们在intercept保留路由信息,知道响应包的相关信息该如何返回给哪一个tcpcopy实例。然而这种架构,intercept会不同程度地占用测试服务器的资源,而且ip queue或者nfqueue,并不一定能够高效工作,因而给测试,特别是高压测试和短连接压力测试,带来了很大麻烦。

这种架构总结如下:
好处:

1)支持复制多台在线流量
2)影响在线机器更小,因为一般只需要返回TCP/IP头部信息

缺点:

1)较第一种更为复杂
2)性能极限往往在ip queue或者nfqueue
3)intercept扩展性不好,受制于ip queue和nfqueue无法支持多进程进行响应包的捕获操作
4)intercept影响测试服务器的最终测试结果,特别是压力大的时候
5)无法对测试服务器进行完整测试(没有覆盖到数据链路层的出口)
6)运维不方便

第三种架构:

这个架构也是 最新架构,是为了极限测试的目的而设计的,把intercept的工作从测试服务器(test server)中offload出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的一台闲置的服务器来充当辅助服务器)上面进行截获响应包,而且把原先从IP层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了对测试机器的各种干扰(除了路由设置,其它已经没有影响了),而且大大扩大了捕获响应包的能力。当然这种测试也更加真实。

具体如下:
在运行上层服务的测试服务器test server上面设置路由信息,把待测试应用的需要被捕获的响应数据包信息路由到辅助服务器assistant server 上面,在assistant server上面,我们在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的tcpcopy。
为了高效使用,这种架构推荐使用pcap进行抓包,这样就可以在内核态进行过滤,否则只能在用户态进行包的过滤,而且在intercept端或者tcpcopy端设置filter(通过-F参数,类似tcpdump的filter),达到多个实例来共同完成抓包的工作,这样可扩展性就更强,适合于超级高并发的场合。
当然这种架构需要的机器资源也更多,而且也变得更加难使用,需要了解tcp知识,route知识和pcap filter知识(类似于tcpdump过滤条件),因此推荐有条件的并且熟悉上述知识的人使用最新的架构。
总结如下:
好处:

1)更加真实
2)可扩展性更强
3)适合高并发场合
4)无ip queue或者nfqueue的各种限制
5)对测试服务器几乎没有任何性能干扰的影响
6)在运行服务的测试服务器,运维更加方便
7)不会随运行服务的服务器崩溃而崩溃

缺点:

1)操作难度更大
2)需要的机器数量更多
3)需要的知识也更多
4)assistant server(运行intercept的机器)原则上必须要和测试服务器(test server)在同一个网段
目前项目中用到的引流架构就是第三种架构,需要额外的辅助服务器,当然这也可以更加真实的模拟线上的情况。

网站压力测试的几种方法相关推荐

  1. webbench网站压力测试工具的使用方法

    下载该工具(下载地址:http://www.ibiblio.org/pub/Linux/apps/www/servers/) #whereis webbench #/usr/ports/benchma ...

  2. 几种网站压力测试工具调研与使用

    在项目上线之前,都需要做压力测试,目的是看下我们的网站能抗住多少的压力,能承担多少并发,如果不做压力测试,一旦出现大访问量时,我们的网站会挂掉.因此,我们对现有较流行的几种网络压力测试工具进行了简单调 ...

  3. apache修改最大连接并用ab网站压力测试

    apache修改最大连接并用ab网站压力测试 apache 2.2,使用默认配置,默认最大连接数是150 1.首先在httpd.conf中加载httpd-mpm.conf配置(去掉前面的注释): # ...

  4. 网站压力测试工具webbench 安装与使用

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好用,安装使用也特别方便,并且非常小. 主要是 -t 参数用着比较爽,下面参考了张宴的文章 ...

  5. WEB网站压力测试教程详解

    WEB 网站压力测试教程详解 Web 服务处于分布式计算的核心位置,它们之间的交互通常很难测试.分布式开发.大型的开发者团队以及对代码日益组件化的期望都有可能使 Web 服务的开发变得越来越容易隐藏错 ...

  6. WEB网站压力测试方案 压力测试如何换算并发用户数

    http://wenku.baidu.com/view/bedf1a93daef5ef7ba0d3c29.html 压力测试通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大的服务级别 ...

  7. 网站压力测试工具was

    Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具.透过这套功能强大的压力测试工具,您可以使用少量的Cli ...

  8. Nginx防止大流量攻击,限制流量访问(limit_req_zone模块)以及进行网站压力测试

    文章目录 一.限流的几种算法 (一).计数器算法 (二).漏桶算法 (三).令牌桶算法 二. limit_req_zone 参数配置 三.limit_conn_module 参数配置 四.网站压力测试 ...

  9. 网站 压力 测试软件,网站压力测试软件

    这是网站压力测试软件下载,网站压力测试软件可以测试不同上网方式.不同地区.访问Web不同页面.在不同并发访问密度情况下的客户端响应时间.流量和流速,实现极高的服务器测试,数据精准.网站压力测试软件适用 ...

  10. 十大网站压力测试软件 - WEB压力测试工具介绍

    下面是十个免费的可以用来进行Web的负载/压力测试的工具,这样,你就可以知道你的服务器以及你的WEB应用能够顶得住多少的并发量,以及你的网站的性能.我相信,北京奥组委的订票网站的开发团队并不知道有这样 ...

最新文章

  1. VBS学习日记(二) 基础知识
  2. 前端JS调用微信扫一扫二维码
  3. 接到一个新需求:手机照片视频存储及备份需求整理及分析
  4. linux命令行引导iso,如何在Linux上使用命令行从可启动ISO创建可启动USB?
  5. 怎么用PHP语句做出增改删查功能,mysql语句实现简单的增、删、改、查操作示例...
  6. Dubbo源码分析(一)Dubbo与Spring集成实例
  7. html 页面缩放事件,浏览器缩放不触发window.onresize事件的BUG
  8. 我的世界MinecraftJava版开服教程(Linux)开服器开服包下载开服网站服务器开服核心开服端开服软件mac版Java启动器
  9. Fluent中级工程进阶,从5种气体燃烧模型出发
  10. android 手势高度,克制的 Android 手势插件:滑动 Home 键
  11. 两款C#开源单文件串口调试工具的源码库
  12. 大学生毕业后的档案问题如何处理
  13. C#之十八 GUI用户界面编程
  14. centos rpm漏洞补丁下载
  15. 麒麟V10服务器SP2版本离线安装MYSQL8.0
  16. Cloud Foundry 峰会进入中国 全球专家与你面对面
  17. 浅谈PageRank算法
  18. Arduino之坑(四)——TCP通信
  19. 使用NetBox实现ASP网页封装为EXE教程
  20. 网络语言为你打c,“想打定话给你”是什么梗

热门文章

  1. Linux centos7系统下JBoss7.1的部署安装
  2. Android开发CompoundButton抽象类控件类的使用UI之Radio、Check、Toggle
  3. 微信支付?一起观摩Safesound勒索病毒的骚操作
  4. 工作站性能测试软件,国产工作站“王炸”来了! 曙光桌面工作站评测
  5. Unix网络编程卷1学习总结
  6. Alexa工具条解密
  7. 搜索系统硬盘中包含指定字符串的文件的工具和方法——全文搜索、搜索文件内容(持续更新中)
  8. python — Auto_QQ连连看
  9. 【C++】 C++入门和基础
  10. 科目一知识点分类梳理