背景
- 当我们完成一个服务的应用时,要把接口暴露给别人使用,学生时期写过的应用可能最多老师和同学会用用,但实际工作中我们必须去考虑服务器并发的压力,比如说某一个接口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个
明显性又能提升了