利用tcpcopy引流做模拟在线测试
2012-05-29 18:46:44 来源:我爱运维网 评论:0 点击:
nl_header->nlmsg_len=NLMSG_LENGTH(sizeof(struct ipq_verdict_msg));
nl_header->nlmsg_flags=(NLM_F_REQUEST);
nl_header->nlmsg_pid=getpid();
nl_header->nlmsg_seq=seq++;
ver_data=(struct ipq_verdict_msg *)NLMSG_DATA(nl_header);
ver_data->value=NF_DROP;
/*如果要accept这个包,则设为NF_ACCEPT)*/
ver_data->id=packet_id;
memset(&addr,
0
,sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_pid =
0
;
addr.nl_groups =
0
;
sendto(firewall_sock,(
void
*)nl_header,nl_header->nlmsg_len,
0
,
(struct sockaddr *)&addr,sizeof(struct sockaddr_nl));
内核接收到这个包后将packet_id这个包drop或accept。在后文中可以看到从0.4版本开始的tcpcopy利用这个特点保留了一个允许访问的ip列表,因为默认情况下访问测试前端机上nginx服务所得到的结果会在ip层被drop掉,造成在80端口上无法访问nginx。有了这个允许ip列表,即使是刷了iptables规则、起了interception进程,在某些机器上也是可以正常访问测试前端机上的nginx服务的。
三、操作方法
下载地址:http://tcpcopy.googlecode.com/files/tcpcopy-0.3.3.tar.gz,下载tcpcopy源码包后解压,执行常规的./configure;make;make install三部曲即可。
假如有两台机器:
机器A:线上前端机,ip:61.135.xxx.1;
机器B:测试前端机,ip:61.135.xxx.2;
两台机器上都起了nginx服务,操作者在两台机器上都需有sudo权限。
操作步骤:
1. 在B依次执行,
1) 加载ip_queue模块,modprobe ip_queue;
2) 配置iptables规则,sudo iptables -t filter -I OUTPUT -p tcp –sport 80 -j QUEUE;
3) 启动tcpcopy服务端,sudo ./interception & ;
2. 在A上执行,
启动tcpcopy客户端,sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 &;
如果在A上看到“I am booted”,则表示操作成功,tcpcopy已经开始工作,可以查看一下机器B上nginx的日志确认。
四、高级用法
1. 级联
设有线上前端机一台命名A,测试前端机若干B,C,D,……利用tcpcopy可以将A上的访问流量拷贝到B,B拷贝到C,C拷贝到D,……这样就将一份流量放大了多倍,可以用来测试引擎的极限承受能力。
2. 同一tcpcopy实例内多重复制
从0.4版开始,tcpcopy支持在同一个客户端实例复制多份请求到同一个服务端,启动的方式如下(比如要复制2份,使用-n这个选项来控制要复制的份数),
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80;
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 1;
sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 2;
3. 服务端允许访问ip列表
由于配置了iptables规则,使用tcp协议且源端口号为80的包都会被匹配放到目标QUEUE去,进而被drop掉,因此这个时候测试前端机上的nginx服务是不可访问的。从0.4版本开始,可以指定一个允许访问ip列表,在列表中的机器上是可以访问测试前端机上的nginx服务的。假如要添加61.135.xxx.3,61.135.xxx.4到允许ip列表,启动interception时使用如下方式:
sudo ./interception 61.135.xxx.3:61.135.xxx.4;
五、tcpcopy在一淘的应用
一淘引擎在今年2月份时有一次重大的更新,在上线之前,利用tcpcopy把所有前端机的流量拷贝到新的demo前端机上,进行在线模拟实验。引流示例如下图:
所有线上前端机都开启tcpcopy客户端,由于一直报”Message too long”(这是由于packets长度超过1500造成,每分钟差不多有50个)刷屏,所以将stderror重定向,
sudo ./tcpcopy ipA 80 ipB 80 2>/dev/null &
在测试前端机上开启tcpcopy服务端程序interception,并设置iptables规则。
压了大约有一个星期,期间观察qps,load等各项指标是否正常。新引擎单个集群一天的平均qps大约是110,峰值大约240。实验结果显示的包丢失率大约是(1822213-1797242)/1822213=1.37%. 后来进一步将多个线上前端机的流量引到一个测试前端,测试新引擎的单集群极限服务能力,qps能达到1000以上, latency大约40ms,达到了上线要求。
Tcpcopy客户端和服务端本身占用的资源较少,不影响在线服务。
13991 root 20 0 160m 77m 888 R 7.7 0.3 71:26.24 tcpcopy
上一篇:第一页
下一篇:WebCDN流量及QOS异常故障RC查找与经验分享
评论排行
- ·Windows(Win7)下用Xming...(92)
- ·使用jmx client监控activemq(20)
- ·Hive查询OOM分析(14)
- ·复杂网络架构导致的诡异...(8)
- ·使用 OpenStack 实现云...(7)
- ·影响Java EE性能的十大问题(6)
- ·云计算平台管理的三大利...(6)
- ·Mysql数据库复制延时分析(5)
- ·OpenStack Nova开发与测...(4)
- ·LTPP一键安装包1.2 发布(4)
- ·Linux下系统或服务排障的...(4)
- ·PHP发布5.4.4 和 5.3.1...(4)
- ·RSYSLOG搭建集中日志管理服务(4)
- ·转换程序源码的编码格式[...(3)
- ·Linux 的木马程式 Wirenet 出现(3)
- ·Nginx 发布1.2.1稳定版...(3)
- ·zend framework文件读取漏洞分析(3)
- ·Percona Playback 0.3 development release(3)
- ·运维业务与CMDB集成关系一例(3)
- ·应该知道的Linux技巧(3)