如何让压力测试产生平稳的机器人曲线——压测后台的一次优化历程

作者介绍:Robben,腾讯高级开发工程师。工作多年,长期从事后台的开发、架构设计、优化等方面的相关工作。商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。

WeTest导读

对技术人员来说,知其然还需知其所以然——搞清技术的底层机制、弄明白问题的深层次原因、知悉解决方案的适用场景,是每个开发人员应有的技术素养,也是个人发展上积累功底、产品生命上维持稳定所必须的。

问题背景

8月推送的《当压测遇见奥运 ——游戏服务器如何在上线时面对用户的洪荒之力》中提到了机器人模拟测试是对各类已有的压力测试方法做了一个平衡, 通过高还原真实玩家的用户行为,模拟高并发场景,从而得到类似很多人同时游戏的测试效果。
其中通过模拟机器人测试有四个优势:
1、 高还原游戏玩法,深度模拟真实用户行为;
2、 并发性不受限制,从1W到10W,压力能够自主设置;
3、 可以反复执行,便于性能调优回归;
4、 实现7*24小时不断监控。
在开发提交代码之后,版本在自动编译之后就跑新的测试,这样每天都能进行性能监控,在调优方面,完全的进行一个重复性测试,可以不断的进行回归和调优。这个方法的问题就在于机器人模拟需要专人开发,对测试者的开发能力,分析能力都有一个比较高的要求。

而要开发一款进行服务器性能测试的机器人,需要通过建模、分析、开发三个步骤,那么今天我们就要来介绍一下,具体在开发服务器性能测试机器人的时候,如何让它表现的更像人?有更加平稳和正常的表现?

为了让介绍的内容更加形象和具有说服力,我从我们自己的产品开始介绍,扒一扒腾讯WeTest服务器性能测试在开发机器人的过程中遇到的一些坑。

WeTest平台的服务器压测,支持用户在一个测试用例中定义递增的机器人数量,通过逐步增压的方式,来探索服务器的实际承受能力。从下图的机器人压力曲线图可以获取直观的概念:

曲线统计的是每个时刻连接到服务器并且进行业务数据收发包的在线机器人个数,由曲线看上去,可以感受到压力是平稳递增的(中间有微小下跌,是因为当前的模式下,会在不同的阶段更新和重启机器人,这个也是后面会优化之处)。然而,为了在测试结果报告中画出这样一张合理的图,也是经历了几番折腾,总结一下,还是蛮有意思的。

优化历程

对于上图描述的同一个压力逐渐递增的测试用例,经过了许多版本的迭代才能得到最终的效果,最早版本的机器人压力曲线,统计生成后出现了这样的问题:

【问题】模拟机器人在开始的十几秒内,压力还算有些头绪,后面某个时刻,就经历了急剧的下跌,之后就完全无规律可循了。

【分析】经过定位,这个阶段的问题是,我们的压力测试工具在响应包较大时,会出现接收缓存区数据被并发写入而数据污染的情况,导致程序core掉。经过快速的修改调试,问题终于被修复。OK,压力曲线应该会比较平稳了吧。

然而理想很丰满,现实很骨感,模拟机器人依然存在问题:
【问题】在大概二十秒内的时间,还是比较平稳地增增减减,维持在一个稳定的水平。然后到二十秒后,又会出现急剧地下降,压力上不去,大概半分钟后,反扑,上升,没多久再急剧下降。。。

【分析】首先查看压力工具的运行逻辑,一切正常;程序,没core,一切正常;日志错误,没有,一切正常。那压力为何上不去呢?查看系统的各种运行时数据,终于发现了问题所在:

原因1:由于咱们的机器是部署在合作伙伴腾讯云这里的,机器拿到后也并未进行大的配置调整,所以系统默认可用的端口范围还是比较小的,如下图:

而作为一个模拟机器人的压力机,必然会在短时间内并发和服务器建立大量的连接,所以本地的端口号是必须大一点的,直接改文件,增加范围,搞定:

原因2:其实就是经典到有些老生常谈的TCP timewait问题了。因为我们压力机的机器人,会并发建立很多短连接,并且每次都由机器人主动断开短连接,所以导致系统中存在大量的timewait连接。直接结果就是没法建立新的连接,在线机器人数量上不去。

这里简单地提两个要点:
a) timewait是在TCP连接的主动发起方才有的状态,一句话概况,它是为了防止“主动断开连接方发送的最后一个ACK包异常,导致被动关闭防会重发FIN请求,影响该四元组上的下一个连接的正确性”这一问题而设计的,通过主动关闭方等待2*MSL,即两倍的报文生存期的时长来避免。如此,报文一来一回的时间都等完了,大概率保证了确实没异常了。继而,系统中也就常常会出现大量的timewait连接。

b) 解决的方法,一般是把两个内核参数:net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都改为1,前者指启动time wait连接的快速回收,后者指让time wait的四元组可以快速用于新连接。
然而两个优化都是有需要注意之处的:
对于第一个参数,当它置1后,为了解决timewait设计时出发点的风险,新来的连接请求在如下情况会被拒掉:同一客户端IP在某时间窗内的新连接时间戳变小。虽然一般是不会存在这种情况的,但是,对于NAT而言,则天然容易出现这个问题:A连接服务器 -->B连接服务器 --> B 先被accept --> A(同一NAT IP)请求到了服务器 --> A请求被据。
对于第二个参数,一般认为,它不太能解决纯服务端的资源占用问题,因为四元组虽然能用了,但资源还是没释放;但对于有客户端性质的情况是适用的,如连接mysql的服务端php进程。
了解了这些之后,我们的压力机,既不存在要响应NAT过来的客户端请求的情况,又不存在服务器端的特点,所以天然是非常适合用这两个内核参数的优化的。
经过这一轮系统参数的优化后,在线机器人数量基本稳定了:

因为是短连接,所以在线机器人的数量曲线并不是水平的,但至少可以一直保持较高的并发。更进一步,我们在产品的实现层面又做了优化,开放长短连接配置给用户,同时对于HTTP协议的简单模式,仿照真实的浏览器行为,将默认行为置为长连接。这样,就会出现文章开头的理想曲线了:

总结感受

其实本文中的优化只是非常小的一个点,也没有什么惊心动魄的过程与艰深晦涩的理论,几轮优化着手点涉及的概念范畴也杂,但却是一个真实的逐步解决问题的典型。
在这个网络发达,信息爆炸的时代,基本上对于每个技术点或者问题,都可以迅速地获取到大量资料。关键是对于技术的实现原理和问题的解决方案,却不能仅仅知其然,还必须知其所以然——搞清技术的底层机制、弄明白问题的深层次原因、知悉解决方案的适用场景,是每个开发人员应有的技术素养,也是个人发展上积累功底、产品生命上维持稳定所必须的。

而腾讯WeTest的压力测试团队正是运用了沉淀十多年的内部实践经验总结,通过基于真实业务场景和用户行为进行压力测试,推出一套面向游戏业务的综合性应用性能管理解决方案,该方案旨在帮助游戏开发者发现服务器端的性能瓶颈,进行针对性的性能调优,降低服务器采购和维护成本,提高用户留存和转化率。

目前腾讯WeTest服务器性能测试已经正式对外开放,业务场景模拟,持续压力触达服务器极限,帮助寻找服务器性能问题!点击链接:http://wetest.qq.com/gaps/立即体验!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容