使用Gunicorn和Nginx部署Flask应用, wrk对接口进行压力测试

本文介绍了如何使用wrk工具进行接口性能测试,包括GET和POST请求,并展示了在CentOS环境下安装和使用wrk的步骤。接着,讨论了Gunicorn作为WSGI容器的作用和配置,以及它如何提升性能。最后,提到了Nginx作为反向代理服务器在Gunicorn之上进一步优化性能,并简单配置了Nginx以提升服务的响应速度。
摘要由CSDN通过智能技术生成

背景

  • 当我们完成一个服务的应用时,要把接口暴露给别人使用,学生时期写过的应用可能最多老师和同学会用用,但实际工作中我们必须去考虑服务器并发的压力,比如说某一个接口1S内是否能承受住1W的并发压力,这一方面取决于机器的性能,另一方面取决于开发人员的各种调优手段。

wrk

  • 优势
    轻量级性能测试工具;
    基于系统自带的高性能 I/O 机制,如 epoll, kqueue, 利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量;

  • 劣势
    wrk 目前仅支持单机压测,后续也不太可能支持多机器对目标机压测,因为它本身的定位,并不是用来取代 JMeter, LoadRunner 等专业的测试工具,wrk 提供的功能,对我们服务端开发人员来说,应付日常接口性能验证还是比较友好的。

  • 安装 在CentOS环境下

	sudo yum groupinstall 'Development Tools'
	sudo yum install -y openssl-devel git 
	git clone https://github.com/wg/wrk.git wrk
	cd wrk
	make
	# 将可执行文件移动到 /usr/local/bin 位置
	sudo cp wrk /usr/local/bin
  • GET请求测试
	wrk -t12 -c400 -d30s --latency http://www.baidu.com
	# 压测时间30秒 12个测试线程 400个连接
  • POST请求测试
    使用wrk测试POST接口需要编写简单的lua脚本
    文件名: post_test.lua
wrk.method = "POST"
wrk.body = '{"uuid" : "5056a703fa", "cpu_count" : "2", "memory_info_total" : "5.6707305908203125", "disk_read_speed" : "0.0", "current_time" : "2021-09-01 20:17:44", "cpu_per" : "0.0|0.0|2.0|1.0", "memory_info_per" : "20.5", "disk_write_speed" : "4.0", "net_info_recv" : "9.8359375","net_info_sent" : "9.66015625", "swap_memory_total" : "7.999996185302734", "swap_memory_percent" : "0.0","cpu_info" : "Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz", "disk_info_total" : "89.9477653503418", "disk_info_per" : "8.1"}'
wrk.headers["Content-Type"] = "application/json"
function request()
    return wrk.format('POST', nil, nil, body)
end

直接run server 的情况下

执行命令
注意替换你的本机接口

wrk -t4 -c200 -d10s -s post_test.lua --latency http://localhost:8090/post/saveinfo
[root@centos74x64 server_load]# wrk -t4 -c200 -d10s -s post_test.lua --latency http://localhost:8090/post/saveinfo
Running 10s test @ http://localhost:8090/post/saveinfo
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   643.10ms  135.14ms   1.96s    92.88%
    Req/Sec    53.40     23.74   131.00     71.98%
  Latency Distribution
     50%  643.13ms
     75%  665.74ms
     90%  693.89ms
     99%    1.04s 
  2107 requests in 10.02s, 316.87KB read
  Socket errors: connect 0, read 0, write 0, timeout 15
Requests/sec:    210.37
Transfer/sec:     31.64KB

看到: 4个测试线程, 200个连接 平均延迟643.10ms 平均每秒请求53个

简单介绍一下Gunicorn

Web Server Gateway Interface,即Web服务器网关接口,是Web服务器和Web应用程序或框架之间的一种简单而通用的接口,它是一种协议,一种规范,专门用来解决众多Web服务器和Web应用程序或框架的兼容性问题。
有了WSGI,你不用担心你写的Web应用程序只能运行在某一款Web服务器上。
gunicorn是一种常用的WSGI容器

  • 安装
	pip3 install gunicorn
  • 使用
	gunicorn -w 2 -b :8099 app:app &

app即你的app.py文件 8099是其对应的端口

  • 基本配置
	-c CONFIG, --config=CONFIG
	# 设定配置文件。
	-b BIND, --bind=BIND
	# 设定服务需要绑定的端口。建议使用HOST:PORT。
	-w WORKERS, --workers=WORKERS
	# 设置工作进程数。建议服务器每一个核心可以设置2-4个。
	-k MODULE
	# 选定异步工作方式使用的模块。

使用gunicorn部署后使用wrk测试

[root@centos74x64 server_load]# wrk -t4 -c200 -d10s -s post_test.lua --latency http://localhost:8099/post/saveinfo
Running 10s test @ http://localhost:8099/post/saveinfo
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   298.05ms  146.82ms   1.95s    80.99%
    Req/Sec   107.57     61.86   340.00     72.70%
  Latency Distribution
     50%  244.87ms
     75%  361.72ms
     90%  508.25ms
     99%  646.03ms
  3735 requests in 10.02s, 561.71KB read
  Socket errors: connect 0, read 0, write 0, timeout 4
Requests/sec:    372.69
Transfer/sec:     56.05KB

看到: 4个测试线程, 200个连接 平均延迟298.05ms 平均每秒请求107.57个
明显性能提升了, 是不是很强大

简单介绍一下Nginx

nginx是一个功能强大的反向代理服务器,我们使用nginx来转发gunicorn服务。
为什么要在gunicorn之上再加层nginx呢?一方面nginx可以补充gunicorn在某些方面的不足,如SSL支持、高并发处理、负载均衡处理等,
另一方面如果是做一个Web网站,除了服务之外,肯定会有一些静态文件需要托管,这方面也是nginx的强项。要想真正学会Nginx还是要多花费点时间,抽时间再出一篇博文专门讲Nginx。推荐掘金上的这篇Nginx教程

Nginx,单独一篇(FLAG)

  • 简单配置
    vi nginx.conf 修改nginx的配置
    将gunicorn配置好的ip和端口号填入到 proxy_pass 字段
    访问的时候直接输入ip + nginx监听的端口就好了

  • 使用nginx部署后使用wrk测试

[root@centos74x64 server_load]# wrk -t4 -c200 -d10s -s post_test.lua --latency http://localhost:80/post/saveinfo
Running 10s test @ http://localhost:80/post/saveinfo
  4 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   252.98ms   95.26ms   1.79s    91.44%
    Req/Sec   137.41    106.69   490.00     57.88%
  Latency Distribution
     50%  240.44ms
     75%  264.22ms
     90%  308.14ms
     99%  433.40ms
  3919 requests in 10.02s, 623.83KB read
  Socket errors: connect 0, read 0, write 0, timeout 148
Requests/sec:    391.12
Transfer/sec:     62.26KB

看到: 4个测试线程, 200个连接 平均延迟252.98ms 平均每秒请求137.41个
明显性又能提升了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loganer

感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值