在Python Web开发中,Gunicorn作为WSGI HTTP服务器,常常作为Web应用(如Django或Flask)与反向代理或负载均衡器之间的桥梁。为了充分发挥其性能,本文将提供一些实用的Gunicorn配置建议。
Gunicorn采用了预派生(pre-fork)模型,这意味着它在处理任何HTTP请求之前会创建子进程。主进程负责监控并保持工作进程的数量稳定。如果工作进程异常退出,主进程会重新启动新的工作进程。
1. 工作进程(Workers)
gunicorn --workers=5 main:app
Gunicorn 具有默认的工作类(同步sync)
gunicorn --workers=5 --threads=2 main:app
上面的命令与以下命令相同:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
最大并发请求数为workers * threads
,上述情况下是10。
当使用工作进程和线程时,建议的最大并发请求数仍然是(2*CPU)+1
。
因此,如果使用的是四核(4个CPU)的计算机,并且希望同时使用工作进程和线程,可以使用3个工作进程和3个线程,以获得9个最大并发请求。
gunicorn --workers=3 --threads=3 main:app
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
worker-connections
是 gevent 工作进程类的特定设置。
(2*CPU)+1
仍然是建议的工作进程数量,因为只有1个核心,将使用3个工作进程。
在这种情况下,最大并发请求数是3000(3个工作进程 * 每个工作进程的1000个连接)。
理解并发(Concurrency)与并行(Parallelism)的区别是优化性能的关键。在Python中,线程和“伪线程”是并发执行的手段,但不是并行;而工作进程则既是并发的也是并行的。
此外,还有其他优化建议,包括调整worker类、超时时间、保持活动连接、worker类参数、使用反向代理、监控和扩展、优化应用代码、升级Gunicorn和合理分配资源:
gevent
或 eventlet
。gunicorn -k gevent -w 4 myapp:app
gunicorn --timeout 120 myapp:app
keepalive
选项以控制 Gunicorn 在 Keep-Alive HTTP 连接上等待下一个请求的时间。gunicorn --keep-alive 5 myapp:app
gevent
,考虑调整参数,如 worker 连接的数量。gunicorn -k gevent --worker-connections 1000 -w 4 myapp:app
gunicorn-stats
等工具监控 Gunicorn,或将其集成到监控解决方案中。