注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

anqiang专栏

不要问细节是怎么搞的,源码说明一切

 
 
 

日志

 
 

一个复制线上流量的工具:TCPCOPY  

2012-01-19 14:47:12|  分类: C++相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这一个月一直在做一个应用服务的重构工作,代码写了一大堆,感觉C++开发能力提高了不少。代码开发好以后,功能回归测试,压力测试,QA测试都通过,迫不及待的上线。上线前很兴奋,终于可以在线上看到效果了,可惜高兴的太早,服务上线不到两分钟,CORE出现,切流量,功能回滚。

接下来的几天茶饭不思,纠结于找bug中,奇怪的是在线下一直压力不出问题,在线上就CORE。尝试了N中办法,最终找到是一个字符串归一化函数对STL分配的内存(内部维护的有一个内存池,可以参考侯捷老师的《STL源码剖析》)做了操作,而这种操作可能会越界,由于是STL管理的内存,所以越界后不会理解CORE出来,只有STL访问到这片脏数据后才会发生分配内存的问题,这种错误也是最难调的,因为它有可能CORE代码的任何一个位置,仿佛是声东击西,让人摸不着头脑。这里有一条经验可供参考,不要拿STL申请的内存做修改操作。

言归正传,由此想到一个问题,即使经过了三道关,程序依然会出问题,那么怎样才能在上线前对应用服务的性能情况有一个较为清晰的把握?最直接的想法就是导入线上的流量来对应用服务进行压测。TCPCOPY就可以做这项工作。

TCPCOPY的原理是

在线上服务器启动一项服务,将网络中发送到线上服务某个端口的报文COPY一份,将这份COPY的报文转发到测试服务器的某个端口上。

测试服务器上,为了防止对测试服务器的请求能够获取响应报文,在测试服务器上启动一项服务,对服务器某个端口的响应报文做过滤,即如果是响应报文,系统都拒绝发送。

TCPCOPY的开源页面有一个简单的配置实例,我这里做一个简单介绍:

 

目标测试服务器(148)

       # modprobe ip_queue (if not run up)

       # iptables -I OUTPUT -p tcp --sport 12321 -j QUEUE (if not set)

IPTABLE 是为构筑防火墙而设置的,这条命令是,将本机端口12321上的TCP响应报文(OUTPUT)都压入内核队列IP_QUEUE,这个IP_QUEUE队列中的报文会被应用层程序获取,对报文做检测后决定内核中该报文应该如何处理,(AF_ACCEPT 内核接受该报文,被发送;AF_DROP 内核抛弃该报文,不发送)。

       # ./interception

在目标测试机上启动一个服务器程序(默认端口为36524),主要用于与线上服务器的通讯,已经对12321端口的响应报文进行过滤。(通过Netlink Socket实现)

 

在线服务器(13):

       # ./tcpcopy xx.xx.xx.13 12321 xx.xx.xx.148 12321

实现与目标测试机服务器程序(36524)的连接,同时负责将网络请求12321的报文复制并发送到目标测试机的12321端口

  评论这张
 
阅读(1475)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017