QPS、并发数与限流保护漫聊

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1.引言 Google的网站可靠性工程师小组(SRE)定义了四个需要监控的关键指标。他们称之为“四个黄金信号”:延迟(Latency),流量(Traffic),错误(Errors)和饱和度(Saturation)。这些与微服务的RED度量密切相关:速率,错误和持续时间,以及关注利用率,饱和度和错误的USE方法。这四个信号应该是服务级别目标(SLO)的关键部分,因为它们对于提供高可用性的服务至关重要。 流量(Traffic) 其中流量可以很多指标来衡量,比如QPS(每秒处理的请求数)、Inbound Bandwidth(输入带宽)、Outbound Bandwidth(输出带宽)等。 2.Little’s law QPS: query per second,每秒处理的请求数 RT: response time,平均响应时间或平均处理时间 Concurrent:并发数 QPS、RT、Concurrent之间存在如下关系: Concurrent = QPS * RT 某个服务可以被想象成一条单向高速公路。 每一个需要处理的请求或者任务可以想象成正在这条公路上行驶的汽车。 汽车从入口驶入,到从出口驶出所需要的时间就是平均响应时间(RT) 当前公路上的所有车辆数就是并发数(Concurrent),它一个瞬时值 车辆流速稳定后(从入口驶入和从出口驶出的速率 相同),每秒从入口驶入的车辆数就是每秒处理的请求数(QPS) 3.定性分析 3.1 RT变大 如果服务处理任务的过程依赖其它服务,比如MySQL、或者第三方服务。如果第三方服务出现问题,处理时间变长(RT变大),在QPS不变的情况下,由Little’s law可知,Concurrent会变大 3.2 QPS 如果客户端调用量突然增大,即QPS增大,RT不变的情况下,由Little’s law可知,Concurrent也会变大 3.3 请求触达速率和请求完成速率不一致 这种情况对于处理长作业的服务尤为明显。如果任务到达的快,处理的慢,那么通常只有2个结局,要么提交任务的时候,任务被直接拒绝,要么任务被扔在某个等待队列中,等待执行。在外部的用户看来,这些任务都是在并发执行中,可以看做是并发数。 4. 限流保护 在很多服务中,针对每个请求,都会独立分配额外的资源。比如Golang的web框架在gin中,每个连接都会分配3个协程;MySQL会针对每个请求创建User Thread),如果并发数一直增大,则服务很可能会被OOM或者陷入某种假死状态。 Concurrent = QPS * RT 结论 由于并发数受到2个变量QPS和RT的影响,RT受到第三方服务的影响而不可控,因此仅对QPS限制是无法保护服务的,还需要对Concurrent进行限制。 参考资料 1.Little’s law 2.QPS和并发数,这次给你说清楚 3.QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考

February 28, 2023 · 1 min

AI预测模型工程化性能调优

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 前言 最近经历了一次AI预测模型工程化性能调优,这里分享出来,希望对大家有所启发。 模型是keras训练的神经网络预测模型,输入一段文本,输出文本的分类结果。为了对外提供服务,已经将模型用 gunicorn + flask对模型进行封装,提供http接口。 环境 OS:ubuntu 18.04 CPU:32核 内存: 256GB 显卡: Tesla P100 前期的压测结果 wrk -t4 -c100 -d30s --script=post.lua --latency http://localhost:8080/api/predict 类型 CPU GPU QPS 2.4 12.41 2. 观察性能指标 QPS过低不能满足业务方的要求,所以萌叔尝试对封装好的服务进行调优。 仔细观察了各项系统指标之后(cpu、load、磁盘IO、内存使用率、虚拟内存页换入换出) 萌叔发现了一个疑点。 2.1 keras 使用CPU 在压测的过程中,CPU的使用率只能达到70%左右 2.2 keras 使用GPU 在压测的过程中,GPU的使用率只能达到30%左右 神经网络模型对文本分类的预测过程,实际就是将输入文本转换成数值,再带入神经网络,进行的2次计算的过程。这是一个计算密集型的场景,性能瓶颈应该是CPU/GPU; 如果CPU、GPU没有打满,则说明性能仍有提升的空间。 3. 调优 3.1 初始协程模式 web使用Flask开发,启动脚本如下: gunicorn -k gevent -t 300 -b 0.0.0.0:8080 run:app gunicorn有几种工作模式 sync (进程模式) eventlet gevent (协程模式) tornado gthread gevent是一种协程模式,它的特点是在请求的处理过程中有IO调用时(或者当前的协程主动让出CPU),会自动触发切换上下文切换,启动另一个协程,提高CPU的利用率。它特别适用于IO密集型的场景,尤其是对于处理过程中有对数据库的调用,第三方服务调用的情况。 ...

March 17, 2020 · 2 min