使用gevent提高IO繁忙型wsgi服务的并发量(转)
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服务的并发量(转)的更多相关文章
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- 变通实现微服务的per request以提高IO效率(三)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 变通实现微服务的per request以提高IO效率(二)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 变通实现微服务的per request以提高IO效率
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- SQL Server-聚焦存储过程性能优化、数据压缩和页压缩提高IO性能(一)
前言 关于SQL Server基础系列尚未结束,还剩下最后一点内容未写,后面会继续.有园友询问我什么时候开始写SQL Server性能系列,估计还得等一段时间,最近工作也比较忙,但是会陆陆续续的更新S ...
- 以gevent(协程) 方式跑uwsgi服务
当你的系统存在一些IO或网络请求较久的操作时, 如果以默认的方式启动uwsgi服务, 那么如果这类请求过多的时候, 所以进程被卡死. uwsgi就无法再对后续请求做处理了. 这时可以用gevent的方 ...
- 进程池与线程池、协程、协程实现TCP服务端并发、IO模型
进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...
- 搭建RESTful API 之 实现WSGI服务的URL映射
javarestfull 搭建参考 http://blog.csdn.net/hejias/article/details/47424511 问题引出:对于一个稍具规模的网站来说,实现的功能不可能通过 ...
随机推荐
- MxNet+R︱用R语言实现深度学习(单CPU/API接口,一)
MxNet有了亚马逊站台之后,声势大涨,加之接口多样化,又支持R语言所以一定要学一下.而且作为R语言的fans,为啥咱们R语言就不能上深度学习嘞~ -------------------------- ...
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24...)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法. swscale主 ...
- 个性化WinPE封装方法----制作过程需要了解的“命令”
1.在现有的Windows7条件下,自动在E盘建立mywinpe文件夹,设置 Windows PE 构建环境,并保存到E:\mywinpe下 copype.cmd x86 E:\mywinpe 2.将 ...
- 小程序版好友对战实战-wss部署与小程序用户登录时序
上一篇文章是对需求的分析,本次将逐渐进入代码阶段.本次主要的内容包括服务端wss的部署以及小程序端用户授权的时序及逻辑. wss的配置与部署 微信小程序出于安全考虑,要求所有涉及到网络的操作,必须使用 ...
- 对于多线程下Servlet以及Session的一些理解
今天,小伙伴突然问到了Servlet是不是线程安全的问题.脑子当时一卡壳,只想到了单实例多线程.这里做一些总结. Servlet体系是建立在Java多线程的基础之上的,它的生命周期是由Tomcat来维 ...
- Dynamics 365 Online用户密码三问及其解答
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复264或者20170903可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Python机器学习介绍(Python Machine Learning 中文版)
Python机器学习 机器学习,如今最令人振奋的计算机领域之一.看看那些大公司,Google.Facebook.Apple.Amazon早已展开了一场关于机器学习的军备竞赛.从手机上的语音助手.垃圾邮 ...
- TensorLayer官方中文文档1.7.4:API – 数据预处理
所属分类:TensorLayer API - 数据预处理¶ 我们提供大量的数据增强及处理方法,使用 Numpy, Scipy, Threading 和 Queue. 不过,我们建议你直接使用 Tens ...
- [BZOJ1543] 生成树计数 (Kruskal)
Description 给定一个连通的带边权的图(允许自环和重边),求不同的最小生成树个数.两个生成树不同当它们所用的边的序号不同,换句话说,重边算多次. Input 第一行n,m,表示点数和边数(1 ...
- [ZJOI2014]力
推公式发现(这不是水题吗,这要推吗) \[E_i=\Sigma^{i-1}_{j=1} \frac{q_j}{(i-j)^2} - \Sigma^{n}_{j=i+1} \frac{q_j}{(i-j ...