评论

如何计算并优化应用的高并发性能指标?|微信压测指南

详细介绍应用的高并发性能指标计算和优化,并演示如何通过压测工具来评估自己的服务性能。

一、高并发性能指标计算与优化

为了让初学者能够更好理解,我们从一个例子来引出。假设你的小程序在同一时间点有 100 个人访问,每人访问时发送 2 个请求,每个请求平均耗时 50ms。你的服务器能在一秒之内能够完全处理这 100人的 200 次请求访问。

通过以上假设,可以得出每秒处理访问请求数(QPS)为 200。那么你的服务器最小并发处理数为 200 * 0.05s =  10。 对应公式如下:

并发处理数 = 每秒处理访问请求数(QPS) * 单个请求的平均耗时[秒]

这里的并发处理数只是最小,因为案例中已经验证能处理 200 次访问了,如果要计算最大,则需要继续加量测试。

如果服务器在同一时间只能处理 1 个请求,那么其并发处理数是 1,如果还是上述假设,每个请求是 50ms,那么服务器 1 秒内最多处理 20 个请求,也就是说100 个人同时访问200次请求,最少需要 10 秒钟才能全部处理完毕。

并发处理数是指系统能同时处理的请求数量,一般由请求时消耗的资源和服务器资源来共同决定。比如请求是 CPU 密集的,每次请求都需要占用 CPU 50ms,那么单核服务器并发数就只有 1,如果服务开多线程并且部署多核服务器,并发数会相应的增加。

在做性能优化的时候,可以向两个方向工作:

  1. 提升服务器并发数:可以通过增加服务器数量和质量,或者降低请求的资源消耗。
  2. 降低单个请求的平均耗时:优化请求里的处理逻辑,缩减占用吞吐资源的时间。

通常情况下,影响并发数的资源主要是CPU、内存、存储IO、带宽。

初入行的开发者,最先遇到的资源瓶颈大多是CPU。请求的处理中包含大量的计算会严重占用 CPU 的使用,一般在开发自测阶段不容易发现这种问题(用户只有 1 个或几个),一到上线就会出现大量的请求超时。

在遇到资源瓶颈问题时,解决思路就优化代码和添加配置:

  1. 优化代码:这个因程序而异,而且比较看开发者自身的技术水平,就不展开讲了。
  2. 添加配置:这里照顾一下个人和初创团队,提供一些有用的经验。

○ CPU和内存:买多核多内存的服务器或者用弹性伸缩来动态增删服务器来解决;更有性价比的思路是用云函数(公有云的云函数都可以,也可以用微信云开发的云函数来),遇到高消耗的任务就直接放到云函数中,处理时直接调用计算,服务器只等待结果,不消耗服务器的 CPU 和内存资源。

○ 存储 IO:更换好一点的服务器硬盘,如果是海量的用户面存储,可以直接用对象存储,性价比很高,不绑定云硬盘,迁移还方便。

○ 带宽:购买高带宽但价格感人,可以开启按流量计费,把阈值开高就可以。

二、 通过微信安全网关压测来测试自己的极限

关于微信安全网关的作用和特点,我在之前有写过2 篇文章,感兴趣可以去看看。

这里主要介绍一下压测的部分。

在网关内的控制台左侧点击「扩展能力-压测工具」,可以看到压测的页面。

我们先创建一个压测任务,相应的操作步骤如图演示:

压测任务的信息构成主要由以下几方面:

  1. 压测任务名称:可以自由定义,用于方便你分辨压测任务。
  2. 压测小程序:以哪个小程序的角色进行压测,压测时默认小程序接入安全网关,不影响现网的接入配置。
  3. 请求列表:分为业务请求和微信请求,业务请求可以是任意的 URL,支持多种请求形式。微信请求,目前包含登录和支付接口,后面会支持更多接口。
  4. 调试能力:模拟压测链路执行所有列表请求,并显示请求耗时和返回信息,用于确认配置是否正确。

确认信息无误后,点击“保存”按钮。

创建压测任务后就可以预约时间段来进行实际压测了,由于资源有限,所以压测预约是按时间段来的,并且预约时需要自己确认并发用户数和压测时间。

预约到时间段压测后,等到预约的时间就可以开始执行了。如果超过时间段则就无法执行,需要重新预约。

压测完成后,就可以在同一页面下方看到详细的数据,如图:

根据压测的数据信息,就可以估算出相关的性能指标了。


我们以上图举例子:

100 个用户,压测 600 秒,每个用户完成一轮请求后紧接着进行下一轮。如果列表中有请求调用错误,则不会进行列表中其后的 其他请求,直接重新从列表开始请求。

QPS = 阶段请求数/阶段请求时间[秒]
并发处理数 = QPS * 单个请求的平均耗时[秒] 
基准测试接口QPS为 178587 / 600 = 298.645,并发数为 298.645 * 0.030774 = 9.19
登录测试接口 QPS 为 178328 / 600 = 297.213,并发数为 297.213 * 0.133554 = 39.69


QPS 和并发处理数指标需要结合你的应用场景合理设定,并不需要设置很高的性能指标,满足产品所需并留有部分buff就可以了。

最直观的就是直接上压测任务,模拟一些真实的用户来在时间限制内持续请求你的服务器,来看最终的结果如何,并根据结果来指导你做指标设定和优化方向。

以下是腾讯云关于服务器实例的压测结果,当然这只是参考,实际上跟应用类型和服务架构也有关系的,还是自己真实上业务测试比较准。

关于压测工具的体验,可以访问Donut-安全网关控制台,有疑问可以在控制台点击「技术支持」寻求帮助~

最后一次编辑于  2023-12-14  
点赞 5
收藏
评论

4 个评论

  • Jianbo
    Jianbo
    2023-12-08

    学习下。

    2023-12-08
    赞同
    回复
  • showms
    showms
    2023-12-08

    这个压测服务支持分布式吗,比如10000/s并发,压测服务本身是否可以模拟这么多的请求?

    2023-12-08
    赞同
    回复 4
    • 微信开发者生态产品经理-zirali
      微信开发者生态产品经理-zirali
      2023-12-08
      压测模拟的是真实用户发起请求,内测期间最高支持 1 万用户数,每个用户按照你请求列表依次发起请求,完成后接着下一轮(如果当中有失败的则停止向后请求,重新从列表开头来)。 10000/s 的这种并发指数,跟你的请求列表的总耗时有关,如果总耗时 500ms,5000 多用户就能模拟出来。建议直接按照业务侧的请求逻辑来,比如从登录开始一直到业务结束,能比较明显的反映出相关接口服务的性能。
      2023-12-08
      回复
    • 微信开发者生态产品经理-zirali
      微信开发者生态产品经理-zirali
      2023-12-11
      关于分布式压测,目前只有上海和天津地域,后面会不断的上其他地域。多地域均衡压测目前暂不支持,如果你有相关的需求可以在技术群里找相关产品同学交流哈~
      2023-12-11
      回复
    • showms
      showms
      2023-12-12回复微信开发者生态产品经理-zirali
      好的谢谢
      2023-12-12
      回复
    • 微信开发者生态产品经理-zirali
      微信开发者生态产品经理-zirali
      2023-12-12回复showms
      不客气,有需要的话直接加群就行,有专门的同学对接!
      2023-12-12
      回复
  • 启年
    启年
    2023-12-08

    down

    2023-12-08
    赞同
    回复
  • 游戏人生
    游戏人生
    2023-12-08

    mark

    2023-12-08
    赞同
    回复
登录 后发表内容