腾讯自己的直播答题,如何实现稳定的性能输出
作者:oliver, 腾讯压测大师团队产品经理
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。
原文链接:http://wetest.qq.com/lab/view...
WeTest 导读
对症活动上线服务器崩溃,有疗效。
项目背景
2017年下旬开始,“直播答题”活动突然在各大直播,短视频应用集中的开展了起来,动辄上百万的奖金吸引了大量用户的参与。主要的玩法是,主持人出选择题,然后用户会收到题目,然后选择答案。大家都选择完后,主持人公布答案。12道题一场,答对题目才能进入下一题作答。12题结束后公布结果全部答对的人数,发放奖金。一场直播每人可以分到几十元甚至百万元,越来越多的人希望用自己的智商赚点零花钱。
直播答题有多火?多个直播平台服务器多次遭到宕机。就传统视频直播而言,直播间通常在线用户人数是少几万人,通常情况下超过五万的不多。而对直播答题来说,直播间在线用户人数超过百万那是很平常的事情,某一线直播平台旗下的直播答题直播间在线人数更是突破了五百万人。而且所有用户都是在活跃答题的,这是传统视频直播不曾面对过的压力。
实际上,许多APP在上线之初,完全不了解自己可能承受多大的并发,他们或许还没有想到自己会火得这么快。很多APP也就因此出现了在线用户无法进入游戏、技术故障导致游戏被迫临时取消等情况。
腾讯NOW直播也在自己的平台上开发了答题玩法——”全民闯关”,为了能够避免出现各大直播答题平台出现的性能问题,让答题活动能够顺利的赶上风口,实现优质的产品服务,NOW直播的测试团队与腾讯WeTest压测大师进行了合作,对“全民闯关”活动进行了系统的压测,腾讯WeTest压测大师也将其整理成了“在线知识竞技压测解决方案”。
一、业务流程
直播答题活动在业务流程中,主要体现为以下几个重要节点:
1.用户进入直播间
2.主持人发出派题指令;
3.题目信息通过网络送达给用户;
4.用户通过网络拉取题目信息;
5.如题目信息包含完整内容,则下一步,如果只有题目 ID,则到业务服务器查询题目内容;
6.用户把题目答案提交给答题统计分析服务器,同时得到标准答案反馈;答题统计分析服务器是分布式的集群,统计答题结果,反馈给主持人;
7.答错的用户进入复活卡使用的选择,服务器判定是否可以进入下一题
8.答题结束,进入结算页面,服务器反馈结算结果
NOW直播“全民闯关”活动业务逻辑
测试需求的产生——寻找高并发节点
NOW直播所测试场景的流量主要来自于手机QQ,跳转到H5形式的活动页面。
在活动发起的一开始,NOW直播方面发现整个功能在三个节点的服务器压力特别大,很容易出现服务器不稳定的问题,分别是“准点进入直播间”、“公布问题答案”以及“激活复活卡”。
准点进入直播间
公布问题答案时间
激活复活卡时间
二、技术挑战点——初步排查问题
除了显而易见的几个高并发节点,NOW直播团队发现DAU的上升不仅会给产品活动页面产生“直接压力”,也会对产品的其他节点也带来“间接压力”,为了能够找到这几个高并发节点产生问题的原因并进行优化,NOW直播方面初步排查到以下几点:
1、 直接压力:
答题类CGI可能同时触发,带来压力;DAU的上升会给原有房间CGI带来压力;
2、 间接压力:
DAU的上升会给“附近”、“发现”CGI带来压力。
实现方案
为了能够通过系统的压测排查产品CGI中存在的问题,NOW直播团队制定了详细的压测计划,包括测试前的准备工作,测试目标的制定、测试分析、测试用例配置以及问题的优化。
一、测试前准备
1、收集CGI及配置
收集本次测试需要覆盖的CGI以及相关的配置,包括Header的参数、cookie是否带登陆态,CGI之间是否有前后顺序或依赖关系,需要与开发对齐每条CGI的配置。
2、获取白名单的登陆态
对于需要含登陆态的CGI,需要有一批测试号,通过这些号的登陆态去访问CGI。
3、分析业务场景
1)与产品确定本次预计的最高在线人数;
2)判断是否业务并发场景,如同时拉活动主页等并发场景,需要以最大在线人数去测试,如果非并发场景,可以与开发产品一起评估按一定的量去压测。
二、制定测试目标
根据与产品的沟通,确认此次压测的实际目标,NOW直播测试团队与产品方面确认的压测目标如下:
加粗文字预估灰度量级:PCU:15W左右
压测标准:并发人数:10W
通过标准:
● 成功率>95%;
● 平均TPS 大于10W;
● 90%响应时间<1000ms.
三、测试前分析——挖掘直播答题压测主要痛点
根据之前初步问题的排查,NOW直播测试团队首先需要整理进行系统压测的所有接口,具体接口情况如下图:
NOW直播为“全民闯关”活动准备实施压测的所有接口
为了能够帮助“全民闯关”在压测后迅速定位到服务器存在的问题,实现快速的性能优化。
“在线知识竞技压测解决方案”所需要解决的主要痛点在于以下四点:
痛点一:根据业务需求确认需要压测的CGI
测试团队在测试前要确认需要进行压测的关键CGI,监控其数据表现;
痛点二:模拟用户真实登录状态
“全民闯关”需要用户有真实的登录状态,压测的请求可以真实模拟用户的访问状态;
痛点三:满足TPS梯级增长的增长模型
“全民闯关”需要模拟用户的增长模型,实现用户不断增长的场景,了解服务器能够承受服务的量级;
痛点四:帮助开发迅速定位前后端问题
在获取了压测后的详细结果后,测试团队要通过这个结果帮助开发团队迅速定位问题,迅速进行性能优化。
四、选择测试工具——压测大师
根据“全民闯关”压测的功能需求,压测大师提供了针对性的功能服务,内容包括:
1、支持压力梯级配置,一分钟发起十万级并发压力
2、支持上下文变量,实现真实模拟用户登录状态
3、实时查看测试报告,多维度报告对比,迅速定位性能瓶颈
压测大师也通过这些能力,驱动腾讯云压力机集中访问NOW直播服务节点,长连接建立完成高并发用户发送登录验证信息到后端服务器,后端服务回送验证信息,真实模拟“全民闯关”活动“登录”、“进房”、“拉取房间信息”、“拉取活动首页”、“拉取成员列表”等场景,实现系统性的压测。
五、测试流程与方法
为了保证答题的每个CGI都能够满足足够的承载能力,NOW直播测试团队选择的测试方式是通过对单CGI进行压测,每个CGI实现10W的并发。
而在压测大师进行用例配置时,NOW直播测试团队的操作如下:
1、创建项目及测试用例
1)QQ登录http://wetest.qq.com, 选择产品-性能测试-服务器性能;
2)可以选择创建新项目,或者可以让已有项目负责人帮添加权限,然后点击进入项目。
3)点击创建测试用例;
或者点击测试用例,复制已有的一条进行编辑;
4)编辑完成(详细的编辑见下文),在最下面点击调试,这时会先发一条,然后查看结果;
看响应交互状态及响应body是否正常。
如果是“飘心”或者“发言”,可以在对应的房间看是否有出现效果。
(5)然后可以选择小数量运行看一下结果,在运行大数量之前,需要通知对应的后台一起关注,以防止压垮服务器后能及时发现,并停掉压测及紧急修复。
这里可以选择立即执行及定时测试。(注意错开高峰时间段压测,以避免影响到现网业务)。
2、测试用例编辑
1)发包设置——梯次配置,注意设置合理的超时时间
起始人数设置为10000人:NOW直播方面了解服务器方面至少可以满足10000人的并发,直接从10000开始验证服务器的容量,因此将起始人数设置为10000人。
每阶段增加人数10000人,每阶段持续时间30s,最大人数10W人:NOW直播测试团队希望在5分钟内把压力提升到10W,选择每30s提升10000人;这类缓慢加压的方式,可以逐渐发现压力在某个量级出现问题,可以迅速了解服务器承载能力的瓶颈所在。
发包间隔时间为100ms:发包间隔主要决定了压力机方面多久发出一个包,一般默认为0ms,即不断的发包,考虑到服务器的回包能力,可以适当的增加发包的间隔,NOW直播测试团队方面把发包间隔设为了100ms。
超时时间设置为3000ms:超时时间设置很重要!!!超时时间决定了测试报告对结果的判定,如果服务器的响应时间超过了设置的超时时间,就会视作超时,因此超时时间一开始可以稍微设置的长一些,避免很多正常的收发包被视作了超时。
发包模式选择为“长连接”:“长连接”是相对于“短连接”而言,建链之后不会马上断开,继续保持数据传输的关系,用户可以根据实际的连接需求进行选择。
NOW直播测试用例的配置
2)客户端请求——巧用“上下文变量”,真实模拟用户登陆态
NOW直播测试项目中,根据实际需求主要分成两类,一类不需要实现登陆态,一类需要实现页面的登陆态以真实模拟用户访问接口。
a)不需要登陆态,以获取答题信息CGI为例,添加header:
b) 需要登陆态,需要通过压测大师的“上下文变量”进行参数传递。需要先发一条CGI申请一个带登陆态的号码,再去做下一步操作,以“进房”为例。
通过在“客户端请求”选择“上下文变量”,在其的response body里提取uin及skey;再将uin及skey放置在下一步CGI header的cookie里。
通过“上下文变量”功能,将上文body信息传输到下文header的cookie中。
3)测试模型——配置各CGI压力部署
a) 不需登陆态的CGI,一般选择“单场景”,如果是想看单条CGI的性能,就配置单条,如果想看多条并发性能,配置多个场景与压力百分比。
b) 需登陆态的CGI,需选择“上下文”;
点击上面的压测场景下的CGI,可配置多条CGI的配置顺序;
4)报告标准阈值——直观了解测试结果是否通过
设置阈值后,测试报告会直观体现测试是否通过。
六、测试结果分析
1、如何查看报告
1)查看问题及建议:
可针对对应的问题,与开发沟通是否服务器存在瓶颈。
2)查看概况中的在线人数,看是否与设置的符合。如果在线人数低于预设的人数,即服务器可能无法承受那么大的并发数。
3)查看事务数据中的TPS及响应时间。
最终效果
通过对NOW直播“全民闯关”活动的主要接口进行压测之后,得到了初步的数据,NOW直播方面发现后台服务器没有利用到多核机器,Spp的proxy只利用到了单进程单线程,因此通过对单台八核机器部署了6个进程,从而实现了各接口TPS提升了100%左右。
NOW直播“全民闯关”活动主要接口压测数据
(具体数据隐去)
从数据上看,风险可控。
NOW直播测试团队通过对“全民闯关”完成了压测之后,通过提升后台服务器的利用率,将TPS提升了一倍多,并根据在测试环境的压测情况,对线上环境进行了针对性的扩容,在实际上线后,也承载住了线上的压力。
关于压测大师
WeTest压测大师服务了包括王者荣耀、QQ飞车手游、QQ炫舞手游等多款高星级手游, 也服务了QQ、NOW直播、摩拜单车、企鹅FM等明星产品。
此次推出”在线知识竞技压测解决方案“,实现用户瞬时进入房间,拉取题目信息等场景,并真实模拟用户登录状态,帮助开发者真实模拟直播答题用户使用场景,帮助开发者发现服务器端的性能瓶颈,进行针对性的性能调优。在保证用户流畅体验的同时,也能降低服务器采购和维护成本,实现用户与开发者的技术共赢!
目前WeTest压测大师对外开放中,点击链接:http://wetest.qq.com/gaps/即可使用。
如果对使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:800024531