前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gunicorn(独角兽)的简单总结

gunicorn(独角兽)的简单总结

作者头像
码农飞哥
发布2021-08-18 11:16:29
2K0
发布2021-08-18 11:16:29
举报
文章被收录于专栏:好好学习

您好,我是码农飞哥,感谢您阅读本文!本文主要将对gunicorn进行一个简单的总结。

  • gunicorn是什么
  • gunicorn的安装
    • 安装
    • 查看gunicorn的版本
  • 运行gunicorn
  • 工作模式
  • 性能实践
  • 参考

gunicorn是什么

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet,也支持greenlet。

gunicorn的安装

目前Gunicorn只能运行在Linux环境中,不支持windows平台

安装

代码语言:javascript
复制
# 安装最新版本的gunicorn
$ pip install gunicorn
#安装指定版本的gunicorn
pip install gunicorn==19.9.0

查看gunicorn的版本

代码语言:javascript
复制
$ pip show gunicorn

运行gunicorn

代码语言:javascript
复制
$ gunicorn [OPTIONS] $(MODULE_NAME):$(VARIABLE_NAME)

其中MODULE_NAME对应的是python文件,VARIABLE_NAME对应web应用实例。 [OPTIONS]的参数类型如下:

  1. -c CONFIG, --config=CONFIG 指定项目路径下的配置文件,如gunicorn -c gunicorn.py manage:app。gunicorn.py文件中设置了workers等参数。
  2. -b BIND, --bind=BIND 指定一个服务器的地址和端口,格式是
(HOST):

(PORT)。例如:gunicorn -b 0.0.0.0:18005 manage:app

  1. -w WORKERS, --workers=WORKERS 是指定工作进程的数量,单核机器上这个数量一般在2-4个之间。例如:gunicorn -w 4 manage:app
  2. -n APP_NAME, --name=APP_NAME 指定APP的名称
  3. -k WORKERCLASS, --worker-class=WORKERCLASS 指定工作模式。工作进程运行的模式,一共有 sync, eventlet, gevent, tornado, gthread 五种模式,默认是sys模式

工作模式

  1. 同步工作模式(Sync Workers(sync)) 这是最基本的工作模式,也是默认的工作模式。
  2. 异步工作模式(Async Workers(gevent,eventlet)) gevent和eventlet都是基于Greentlet库,利用python协程实现的。安装方式: gevent是pip install gunicorn[gevent]eventlet是pip install gunicorn[eventlet]Gunicorn允许通过设置对应的worker类来设置对应的worker类来使用这些异步Python库。这里的设置适用于我们想要在单核机器上运行的gevent:
代码语言:javascript
复制
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app

worker-connections 是对于 gevent worker 类的特殊设置。(2*CPU)+1 仍然是建议的workers 数量。因为我们仅有一核,我们将会使用 3 个worker。在这种情况下,最大的并发请求数量是3000。(3个worker*1000个连接/worker) 3. Tornado Workers (tornado) tornado利用python Tornado框架来实现。安装方式是:pip install gunicorn[tornado]4. AsyncIO Workers (tornado) gthread采用的是线程工作模式,利用线程池管理连接,安装方式是:pip install gunicorn[gthread]。Gunicorn允许每个worker拥有多个线程。在这种场景下,Python应用程序每个worker都会加载一次,同一个worker生成的每个线程共享相同的内存空间。为了在 Gunicorn 中使用多线程。我们使用了 threads 模式。每一次我们使用 threads 模式,worker 的类就会是 gthread:

代码语言:javascript
复制
gunicorn --workers=5 --threads=2 main:app

该命令等同于:

代码语言:javascript
复制
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app

该例中里面的最大并发请求数是 worker*线程,也就是10。

性能实践

  1. 如果这个应用是I/O受限,通常可以通过使用“伪线程”(gevent或asyncio)来得到最佳性能。正如我们了解到的,Gunicorn通过设置合适的worker类并将workers数量调整到(2*CPU)+1来支持这种编程范式。
  2. 如果这个应用是CPU受限,那么应用程序处理多少并发请求就并不重要,唯一重要的是并行请求的数量。因为Python's GIL,线程和'伪线程'并不能以并行模式执行,实现并行性的唯一方法是增加workers的数量到建议的(2*CPU)+1,理解到最大的并行请求数量其实就是核心数。
  3. 如果不确定应用程序的内存占用,使用多线程以及相应的gthread worker类会产生更好的性能,因为应用程序会在每个worker上都加载一次,并且在同一个worker上运行的每个线程都会共享一些内存,但这需要一些额外的CPU消耗。
  4. 如果你不知道你自己应该选择什么就从最简单的配置开始,就只是 workers 数量设置为 (2*CPU)+1 并且不用考虑 多线程。从这个点开始,就是所有测试和错误的基准环境。如果瓶颈在内存上,就开始引入多线程。如果瓶颈在 I/O 上,就考虑使用不同的 Python 编程范式。如果瓶颈在 CPU 上,就考虑添加更多内核并且调整 workers 数量。

参考

Gunicorn介绍[译] 通过优化 Gunicorn 配置提高性能

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农飞哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gunicorn是什么
  • gunicorn的安装
    • 安装
      • 查看gunicorn的版本
      • 运行gunicorn
      • 工作模式
      • 性能实践
      • 参考
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档