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 · 6359 次点击
    这是一个创建于 2812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在系统使用的是 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
    zhuangzhuang1988  
       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   ·   实用小工具   ·   5468 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.