高性能框架gevent和gunicorn在web上的应用及性能测试

简介:

比如 Flask,webpy,Django、CherryPy 都带着 WSGI server 。当然性能都不好,自带的web server 更多的是测试用途, 线上发布时,则使用高性能的 wsgi server或者是联合nginx做uwsgi 。


诚如那个WSGI的定义所说的,协议定义了一套接口来实现服务器端与应用端通信的规范化(或者说是统一化)。这是怎样的一套接口呢?很简单,尤其是对于应用端。



更多关于wsgi server的介绍,请到我的个人博客看看,   http://xiaorui.cc


233615185.png

神器 Gunicorn是一个Python WSGI UNIX的HTTP服务器。这是一个预先叉工人模式,从Ruby的独角兽(Unicorn)项目移植。该Gunicorn服务器与各种Web框架兼容,我们只要简单配置执行,轻量级的资源消耗,以及相当迅速。它的特点是与各个web结合紧密,部署特别方便。 缺点也很多,不支持HTTP 1.1,并发访问性能不高。


安装 gunicorn  ~

pip install gunicorn


233931792.jpg


这里我们说下 gunicorn 的用法

最简单的运行方式就是:


1
gunicorn code:application


其中code就是指code.py,application就是那个wsgifunc的名字。


这样运行的话, gunicorn 默认作为一个监听 127.0.0.1:8000 的web server,可以在本机通过: http://127.0.0.1:8000 访问。



如果要通过网络访问,则需要绑定不同的地址(也可以同时设置监听端口):


1
2
gunicorn -b  10.2 . 20.66 : 8080  code:application
#from http: //rfyiamcool.blog.51cto.com


在多核服务器上,为了支持更多的并发访问并充分利用资源,可以使用更多的 gunicorn 进程:


1
gunicorn -w  8  code:application


这样就可以启动8个进程同时处理HTTP请求,提高系统的使用效率及性能。


另外, gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好, 它还支持其它更好的模式,比如:gevent或meinheld。

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

#  gevent

gunicorn -k gevent code:application

#  meinheld

gunicorn -k egg:meinheld#gunicorn_worker code:application

当然,要使用这两个东西需要另外安装,具体请参考各自的文档。


以上设置还可以通过 -c 参数传入一个配置文件实现。


gunicorn 的配置文件

1
2
3
4
5
6
7
8
9
10
11
[root@ 66  tmp]# cat gun.conf
import  os
bind =  '127.0.0.1:5000'
workers =  4
backlog =  2048
worker_class =  "sync"
debug = True
proc_name =  'gunicorn.proc'
pidfile =  '/tmp/gunicorn.pid'
logfile =  '/var/log/gunicorn/debug.log'
loglevel =  'debug'



python web 一个例子

1
2
3
4
5
6
7
8
9
10
11
12
[root@ 66  tmp]# cat xiaorui.py
from flask  import  Flask
from flask  import  render_template_string
import  os
from werkzeug.contrib.fixers  import  ProxyFix
app = Flask(__name__)
@app.route( '/' )
def index():
     return  "worked!"
app.wsgi_app = ProxyFix(app.wsgi_app)
if  __name__ ==  '__main__' :
     app.run()


先跑本身的demo ~

234808791.jpg

源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

结果是:

235039970.jpg


结果还算可以~    当然跑的实例也简单~


235359529.jpg

235401467.jpg


cpu的损耗,不小哈~

其次的问题是,flask的web server在压力下出现回应的错误。。。 我以前测试 tornado web.py flask django botto的压力,让朋友写的cc工具做的测试。。。

结果是  tornado确实很牛,然后是flask,接着是web.py,最烂的是django

django本身的抗压确实让人蛋疼,还好大家在nginx做负载。

235559547.jpg

单实例测试完了,咱们开始测试 高性能神器 gunicorn 做wsgi

000510390.jpg


启动后会出现:

1
2
3
4
5
6
7
8
2013 - 08 - 12  21 : 59 : 34  [ 2097 ] [INFO] Starting gunicorn  17.5
2013 - 08 - 12  21 : 59 : 34  [ 2097 ] [DEBUG] Arbiter booted
2013 - 08 - 12  21 : 59 : 34  [ 2097 ] [INFO] Listening at: http: //127.0.0.1:5000 (2097)
2013 - 08 - 12  21 : 59 : 34  [ 2097 ] [INFO] Using worker: sync
2013 - 08 - 12  21 : 59 : 34  [ 2102 ] [INFO] Booting worker  with  pid:  2102
2013 - 08 - 12  21 : 59 : 34  [ 2103 ] [INFO] Booting worker  with  pid:  2103
2013 - 08 - 12  21 : 59 : 34  [ 2104 ] [INFO] Booting worker  with  pid:  2104
2013 - 08 - 12  21 : 59 : 34  [ 2105 ] [INFO] Booting worker  with  pid:  2105


我们再来测试下性能~

000902117.jpg



上次用了6秒左右,这次用gunicorn达到了2.4秒左右。。。。。 这速度对比,已经很明了了~

要是还想提高速度,可以改gun.conf配置文件中的worker数目。


cpu的损耗是平均到各个进程,而不是独立在flask的web server上


001504251.jpg



现在我们开始测试gevent 作为wsgi 网关接口的实力~ 


flask的一个demo~

004147980.jpg


gevent wsgi的配置,我先简单的做下配置。。。。

大家想看实例的话,可以去gevent的官网的wsgi的demo   那边还附有编程的接口。。。


1
2
3
4
from gevent.wsgi  import  WSGIServer
from a  import  app
http_server = WSGIServer(( '' 11111 ), app)
http_server.serve_forever()


源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364

我们开始测试更牛逼的gevent的并发能力 。

服务端:

004349743.jpg

客户端:

004720279.jpg


看到秒数了吧~    啥也不说了~    大家都懂了~

我们稍微调节一下~

005459920.jpg


事实上, gunicorn 调用 gevent workers 的代码类似这样的原理(uwsgi+gevent 也是差不多的做法).


http://xiaorui.cc/2014/11/22/%E7%94%A8gunicorn%E5%92%8Cgevent%E6%8F%90%E9%AB%98python-web%E6%A1%86%E6%9E%B6%E7%9A%84%E6%80%A7%E8%83%BD/


uwsgi现在也支持gevent的方式:


1
uwsgi --plugins python,gevent --gevent  100  --socket : 3031  --module myapp



总之,gunicorn和gevent,或者是gunicorn+gevent的合体 都是很值得尝试的东西。


源地址 http://rfyiamcool.blog.51cto.com/1030776/1276364


下图是我推荐的网络框架~ 这个框架和uwsgi的方式很像的,都是在nginx pass_proxy到app的前端口,然后用uwsgi或者是gunicorn来协同处理 。


002728214.png



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
     listen  80 ;
     server_name xiaorui.cc;
                                                                                                                                                                                                                                                                                                                                                                                   
     root /www/xiaorui;
                                                                                                                                                                                                                                                                                                                                                                                   
     access_log xiaorui/access.log;
     error_log xiaorui/error.log;
                                                                                                                                                                                                                                                                                                                                                                                   
     location / {
         proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         if  (!-f $request_filename) {
             proxy_pass http: //127.0.0.1:8000;
             break ;
         }
     }




前端Nginx负载,几个核就跑几个Gunicorn进程,gunicorn相对后面的app又可以给出几个进程。

比起uWSGI来说,Gunicorn对于“协程”也就是Gevent的支持会更好更完美。

方便以后业务的扩展和运营精细化。性能上Gunicorn+Gevent不会比uWSGI弱多少,毕竟后者纯C能只有这么点性能也不容易,比起WSGI Server里面最强的Bjoern而言,Gunicorn也有对应的Meinheld这种利器,况且后者对于HTTP协议的支持比Bjoern更完善。Gevent虽然不是异步框架里面性能最好的,但是绝对是最完善的,社区活跃度也非常高,加上方便的monkey_patch,使得大多数应用不用改代码就能方便地平移过来。这2者结合可以就保证了稳定性,又能有较好性能的组合。


想简单扩展就用 Gunicorn+Gevent,想麻烦折腾就用nginx 做uwsgi或gunicorn的组合 。



 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1276364,如需转载请自行联系原作者



相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
17小时前
|
Java API 数据库
利用Java构建高性能的RESTful Web服务
在现代软件开发中,RESTful Web服务已成为一种流行的架构模式,用于构建可扩展、可维护的网络应用。本文将探讨如何使用Java编程语言及其相关框架(如Spring Boot)来构建高性能的RESTful Web服务。我们将不仅仅关注基本的RESTful API设计,还将深入讨论性能优化、安全性、以及服务扩展性等方面的技术细节。通过本文,读者将能够掌握构建高效RESTful Web服务的核心技术和实践。
|
19小时前
|
弹性计算 关系型数据库 MySQL
【阿里云弹性计算】从零搭建:基于阿里云ECS的高性能Web服务部署实践
【5月更文挑战第21天】本文介绍了如何使用阿里云ECS搭建高性能Web服务。首先,注册阿里云账号购买ECS实例,选择合适配置。接着,通过SSH连接实例,更新系统并安装Apache、PHP和MySQL。创建网站目录,上传代码,配置数据库和PHP。然后,启用Gzip压缩和KeepAlive,调整Apache并发连接数以优化性能。此教程为在阿里云上构建高效Web服务提供了基础指南。
20 5
|
1天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术演进
本文探讨了从前端到后端的技术演进,介绍了前端、后端以及多种编程语言,如Java、Python、C、PHP和Go,以及数据库在构建现代化Web应用中的应用。通过深入剖析各个技术领域的发展和应用,读者将对构建高效、可扩展、安全的Web应用有更深入的理解。
|
3天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
19 7
|
3天前
|
开发框架 中间件 数据库
Django 框架入门全攻略:轻松构建 Web 应用
【5月更文挑战第18天】本文是 Django 入门教程,介绍了如何使用 Django 构建 Web 应用。内容包括安装、项目与应用创建、模型定义、数据库迁移、视图编写、路由配置、模板系统、表单处理和中间件的使用。通过实例展示了 Django 基本流程,帮助初学者快速上手。Django 提供高效工具,便于开发者聚焦业务逻辑,轻松构建功能丰富的 Web 应用。
21 5
|
3天前
|
存储 缓存 API
Flask 框架在大型 Web 应用中的使用与挑战
【5月更文挑战第18天】Flask框架适用于快速开发轻量级Web应用,但用于大型应用时需应对性能、代码管理和团队协作的挑战。通过集成扩展处理复杂需求,使用蓝图组织代码,以及引入缓存优化性能,结合明确的代码规范和开发流程,可有效应对挑战,构建高效稳定的应用。
19 5
|
3天前
|
数据库连接 Python
Flask 框架入门与实践:构建你的第一个 Web 应用
【5月更文挑战第18天】本文介绍了使用 Flask 框架构建第一个 Web 应用的步骤。首先通过 `pip install Flask` 安装框架,然后编写基本的 Python 代码创建应用,包括定义路由和响应。示例展示如何显示 "Hello, World!",并扩展到显示用户信息的功能。利用模板(如 `index.html`)可使页面更丰富。随着学习深入,可以利用 Flask 的更多特性,如表单处理和数据库连接,来构建更复杂的 Web 应用。本文旨在激发读者对 Flask 和 Web 开发的兴趣,鼓励不断探索和实践。
19 7
|
3天前
|
测试技术 数据库
深入理解软件测试中的自动化框架选择
【5月更文挑战第18天】 在快速发展的软件行业中,自动化测试已成为提升测试效率、保障产品质量的重要手段。选择合适的自动化测试框架对于实现高效、可靠的测试过程至关重要。本文将探讨不同的自动化测试框架特点,分析其适用场景,并讨论如何基于项目需求和团队技能进行最佳选择。
|
4天前
|
缓存 监控 API
利用Python构建高性能的Web API后端服务
随着微服务架构的普及和RESTful API的广泛应用,构建高性能、可扩展的Web API后端服务变得尤为重要。本文将探讨如何利用Python这一强大且灵活的语言,结合现代Web框架和工具,构建高效、可靠的Web API后端服务。我们将分析Python在Web开发中的优势,介绍常用的Web框架,并通过实际案例展示如何设计并实现高性能的API服务。
|
4天前
|
存储 前端开发 网络协议
所有的 Web 应用其实就是一个 socket 服务端, 而用户使用的浏览器就是一个 socket 客户端程序
所有的 Web 应用其实就是一个 socket 服务端, 而用户使用的浏览器就是一个 socket 客户端程序
10 0