假设我们要上线一个两年内不会宕机的先进架构。在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试。
但这些步骤非生产环境下正式用户的行为。或许你会想到灰度上线,但毕竟可能会影响到部分用户,这怎么对得起我们两年内不宕机的承诺呢?
好在网易的 王斌 开发了tcpcopy, 可以导入线上流量进行功能和压力测试。
tcpcopy介绍
tcpcopy
是一种请求复制工具。可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。也可以通过放大流量,进行压力测试,评估系统承载能力。
tcpcopy
可以从线上服务器的IP
层抓取在线请求的数据包,修改相关属性,利用raw socket output
技术(packet injection
技术之一)将其发送给测试服务器进行测试。
发送到测试服务器的数据包会在TCP/IP
协议栈被识别,其中带有payload
(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP
协议栈。
在测试服务器上启用ip_queue
模块,并使用iptables
在IP
层将响应结果数据包发往QUEUE(ip_queue
)。
测试服务器上运行在用户空间
的拦截程序(intercept进程),通过打开netlink
的socket接受内核通过ip_queue
所传递来的网络数据包(即上层应用的响应内容)进行裁定,将结果返回内核,进行出队列的操作。intercept进程默认会丢弃上层应用的响应内容,返回ip header,以释放tcp连接。
intercept进程也可以通过-x
(passlist)参数,不drop指定ip lists发出请求的响应内容。默认drop是为了:
减少出口带宽占用,节约成本不影响客户端(线上服务)的`TCP/IP`协议栈不会在互联网上产生ghost数据包
tcpcopy工作流程
如上图,tcpcopy拷贝一次流量访问的步骤如下:
① 一个访问到达线上前端机;② socket数据包在ip层被拷贝了一份传给tcpcopy进程;③ tcpcopy修改包的目的及源地址,发给目标测试机;④ 拷贝的包到达目标测试机;⑤ 目标测试机的nginx处理访问,并返回结果;⑥ 返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ip header并返回;⑦ ip header被发送给线上前端机的tcpcopy进程。
安装和配置
tcpcopy有两种工作模式:
实时拷贝数据包通过使用tcpdump等抓包生成的文件进行离线(offline)请求重放
如果采用实时拷贝线上流程进行导入的方式,需要分别在线上服务器和测试服务器安装tcpcopy
,对于离线模式,只需要在测试服务器上安装tcpcopy
,编译时指定 --enable-offline
。
安装步骤如下:
wget https://github.com/wangbin579/tcpcopy/archive/0.9.0.tar.gz -O tcpcopy-0.9.0.tar.gz --no-check-certificate
tar zxvf tcpcopy-0.9.0.tar.gz
cd tcpcopy-0.9.0./autogen.sh
./configure --prefix=/usr/local/tcpcopy
make
sudo make install
目标测试机配置
线上服务器拷贝的数据包发送至测试服务器进行处理之后,测试服务器需要通过iptables
将响应结果发送至QUEUE(ip_queue
),这样测试服务器上运行的intercept
拦截进程才能通过打开的netlink
socket获取传递过来的数据包并进行裁定。所以测试服务器上需要开启iptables
防火墙,并启用内核模块ip_queue
modprobe ip_queue
/etc/init.d/iptables start
因为线上服务器需要和目标测试服务器通信,传递请求数据包和控制信息(封装的ip packet header),所以需要在测试服务器上添加相关iptables
防火墙规则。编辑/etc/sysconfig/iptables
,添加:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80-j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 36524-j ACCEPT
然后重启iptables
/etc/init.d/iptables restart
接着执行:
iptables -I OUTPUT -p tcp --sport 80-j QUEUE
将响应结果发送至QUEUE(ip_queue
),从而实现运行在用户态的进程对相关数据包进行裁定。
相关使用
本文以线上和测试机的web服务都使用80端口,传递控制信息使用默认的36524端口为例。如果使用别的端口,记得修改相关iptables
防火墙规则。
离线 offline
1) 在线上服务器抓包
tcpdump -i eth0 tcp and port 80-s 0-w online.pcap
2) 将抓包生成的文件拷贝到测试服务器
3) 在测试服务器上进行执行如下命令进行重放
cd /usr/local/tcpcopy/bin
sudo ./intercept
sudo ./tcpcopy -i /path/online.pcap -x 80-10.16.12.11:80
tcpcopy -i <抓包文件地址>-x <port>-<本地ip>:<port>
在线实时复制 online
1) 在测试服务器上启动intercept
拦截进程
cd /usr/local/tcpcopy/bin
sudo ./intercept
2) 在线上服务器复制流量到测试服务器
cd /usr/local/tcpcopy/bin
sudo ./tcpcopy -x 80-10.16.12.11:80-c 10.16.12.12
tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口-c 本地服务器ip
reference:
[^1] https://github.com/wangbin579/tcpcopy
[^2] http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html
[^3] http://hi.baidu.com/yacker/item/e6bd5b287fe5a3f150fd8731
相关推荐
2. TCPCopy与Tcpreplay的比较:TCPCopy与Tcpreplay同属于流量复制工具,但TCPCopy提供了更为深入的功能和使用场景,尤其是在测试复杂环境中的应用。 3. 影响TCPCopy的因素:这些因素包括网络环境、目标服务器的配置...
为了能够更真实的测试,我们开发了一款线上流量复制工具-TCPCopy,它可以使用线上真实的流量来对测试环境中的服务器进行测试。目前,TcpCopy技术已经在中国很多公司大量使用。 二、使用场景: 1)分布式压力测试 ...
tcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源二年以来,功能上越来越完善。 如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对未来的请求压力...
TCPCopy是一款强大的在线压力测试工具,主要用于模拟真实线上环境,帮助开发者在程序未正式上线前发现潜在的性能问题和bug。与传统压力测试工具,如abench相比,TCPCopy的优势在于其实时性和真实性。它能近乎无损地...
总的来说,tcpcopy是一款强大的TCP压力测试工具,尤其适用于大型互联网公司,可以帮助开发者在复杂网络环境中,对服务器性能进行深度测试和优化。通过掌握和运用tcpcopy,开发者可以更好地理解和改善其应用程序在...
TCPCopy是一款强大的网络流量复制工具,主要用于在线压力测试,它可以将线上生产环境的网络流量实时复制到测试环境中,以实现对系统性能的精准评估。本文档主要介绍如何部署TCPCopy及其相关组件,包括所需的运行环境...
tcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源二年以来,功能上越来越完善。 如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对未来的请求压力...
【系统测试与质量保障经验沉淀】TCPCopy在架构测试中的应用 ...对于大型在线服务和高并发场景,TCPCopy是进行系统测试和质量保障的有力工具。通过实际案例的分析,我们可以看到它在评估和优化服务器性能方面的价值。
使用tcpcopy进行压力测试时如何查看压力情况。使用tcpcopy进行压力测试的时候如何查看压力是否上来?其实这个疑问我最初的时候就已经有了。关于性能测试,我的理解是用工具产生压力后首先要做的是要查看压力是否上来...
tcpcopy的设计目标是帮助开发者和测试人员进行性能测试、稳定性测试、压力测试、负载测试以及冒烟测试,以确保系统在不同条件下的表现和可靠性。 在性能测试中,tcpcopy可以复制真实的用户请求到测试环境中,从而更...
在Linux环境中进行TCP服务器压力测试是一项关键的任务,它有助于评估和优化服务器的性能,确保在高并发场景下系统的稳定性和可扩展性。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,广泛...
在进行大型文件传输、多人在线游戏或者云服务时,压力测试能确保网络在高流量下仍能正常运作。这种测试对于网络服务商和企业IT部门来说尤其重要,他们需要确保提供的服务在各种条件下都能保持高质量。 再来说说宽带...
本文将详细介绍如何使用JMeter进行TCP服务器的并发压力测试,包括环境搭建、软件下载与安装、以及具体的操作实例。 首先,要使用JMeter进行测试,需要确保你的环境中安装了JDK(Java开发工具包)。JMeter要求JDK...
在进行TCP压力测试时,我们通常会使用专门的工具来模拟大量并发的TCP连接,以检查服务器的承载能力、响应时间和稳定性。这些工具能够帮助我们发现系统在高负载下的潜在问题,如资源瓶颈、性能下降或者服务崩溃。 ...
它允许用户将实际生产环境中的网络流量复制并重放到测试环境中,以便进行各种测试,如性能测试、稳定性测试、压力测试、负载测试和冒烟测试。这些测试对于确保应用在上线前达到预期性能和可靠性标准至关重要。 tcp...
进行TCP与UDP的压力测试是为了评估服务器在高负载下处理网络请求的能力,确保其稳定性和性能。 标题“TCP_UDP压力测试工具”暗示了我们讨论的主题,即用于测试服务器在TCP和UDP协议下承受大量并发连接能力的软件...
本主题聚焦于"C++ TCP压力测试",旨在探讨如何利用C++来构建TCP服务器端,并进行性能评估。下面我们将深入探讨相关知识点。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的可靠性主要体现在...
【服务器压力测试工具(TcpServer Test Tool)】是一款专门用于测试服务器性能的工具,它能够模拟大规模并发连接,以及各种数据包发送模式,为开发者和系统管理员提供了强大的服务器负载和稳定性测试能力。...
本文将详细介绍路由器压力测试工具的功能、工作原理以及如何进行有效的路由器性能测试。 一、路由器压力测试工具的功能 1. **模拟大量并发连接**:这些工具可以模拟多个客户端同时访问路由器,以测试其处理并发请求...