部署方案建议
下表为常见的Python应用部署方案,并描述了其优劣,以及使用建议等。
分类 | 应用服务器 | 优劣 | 框架 |
---|---|---|---|
WSGI | UWSGI | 多进程,多线程,同步 | 所有 WSGI协议框架 |
WSGI | Gunicorn | 多进程,io异步 | 所有 WSGI协议框架 |
WSGI | Gevent | 单进程,io异步 | 所有 WSGI协议框架 |
非WSGI | Tornado | 单进程,网络异步 | WSGI App不建议/Tornado |
UWSGI部署
优势
UWSGI部署应用的优势在于,能够精确的控制应用启动的参数,启动/重启条件,精确的调试信息,以及更多的控制、调试、信号接口。其属于传统的多进程,多进程应用部署方案使用广泛,配置灵活且多样性。
劣势
完全依赖于硬件资源,一旦达到硬件瓶颈,可能出现无响应、假死等现象,但如果能精确预测以及控制应用访问(比如负载均衡以及后备硬件资源),也未尝不是好的选择。
部署建议
为了更好的配合探针工作,建议开启 UWSGI以下选项:
--enable-threads:UWSGI默认情况下,没有开启多线程的支持,由于探针基于多线程模式,所以必须开启此模式,否则探针无法正常启动。如果UWSGI使用了选项--threads,将自动开启选项--enable-threads。
--single-interpreter:默认情况下 UWSGI为了隔离应用环境,以便运行多个应用,在启动的时候会启动子进程来运行某个应用,而不是在主进程中执行。为了更好的适应探针环境请开启这个选项,开启后不会有其他任何的副作用,它也是安全而有效的方式。
--lazy:该选项开启后,UWSGI将会在 worker进程中加载 app,而不是在master中加载 app。这样做完全不受影响,因为UWSGI在工作时,master是不工作的,它只负责调度。
Gunicorn&Gevent
优势
两者从本质上讲差别并不大,Gevent是基于 libevent io库,而 Gunicorn可以直接使用 Gevent或者 greenlet作为其 worker的 service。 Gunicorn以多进程方式管理 worker(可以是 gevent等),而 Gevent部署时一般都是以单进程部署的。
两者可以认为都是基于事件驱动的 IO异步模型,在并发上要比UWSGI同步的方式要高,且能更好的利用服务器资源。
劣势
相比UWSGI而言,劣势也很明显,应用过程状态监控以及过程信息不透明,当然灵活性也不那么高。
部署建议
探针目前兼容异步应用服务器的部署方案,由于其异步特性,在开发应用时,尽量不要有过多、多大的IO以及网络阻塞操作,并且做好负载均衡。一旦请求量大时,会导致过多的进程数据驻留内存,导致内存消耗过大。特别是慢的请求太多时,会导致探针采集过多的信息,增加机器资源消耗。
Tornado
优势
Tornado的优势在于网络异步并发,可以在单机、单进程上轻松支持成千上万的网络并发请求。并且对长连接有很好的支持。
劣势
基于 Tornado的应用发开难度大,要完全发挥 tornado网络异步的特性,应用需要利用其异步接口支持其异步特性,比如数据库操作、文件IO等,否则使用该框架性能会大打折扣。
部署建议
Tornado常见部署方案如下所示:
方案 | 应用服务器 | 框架/应用 | 说明 |
---|---|---|---|
A | Tornado应用 | Tornado | 原生部署方式 |
B | Tornado应用 | WSGI应用 | 不建议,可以参考UWSGI部署或者Gunicorn&Gevent |
C | WSGI服务器 | Tornado应用 | 不建议 |
方案 A:
探针目前仅支持Tornado3.X Tornado4.X版本,按常规方式使用探针即可。
方案 B &方案 C:
需要开启 Tornado wsgi兼容模式,请在探针配置文件中设置tornado_wsgi_adapter_mode选项。