使用Django开发了个接口供外部调用,Django的并发性能弱早有所闻,所以采用了Django+Nginx+uwsgi架构来提高并发量,来测试一下并发能力到底如何。
服务器配置:CPU 2,内存8G
接口内容只有3句,暂不用sleep模拟接口的处理耗时:
request_data = {"code":"0","msg":"test"}
logger.info(f'---------------')
return JsonResponse(request_data)
首先使用了postman测试结果是每秒平均处理能力为12次左右,因为 postman 的run 测试不是并发,不是并发,不是并发!
接着采用Apifox进行测试,的确是并发了,测试结果大致如下:
Nginx 主要配置为:
worker_processes 1
keepalive_timeout 65
worker_connections 1024
大致测试结果如下:
虽然看起来是并发了,但是处理能力怎么调整都无法超过50次每秒,而且这是在接口基本就是一个空函数的情况下。Nginx其他参数也进行了调整,如worker_processes、multi_accept off、use epoll等,处理能力都没有大的变化。
最后检查了Nginx的访问日志access.log,发现接收到的请求就远远没有达到我在Apifox中设置的每秒100,考虑问题应该出在了发送请求的性能上,然后用多台电脑同时使用Apifox测试,果然处理能力上来了。
统计的结果显示单台Apifox每秒能发出的请求无法达到每秒100次,发送请求的并发能力和客户端机器配置高低也有很关联,本轮测试中的最高发送请求次数为42次每秒。
最终通过Apifox调整的参数为如下,其他基本都是系统默认或安装时默认
uwsgi:
processes=2;
threads=30;
listen=1000;
buffer-size=32768;
max-requests=500;
nginx:
worker_processes 2;
worker_connections 1024;
最后祭出大杀器 ab 指令:
ab -n 500 -c 500 http://*.*.*.*/test
-n 总请求次数
-c 并发数
上述指令意思是请求接口 http://*.*.*.*/test , 总共请求500次 ,并发量为500。
测试出来的结果为:平均每秒处理能力为112次左右,整整比Apifox测试出来的翻了1倍多。
最后,在接口函数内sleep了500ms来模拟接口内部处理时长,测得的性能最优配置如下:
服务器配置 CPU 2 内存 8G
nginx主要配置
worker_processes 2
worker_connections 1024;
uwsgi主要配置
processes=2
threads=60
接口内休眠500ms后的测试结果如下:
平均每秒最大处理能力:60次
1秒内成功返回最大并发数:60
2秒内成功返回最大并发数:160
3秒内成功返回最大并发数:280
综上所述,并发测试不要采用postman,少量并发测试可以采用Apifox,大致少于30次并发的可以考虑采用,要验证接口性能极限还是建议采用ab命令。
ab 命令安装:
windows 安装
官方下载链接:https://www.apachehaus.com/cgi-bin/download.plx
下载Apache,解压后直接用cmd进入目录\Apache24\bin使用,或添加环境变量。
linux 安装
yum -y install httpd