部署方案建议

下表为常见的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选项。

results matching ""

    No results matching ""