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

WSGI Server有哪些:

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

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

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

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

安装 gunicorn  ~

pip install gunicorn

这里我们说下 gunicorn 的用法

最简单的运行方式就是:

gunicorn code:application

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

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

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

gunicorn -b 10.2.20.66:8080 code:application
#from http://rfyiamcool.blog.51cto.com

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

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 的配置文件

[[email protected] 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. [[email protected]66 tmp]# cat xiaorui.py

  2.  

    from flask import Flask

  3.  

    from flask import render_template_string

  4.  

    import os

  5.  

    from werkzeug.contrib.fixers import ProxyFix

  6.  

    app = Flask(__name__)

  7.  

    @app.route(‘/‘)

  8.  

    def index():

  9.  

    return "worked!"

  10.  

    app.wsgi_app = ProxyFix(app.wsgi_app)

  11.  

    if __name__ == ‘__main__‘:

  12.  

    app.run()

先跑本身的demo ~

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

结果是:

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

cpu的损耗,不小哈~

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

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

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

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

启动后会出现:

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

我们再来测试下性能~

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

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

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

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

flask的一个demo~

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

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

  1. from gevent.wsgi import WSGIServer

  2.  

    from a import app

  3.  

    http_server = WSGIServer((‘‘, 11111), app)

  4.  

    http_server.serve_forever()

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

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

服务端:

客户端:

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

我们稍微调节一下~

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

  1. #!/usr/bin/env python

  2.  

    # coding:utf-8

  3.  

  4.  

    import sys

  5.  

    import os

  6.  

  7.  

    import gevent

  8.  

    import gevent.monkey

  9.  

    import gevent.wsgi

  10.  

    import gevent.server

  11.  

    gevent.monkey.patch_all()

  12.  

  13.  

    import socket

  14.  

    import multiprocessing

  15.  

  16.  

    def app(environ, start_response):

  17.  

    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/plain‘)])

  18.  

    yield str(socket.getaddrinfo(‘xiaorui.cc‘, 80))

  19.  

  20.  

    def handle_signals():

  21.  

    gevent.sleep(sys.maxint)

  22.  

  23.  

    if __name__ == ‘__main__‘:

  24.  

    listenner = gevent.server._tcp_listener((‘‘, 8002), backlog=500, reuse_addr=True)

  25.  

    for i in xrange(multiprocessing.cpu_count()*2):

  26.  

    server = gevent.wsgi.WSGIServer(listenner, app, log=None)

  27.  

    process = multiprocessing.Process(target=server.serve_forever)

  28.  

    process.start()

  29.  

    handle_signals()

uwsgi现在也支持gevent的方式:

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来协同处理 。

  1. server {

  2.  

    listen 80;

  3.  

    server_name xiaorui.cc;

  4.  

  5.  

    root /www/xiaorui;

  6.  

  7.  

    access_log xiaorui/access.log;

  8.  

    error_log xiaorui/error.log;

  9.  

  10.  

    location / {

  11.  

    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;

  12.  

    proxy_set_header Host $http_host;

  13.  

    proxy_redirect off;

  14.  

    if (!-f $request_filename) {

  15.  

    proxy_pass http://127.0.0.1:8000;

  16.  

    break;

  17.  

    }

  18.  

    }

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

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

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

原文地址:https://www.cnblogs.com/ExMan/p/10152638.html

时间: 2024-10-04 07:54:20

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

在web上创建可视化的交互式数据javascript框架-JavaScript InfoVis Toolkit

原文:在web上创建可视化的交互式数据javascript框架-JavaScript InfoVis Toolkit 源代码下载地址:http://www.zuidaima.com/share/1554696025099264.htm 官方站点:http://philogb.github.io/jit/index.html 适应各种结构表现(机关.人际关系.文件路径...) 适应客户需求,找的表现机关级别关系图. 如: 这一款JS绘图框架,非常小,压缩后 只有150kb.目前只用到它的这一种表现

web框架本质和简单的web框架

目录 二. web框架的本质: 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 二. web框架的本质: 一 web框架的本质及自定义web框架 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,就可以自己实现Web框架了. html文件内容如下,名称为test.h

Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了Commons FileUpload). 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了. 众所周知,在客户端代码中需要使用<

Web桌面应用框架2:著名的WEB桌面应用分析

前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是WEB窗口不同,仅在窗口的部分子窗口使用WebView,和原生UI或DirectUI结合的方式. 这种在C/C++程序里嵌入WebView的方式,由于没有一种公认.通用的框架或方法,基本是最困难和最原始的方式蛮干,或者自研平台,难以公开.但是也有很多效果很棒,很著名的软件.那么下面我们来细数一下这些

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版

高性能网站建设进阶指南:Web开发者性能优化最佳实践是<高性能网站建设指南>姊妹篇.作者Steve Souders是Google Web性能布道者和Yahoo!前首席性能工程师.在本书中,Souders与8位专家分享了提升网站性能的最佳实践和实用建议,主要包括:理解Ajax性能,编写高效的JavaScript,创建快速响应的应用程序.无阻塞加载脚本, 跨域共享资源,无损压缩图片大小,使用块编码加快网页渲染:避免或取代iframe的方法,简化CSS选择符,以及其他技术.性能是任何一个网站成功的关

Django框架介绍 python三大主流web框架之一

一.学习准备 1.下载安装Django(建议安装1.x版本) 方法:终端cmd输入命令:pip install django==1.11.11  然后回车即可 校验是否安装成功:django-admin 二.纯手撸web框架 1.纯手撸web框架 软件开发架构 c/s架构 b/s架构 本质bs也是cs web后端 需求: 1.根据用户输入不同的后缀返回不同的内容 从符合http协议格式的数据中获取用户输入的后缀 不足之处: 1.socket代码是我们自己写的 2.http数据也是我们自己处理的

[转]你会做Web上的用户登录功能吗?

转自:http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能.以下内容,转载时请保持原文一致,并请注明作者和出处. 用户名和口令 首先,我们先来说说用户名和口令的事.这并不是本站第一次谈论这

cacti监控一个web上的多个tomcat

Cacti监控一个web上多个tomcat 第一部分:监控单个tomcat 1.首先下载监控tomcat的模板 TomcatStats-0.1.zip 下载之后,修改tomcatstats.pl, a.注释第三行左右的 use Data::Dumper; b.将 第19行左右的my $xml = `GET $url`; 改为my $xml = `wget -qO - $url`; c.在第24行左右添加此行   print "  "; d.注释第23行左右的print Dumper($