add by zhj:

在Benchmark of Python WSGI Servers一文中,作者进行详细分析,得出的结论是gevent在所有WSGI Server(包括Tornado、Uwsgi等)中性能最好。

另外,我想说gevent适合socket IO,其它类型的IO,如磁盘IO是否适合就不清楚了。

原文:https://co-ding.com/?p=356#comment-6036

我的一个线上web服务在生产中遇到一个性能问题:当初为了方便选择了wsgi(众所周知wsgi协议,不像tornado之类的的框架可以使用异步IO),

而服务本身有大量IO(倒并不是带宽很大,只是会经常阻塞),因此一个业务完成可能需要很长时间几秒甚至十几秒。

我使用uwsgi这样启动:

uwsgi --harakiri  --harakiri-verbose --http : -M  --processes  --threads  --wsgi-file wsgi.py

也就是说同时并发量为 12*2=24,这是在以后服务量增长之后是完全不能接受的。

因此,我开始考虑增加线程数,使用siege测试发现线程数过多的时候,由于线程上下文切换导致效率很低,本来5秒钟的业务,最后平均7s才能完成,

这其中有2秒钟用在了线程切换上面

siege -r  -c   "http://127.0.0.1:9090/api POST <./test.post"

于是考虑使用异步框架,tornado,gevent之类的。

我首先看了下tornado,tornado是一个web框架,它同时也提供了很多异步的库,包括httpclient(Asynchronous HTTP
client)。因此我的程序要想在tornado上面跑并

发挥异步的作用,必须修改大量代码,将所有的IO操作更换成tornado提供的异步函数。这本身是不可接受的,不如直接增加进程/线程来的方便。

接下来我看了下gevent,gevent是使用greenlet协程Coroutine来实现异步网络框架,而且它提供了一个异常方便了monkey模块,可以在不修改原来

的使用python标准库函数的程序的情况下,将程序转换成可以使用gevent框架的异步程序。

即:

from gevent import monkey
# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

gevent虽然也自带一个wsgi server,但是毕竟不是专业的web服务器,我们还是要使用uwsgi的。然后我发现uwsgi对gevent的支持还是很好的,

直接使用下面的命令启动,甚至不需要改动一行代码。(add by zhj: 在uwsgi中如果使用了gevent参数,就不能用thread参数了,不过,貌似仍可以在进程中创建线程)

uwsgi --gevent  --gevent-monkey-patch --http : -M  --processes  --wsgi-file wsgi.py

--gevent参数后面的100, 制定了最大spawn 100个协程,这样我们的理论并发数可以达到 100*4。

使用了参数 --gevent-monkey-patch 让我们连最后需要修改代码的地方都没有了:它将自动调用monkey.patch_all()打补丁。

这样,我们就一句代码都没有修改,就使程序转换为异步的程序,大大提高并发数。与提高线程数相比,大大减少了线程切换的开销(协程之间切换的代价很低)。

 

使用gevent提高IO繁忙型wsgi服务的并发量(转)的更多相关文章

  1. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  2. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  3. 变通实现微服务的per request以提高IO效率(三)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. 变通实现微服务的per request以提高IO效率(二)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. 变通实现微服务的per request以提高IO效率

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. SQL Server-聚焦存储过程性能优化、数据压缩和页压缩提高IO性能(一)

    前言 关于SQL Server基础系列尚未结束,还剩下最后一点内容未写,后面会继续.有园友询问我什么时候开始写SQL Server性能系列,估计还得等一段时间,最近工作也比较忙,但是会陆陆续续的更新S ...

  7. 以gevent(协程) 方式跑uwsgi服务

    当你的系统存在一些IO或网络请求较久的操作时, 如果以默认的方式启动uwsgi服务, 那么如果这类请求过多的时候, 所以进程被卡死. uwsgi就无法再对后续请求做处理了. 这时可以用gevent的方 ...

  8. 进程池与线程池、协程、协程实现TCP服务端并发、IO模型

    进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...

  9. 搭建RESTful API 之 实现WSGI服务的URL映射

    javarestfull 搭建参考 http://blog.csdn.net/hejias/article/details/47424511 问题引出:对于一个稍具规模的网站来说,实现的功能不可能通过 ...

随机推荐

  1. discuz 更换域名 导致qq登录不能用的问题

    今天论坛换了域名,导致qq登录不能用.于是各种百度,终于找到了解决方案,特此记录一下 解决方法:1,首先清空你站点的id和key,并且设置为未注册云平台: 2,找一个新域名(未开过云平台的就可),如果 ...

  2. php xml DOM编码

    PHP XML文件编程 一.PHP DOM编程 <?php //1.创建dom对象 $xmldoc=new DOMDocument(); //2.加载xml(指定对哪个xml文件进行操作) $x ...

  3. R语言︱文本挖掘套餐包之——XML+SnowballC+tm包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...

  4. R语言与格式、日期格式、格式转化

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言的基础包中提供了两种类型的时间数据,一类 ...

  5. 利用Eclipse中的Maven构建Web项目报错(二)

    利用Eclipse中的Maven构建Web项目 1.错误描述 [INFO] Scanning for projects... [INFO] [INFO] Using the builder org.a ...

  6. Vue项目搭建及原理三

    我每次写博客都要先在本地写一遍草稿,所以之前有些发布顺序可能会有一丢丢凌乱 哈哈哈,以后绝对改正,那下面我们就说一下创建及项目目录结构吧 三.创建项目 1.初始化Webpack p.p1 { marg ...

  7. 存储过程 100w提交

    create or replace procedure largedata_insert(ip_table_name   in varchar2, --目标表 ip_table_column in v ...

  8. Unity开发之实现更换鼠标图片

    在玩游戏的时候,感觉游戏里的鼠标图片特酷炫,23333,今天我就总结了两种方法! 我是做Unity开发的,所以方法仅针对于Unity平台........ 方法如下: 1.Unity客户端直接更改,步骤 ...

  9. Halcon的应用程序 打开后 弹出没有帮助文件错误提示

    问题: Halcon的应用程序 打开后 弹出没有帮助文件错误提示 解决方法: 建立(C:\ProgramFiles\MVTec\halcon)目录,将halcon安装目录下的help文件夹复制过来即可 ...

  10. GridView 翻页 索引超出范围

    事件回顾 今天GridView翻页时,又遇到错误:索引超出范围.必须为非负值并小于集合大小. 这是当时的PageIndexChanging和RowCommand两个事件的后台代码 protected ...