阅读此文前建议先阅读 我的博客
gunicorn 是一个 python wsgi http server,只支持在 unix 系统上运行
gunicorn 其实是 python 的一个包,安装方法同一般包的安装
pip install gunicorn也可 tar 包安装
安装完毕可用如下命令检测
[root@node bin]# gunicorn -h-h 就是 help,查看 gunicorn 命令的参数
gunicorn 有两种配置方式
示例如下
gunicorn -w 8 -b 0.0.0.0:5002 simple_flask:appsimple_flask 是 flask 的主文件
app 是 主文件中那个 app flask 对象
启动 gunicorn
gunicorn -c gunicorn.conf app:app
flask 项目
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0')
对其进行压力测试,模拟 200 个用户发起 9000 个请求
ab -n 9000 -c 200 -r "http://172.16.89.80:5000/"输出
Server Software: Werkzeug/0.16.0 Server Hostname: 172.16.89.80 Server Port: 5000 Document Path: / Document Length: 13 bytes Concurrency Level: 200 Time taken for tests: 13.862 seconds Complete requests: 9000 Failed requests: 0 Write errors: 0 Total transferred: 1503000 bytes HTML transferred: 117000 bytes Requests per second: 649.26 [#/sec] (mean) Time per request: 308.043 [ms] (mean) Time per request: 1.540 [ms] (mean, across all concurrent requests) Transfer rate: 105.89 [Kbytes/sec] receivedComplete requests 9000 个请求;
Time taken for tests 共耗时 13.862 s;
Requests per second 每秒处理请求 649.26 个; 649.26 x 13.862 = 9000.04
注意 200 个用户(并发)并不是说并发量是 200,因为一个用户可能 狂点,在一个 request-response 没结束之前,狂点多次请求,这也是并发,所以上述输出表明 并发量 为 649
压力测试,同样模拟 200 个用户 发起 9000 个请求
/usr/bin/ab -n 9000 -c 200 -r -k 'http://172.16.89.80:5002/'输出
Concurrency Level: 200 Time taken for tests: 1.998 seconds Complete requests: 9000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 0 Total transferred: 1557000 bytes HTML transferred: 117000 bytes Requests per second: 4503.48 [#/sec] (mean) Time per request: 44.410 [ms] (mean) Time per request: 0.222 [ms] (mean, across all concurrent requests) Transfer rate: 760.84 [Kbytes/sec] received类比上面来看本次输出,很明显,效率高;
并发量 4503,将近 8 倍
有意思的是我们让 gunicorn 开了 8个 进程,所以可以这么理解, gunicorn 效率 = 单进程效率(自带服务器)x 进程数
当然 这也要跟 硬件 有关系,如果你只是 8 核 的服务器,开了 80 个进程,就不能这么算了
用 gevent 并发量更大
gunicorn -k gevent -w 8 -b 0.0.0.0:5002 simple_flask:app并发量 4890。
测试样例还是上面那个 flask 项目
这里只做简单分析,因为测试时跟硬件有一定关系
gunicorn 性能
Concurrency Level: 10000 Time taken for tests: 25.494 seconds Complete requests: 100000 Failed requests: 292 (Connect: 0, Receive: 88, Length: 116, Exceptions: 88) Write errors: 0 Total transferred: 17279932 bytes HTML transferred: 1298492 bytes Requests per second: 3922.52 [#/sec] (mean) Time per request: 2549.384 [ms] (mean) Time per request: 0.255 [ms] (mean, across all concurrent requests) Transfer rate: 661.92 [Kbytes/sec] received失败 292 次请求,并发 3922
nginx 性能
Concurrency Level: 10000 Time taken for tests: 26.333 seconds Complete requests: 100000 Failed requests: 42 (Connect: 0, Receive: 0, Length: 42, Exceptions: 0) Write errors: 0 Total transferred: 17292734 bytes HTML transferred: 1299454 bytes Requests per second: 3797.45 [#/sec] (mean) Time per request: 2633.344 [ms] (mean) Time per request: 0.263 [ms] (mean, across all concurrent requests) Transfer rate: 641.29 [Kbytes/sec] received失败 42 次请求,并发 3797
nginx 性能不差,重要的是稳定。
参考资料:
https://www.cnblogs.com/cwp-bg/p/8780204.html python之gunicorn的配置
https://blog.csdn.net/y472360651/article/details/78538188 Gunicorn-配置详解
https://www.jianshu.com/p/69e75fc3e08e gunicorn 详解
https://blog.csdn.net/bbwangj/article/details/82684573 gunicorn简介、架构、安装与配置
https://www.jianshu.com/p/b97f80a630db
https://blog.51cto.com/7613336/2074032 优雅的退出/关闭/重启gunicorn进程
转载于:https://www.cnblogs.com/yanshw/p/11208964.html
相关资源:JAVA上百实例源码以及开源项目