一、高并发性能指标计算与优化
为了让初学者能够更好理解,我们从一个例子来引出。假设你的小程序在同一时间点有 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,如果服务开多线程并且部署多核服务器,并发数会相应的增加。
在做性能优化的时候,可以向两个方向工作:
- 提升服务器并发数:可以通过增加服务器数量和质量,或者降低请求的资源消耗。
- 降低单个请求的平均耗时:优化请求里的处理逻辑,缩减占用吞吐资源的时间。
通常情况下,影响并发数的资源主要是CPU、内存、存储IO、带宽。
初入行的开发者,最先遇到的资源瓶颈大多是CPU。请求的处理中包含大量的计算会严重占用 CPU 的使用,一般在开发自测阶段不容易发现这种问题(用户只有 1 个或几个),一到上线就会出现大量的请求超时。
在遇到资源瓶颈问题时,解决思路就优化代码和添加配置:
- 优化代码:这个因程序而异,而且比较看开发者自身的技术水平,就不展开讲了。
- 添加配置:这里照顾一下个人和初创团队,提供一些有用的经验。
○ CPU和内存:买多核多内存的服务器或者用弹性伸缩来动态增删服务器来解决;更有性价比的思路是用云函数(公有云的云函数都可以,也可以用微信云开发的云函数来),遇到高消耗的任务就直接放到云函数中,处理时直接调用计算,服务器只等待结果,不消耗服务器的 CPU 和内存资源。
○ 存储 IO:更换好一点的服务器硬盘,如果是海量的用户面存储,可以直接用对象存储,性价比很高,不绑定云硬盘,迁移还方便。
○ 带宽:购买高带宽但价格感人,可以开启按流量计费,把阈值开高就可以。
二、 通过微信安全网关压测来测试自己的极限
关于微信安全网关的作用和特点,我在之前有写过2 篇文章,感兴趣可以去看看。
这里主要介绍一下压测的部分。
在网关内的控制台左侧点击「扩展能力-压测工具」,可以看到压测的页面。
我们先创建一个压测任务,相应的操作步骤如图演示:
压测任务的信息构成主要由以下几方面:
- 压测任务名称:可以自由定义,用于方便你分辨压测任务。
- 压测小程序:以哪个小程序的角色进行压测,压测时默认小程序接入安全网关,不影响现网的接入配置。
- 请求列表:分为业务请求和微信请求,业务请求可以是任意的 URL,支持多种请求形式。微信请求,目前包含登录和支付接口,后面会支持更多接口。
- 调试能力:模拟压测链路执行所有列表请求,并显示请求耗时和返回信息,用于确认配置是否正确。
确认信息无误后,点击“保存”按钮。
创建压测任务后就可以预约时间段来进行实际压测了,由于资源有限,所以压测预约是按时间段来的,并且预约时需要自己确认并发用户数和压测时间。
预约到时间段压测后,等到预约的时间就可以开始执行了。如果超过时间段则就无法执行,需要重新预约。
压测完成后,就可以在同一页面下方看到详细的数据,如图:
根据压测的数据信息,就可以估算出相关的性能指标了。
我们以上图举例子:
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-安全网关控制台,有疑问可以在控制台点击「技术支持」寻求帮助~
学习下。
这个压测服务支持分布式吗,比如10000/s并发,压测服务本身是否可以模拟这么多的请求?
down
mark