当前位置:   article > 正文

新浪微博百万用户分布式压测实践手记

100万用户量并发压测

作者:聂永,新浪微博技术专家。负责移动端消息应用架构底层基础设施维护和优化等,目前致力于推广性能驱动模式推动系统健康发展的理念。
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅《程序员》

微博产品后端服务团队在资源受限情况下基于Tsung提供了一套开箱即用的100万用户性能压测工具套件,推动两名能力和经验都欠缺的中初级工程师,不但顺利完成支持海量用户的在线聊天室项目任务,同时保证了该业务系统整体处理性能可控并按照预期方式向前推进。

需求 & 背景

前段时间我们为微博App增加一个视频直播聊天室功能,这是一个需要支持海量级手机终端用户一起参与、实时互动的强交互系统,建立在私有协议之上、有状态的长连接TCP应用。和其他项目一样,在立项之初,就已确定所构建系统至少能够承载100万用户容量,以及业务处理性能最低标准。

当时研发力量投入有限,一名中级工程师 + 一名初级工程师,两人研发经验和实践能力的欠缺不足以完成系统容量和处理性能的考核目标,这是摆在眼前最为头疼问题。聊天室业务逻辑清晰并已文档化,倒不用太担心功能运行正确,除了自我验证外,还会有QA部门帮忙校验。这驱使我们在软件工程角度去思考,如何通过行之有效的手段或工具去推动研发同学项目顺利完成项目性能考核目标。

图5  聊天室会话实例

聊天室会话实例

延伸一下,新项目构建之初,自然要关注总体处理性能目标的。但从软件生命周期角度考虑,还应该考虑到系统后续维护和迭代。所谓工欲善其事,必先利其器,因此我们需要提供一个完善的开箱即用、支持海量用户的性能压测基础工具套件,既要能够保证系统处理性能是可测量的,又要能够为每一次版本发布时、常规迭代后再次验证系统性能目标。带着这一目标,下面将逐一展开我们如何构建百万用户性能压测工具套件的过程以及注意事项。
图1  性能贯穿于软件生命周期

性能贯穿于软件生命周期

性能压测工具选择

团队所能够支配的空闲服务器数量几乎为零,这是现状。所负责业务线的大部分服务器配置为16GB内存、24个CPU核心左右,每时每刻都在跑着具体的业务。若留心观察,一般晚上九、十点之后资源利用率高,而白天时间CPU、内存、网络等资源大概会剩余30%-60%左右,颇为浪费,如何将这部分资源充分利用起来,是一个需要思索的问题。

针对100万用户这样超大容量压测需求,要求每台压测机要能够负载尽可能多的用户量。试想,若一台压测机器承载1万用户,那么就会需要使用到100台,单纯所需数量就是一件让人很恐怖的事情。

若是单独为性能压测申请服务器资源,一是流程审批流程较为繁冗,二是因为压测行为不是每时每刻都会执行高频事件,会造成计算资源极大浪费。本着节约资源理想方式就是充分利用现有的空闲计算资源用于执行性能压力测试任务。

【众多选择】
当前市面上能够提供性能压测的工具很多,选择面也能很广泛,下面我将结合实际具体业务逐一分析和筛选。
TcpCopy
线上引流模式,针对新项目或全新功能就不太合适了,业务层面若需要一定量的业务逻辑支持,很难做得到。

JMeter
Java编写,在执行1万个压测用户线程时,CPU上下文切换频繁,大量并发时会有内存溢出问题,很显然也不是理想的选择。

nGrinder
图表丰富,架构很强大,堆栈依赖项太多,学习成本很高。
需要额外掌握Python等脚本语言,虽针对程序员友好,不是所有人都可以马上修改。
数十个线程至少占用4GB内存,一台机器上要模拟5万个用户,不但CPU上下文切换恐怖,16GB小内存机器更是远远满足不了。
针对服务器资源充足的团队,可以考虑单独机器部署或Docker部署组成集群,针对我们团队情况就不合适了,想免费做到是不可能的。

Tsung
完成同样性能压测功能,却没有第三方库依赖,独立一套应用程序。
虽然所测试服务是I/O密集型,但所占用内存不会成为瓶颈。
可能会触及到Erlang语言,但我们现在工作用的语言就是Erlang,也就不存在什么问题了。

其他

综合所述,Tsung默认情况下消耗低,可充分利用现有服务器空闲计算资源,线上多次实践也证实资源占用始终在一个理想可控的范围内,具有可让百万用户压测执行的费用成本降低为0的能力,这也是我们选择Tsung的目的所在。

【为什么是Tsung?】

Tsung是一个有着超过15年历史积累的性能压测工具,本身受益于Erlang天生支持并发和分布式以及实时性的特性,其进程的创建和运行非常廉价,一台机器上轻轻松松创建上百万个进程。其提供一个用户对应一个进程的隔离处理机制,单机支持虚拟用户的用户数量可支持若十万、百万级别,只要机器资源充足(但总体来讲受制于受制于网络、内存等资源,后面会具体解释)。单机计算能力总是有限的,Tsung的目的就是要把多台服务器横向扩展成分布式集群,从而可以对外提供一致的海量性能压力测试服务。

协议层,Tsung不但支持TCP/UDP/SSL传输层协议等,而且应用层协议,已支持诸如WebDAV/WebScoket/MQTT/MySQL/PGSQL/AQMP/Jabber/XMPP/LDAP等。默认情况下,开箱即用,凭借着社区的支持,市面上能够找到的公开通用协议,都有相应官方或第三方插件支持。

和nGrinder相比,Tsung定位于提供一个强大的性能测试工具,在易用性和强大可扩展方面保持了一个平衡点。基于XML + DSL提供可配置、可编程的能力。比如我们可设置上一次的响应结果作为下一次请求内容,我们可配置多种业务协议、多个业务场景作为一个整体压测等。尽力抽象所要压测的情景吧,你不会失望的。
服务资源占用方面,以单机模拟5万长连接用户为例,有数据正常交互情况下,内存占用不到3GB,CPU占用不到

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/901581
推荐阅读
相关标签
  

闽ICP备14008679号