type
status
date
slug
summary
tags
category
icon
password
前言
用于测试的那台vps只能做到每秒处理20请求,然后cpu占用就100%了,暂时没有想到优化方案,所以先通过加机器来解决;因为线上服务器都是多核的,所以考虑开启多个进程来提升性能;
尝试优化
- 开始的想法每次请求fork一个子进程,处理完毕再disconnect自身,于是开始改造代码;
- 改完了跑压测发现10s complete 173个请求,再看cpu占用,25%左右,有点想不通;
- 突然想到自己的本本是2C4T的,四个cpu逻辑核心只能并行处理四个任务,那么剩下的进程可能都在等待状态咯?
- 继续查资料了解到,虽然多个进程可以利用多个cpu核心,但是我缓存了一些数据在内存中,多个进程共享这个缓存,因此也可能会造成阻塞;
- 所以上边的cpu占用下降,同时处理响应数量也下降就有了一个初步推测,暂时先忽略,换个思路;
其它方案
- 怀疑自己写的fork子进程影响了性能,所以使用pm2 配置<code>"instances": "max"</code>来开启多个实例测试,代码也可以还原了;
- 跑下压测发现成功返回的请求只是提高到了600左右,cpu也不会占用到100%了,四个逻辑核心占用最多同时到80%左右,那么目前来看瓶颈应该不在cpu这边;
继续瞎想
- 输出了一下从创建canvas到导出图片的console.time(OneApm个人用太贵),发现需要50ms左右, 1000ms/50=20,因为这期间cpu是阻塞的,所以这个并发数是对的,优化前大概就是这个水平;
- 但是开启多个实例后ab的complete只能到600左右,并且发现开启两个实例和四个实例并发数差别不大,有点奇怪(不知道是否和逻辑核心有关);
- 目前性能优化上想不到好的方案了,优化就到这儿,暂时靠加点来支撑吧;
压测数据如下
并发数为20:
并发数为50:
测试下另外一个cpu轻度使用的接口多进程下的并发
- 发现还是有提升的,但是没有想象的X4那么给力
单实例
使用pm2开4个实例