Python WSGI servers 高性能选型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cloudyplain
V2EX    Python

Python WSGI servers 高性能选型

  •  
  •   cloudyplain 2017-03-17 11:04:07 +08:00 6681 次点击
    这是一个创建于 3130 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在系统使用的是 nginx+uwsgi(开启 gevent)+bottle(gevent monkey patch),测试场景(读 redis), qps 4k 左右,请问还有性能更高、稳定的生产级别架构吗?谢谢!

    18 条回复    2017-03-19 11:02:29 +08:00
    yanzixuan
        1
    yanzixuan  
       2017-03-17 11:08:23 +08:00
    我用 flask ,一直配合 gunicorn 的 eventlet 选项使用。貌似没毛病。
    est
        2
    est  
       2017-03-17 11:15:19 +08:00
    先测 redis 。
    freestyle
        3
    freestyle  
       2017-03-17 11:54:03 +08:00
    mark 你的 nginx 多少个 worker? upstream? uwsgi 多少个 processes?
    zhuangzhuang1988
        4
    zhuanghuang1988  
       2017-03-17 13:01:41 +08:00
    Cherrypy 的 wsgi
    zhuangzhuang1988
        5
    zhuangzhuang1988  
       2017-03-17 13:03:39 +08:00
    你都用 Bottle 了 可以看下这个
    http://bottlepy.org/docs/dev/deployment.html#switching-the-server-backend 列举了好多 wsgi server
    cloudyplain
        6
    cloudyplain  
    OP
       2017-03-17 13:50:05 +08:00
    @freestyle nginx 16 worker,upstream 2, uwsgi 8 processes, gevent 800,没做优化,但是使用 node 来测试,性能要高出很多, 1w+ qps 。
    baocaixiong
        7
    baocaixiong  
       2017-03-17 13:53:50 +08:00
    gunicorn+meinheld
    cloudyplain
        8
    cloudyplain  
    OP
       2017-03-17 14:11:05 +08:00
    @baocaixiong qps 能到多少?我们这个产品是 n 年前的了,想知道现在业界主流的玩法。
    wuxqing
        9
    wuxqing  
       2017-03-17 16:39:04 +08:00
    性能 uwsgi 算是比较高的,但是我还是建议 gunicorn ,因为我们团队碰到一些问题:
    wuxqing
        10
    wuxqing  
       2017-03-17 16:40:26 +08:00   2
    性能 uwsgi 算是比较高的,但是我还是建议 gunicorn ,因为我们团队碰到一些问题:
    使用 uwsgi ,通过 zmq 发消息会丢失;有时候使用 requests 抓取网页会卡死
    wuxqing
        11
    wuxqing  
       2017-03-17 16:41:33 +08:00   1
    gunicorn+meinheld 我测试不稳定,会出现空白页面。我现在用的是 gunicorn+gevent
    wuxqing
        12
    wuxqing  
       2017-03-17 16:43:29 +08:00   1
    如果要性能高,可以试试 sanic ,速度很惊艳
    gladuo
        13
    gladuo  
       2017-03-17 20:00:00 +08:00
    大概就是这个水平,用 cache 吧
    jarlyyn
        14
    jarlyyn  
       2017-03-17 20:22:08 +08:00
    redis 用了链接池没有?

    上次代码有错,连接池没有挂上。

    不管什么机器死活只有几千 qps 。

    改成连接池后上几 w 了。
    xu1ming
        15
    xu1ming  
       2017-03-17 23:56:28 +08:00 via iPhone   1
    楼主可以试试 gunicorn+meinheld 并发很高
    xu1ming
        16
    xu1ming  
       2017-03-18 08:12:52 +08:00 via iPhone
    @wuxqing 能具体描述下空白页怎么出现的吗,我用了一年多,好像没出现说白页的…
    wuxqing
        17
    wuxqing  
       2017-03-18 15:24:18 +08:00
    @xu1ming 当时的情况:
    有几个 API 服务, flask 写的,用的是 uWSGI ,工作一直正常,但是加上日志后(用 zmq 转发),出现日志丢失的情况
    然后改用 gunicorn ,默认 worker class 是 sync ,测试正常
    由于性能偏低,改用 meinheld ,然后客户端有时会出现异常,输出日志发现 API 服务返回的是空白页(状态是 200 )
    现在用 gunicorn+gevent ,未出现问题

    顺便说下, API 服务是在 docker 中运行的
    sagaxu
        18
    sagaxu  
       2017-03-19 11:02:29 +08:00
    @wuxqing uwsgi 里用 zmq 需要 enable-threads 和 lazy-apps 。因为 zmq 会创建后台线程去做报文收发,操作系统的机制决定, fork 来的子进程会丢失线程,导致新创建的 worker 进程没有 zmq 的线程,能正常工作就怪了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     870 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:27 PVG 04:27 LAX 13:27 JFK 16:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86