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
vencent
V2EX  ›  Python

Flask 默认的阻塞 IO 和使用 gevent 的非阻塞 IO,性能差距有多大?

  •  
  •   vencent · 2018-12-10 22:11:47 +08:00 · 3245 次点击
    这是一个创建于 1935 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的 web 程序原先是 uwsgi+flask,preforking 同步。最近想尝试一下 gevent,于是打上猴子补丁测试了一下。环境是 docker for mac, 虚拟机的 CPU 设置为 8 核心(宿主为 i7 7700k ),虚拟机的内存 8G。

    阻塞 IO 的 uwsgi 配置为:

    master = true

    processes = 6

    thunder-lock = true

    cheaper = 3

    cheaper-algo = backlog

    gevent 的 uwsgi 配置为:

    master = true

    processes = 6

    gevent = 1000

    thunder-lock = true

    cheaper = 3

    cheaper-algo = backlog

    我的测试结果是:

    • 对于 IO 较少的操作,使用 gevent 后耗时严重增加(可能跟我 gevent 设置为 1000 有关,100 应该能缓和一些)
    • 对于一个请求内有几次数据库读写的操作来说,使用 gevent 性能提升不是很大

    具体测试结果: https://s1.ax1x.com/2018/12/10/FJ3yz4.png

    请问各位,我这个测试结果靠谱吗?有没有什么不严谨的地方?结论是否成立呢?

    17 条回复    2018-12-12 16:41:10 +08:00
    vencent
        1
    vencent  
    OP
       2018-12-10 22:13:41 +08:00
    还有一个问题是,测试结果里 RPS 只有 30/s 左右,是本来就只能达到这个样子,还是测试环境有问题,还是代码本身的问题呢?
    westoy
        2
    westoy  
       2018-12-10 22:19:15 +08:00
    没代码不好说
    xpresslink
        3
    xpresslink  
       2018-12-10 22:31:50 +08:00
    这么给你打个比方吧, 你开了个火锅店,只有 20 个桌子,平均每小时能接待 20 桌顾客。但是没想到生意太火,总是暴满,新来的顾客一看没位子扭头就走了,于是你在门口搭个棚子,摆上 10 个板凳,让顾客等位排号。
    那么现在你平均每小时能接待 30 桌顾客么? 当然不能,还是 20 桌,只不过多了 10 个顾客在假装接受服务。
    liangch
        4
    liangch  
       2018-12-10 22:33:37 +08:00
    楼上的形象。
    janxin
        5
    janxin  
       2018-12-10 23:11:35 +08:00 via iPhone
    @liangch 其实这个是有问题的…
    4ever911
        6
    4ever911  
       2018-12-11 00:34:58 +08:00 via Android
    quart + aiohttp
    Ehco1996
        7
    Ehco1996  
       2018-12-11 10:05:01 +08:00
    如果卡在 io 上 db/redis 这种,gevent 当然不会有帮助
    clearT
        8
    clearT  
       2018-12-11 11:29:00 +08:00 via iPhone
    @Ehco1996 为什么,db/redis 也是建立 socket 连接,gevent 猴子补丁不是将这些都变成异步的了吗
    vencent
        9
    vencent  
    OP
       2018-12-11 13:14:29 +08:00
    @clearT 同问,数据库的网络 IO 应该已经是异步了的呀
    vencent
        10
    vencent  
    OP
       2018-12-11 13:16:49 +08:00
    @xpresslink 这个比喻有问题吧。难道不应该是:一共 20 个服务员,阻塞 IO 时服务员只能在顾客用餐时一直守在顾客桌边傻等着,而异步 IO 时服务员可以在顾客吃的时候服务别的用户?
    xpresslink
        11
    xpresslink  
       2018-12-11 14:10:32 +08:00   ❤️ 1
    @vencent 复用服务员确实可以提高服务能力么?增加 100 个服务员好了,你只是能拖住来的顾客暂时别走而已。
    最终的提供服务能力还是要靠桌数和后厨的供应力。

    你以为在一个串联链路中增加个环节就能提高整个链路的性能么?因为性能的瓶颈最终主要是卡在磁盘 IO 那里了。通常的 PC 硬盘就一个磁头,不管你多线程还是异步,最终于到磁盘那里读写都要排队一个一个来。服务器的性能要想提高只能增加 CPU 内存磁盘性能这些,或者再加服务器分布式。
    vencent
        12
    vencent  
    OP
       2018-12-11 15:32:24 +08:00
    @xpresslink IO 不仅仅是磁盘 IO 啊,还有网络 IO
    xpresslink
        13
    xpresslink  
       2018-12-11 16:34:42 +08:00
    @vencent 我都说了,要优化性能先要搞清楚瓶颈来自于哪里,针对性去解决,90%的 web 应用性能瓶颈都在数据库或与磁盘 IO 相关,网络 IO 阻塞占比相对较小。再说了通常所说的网络 IO 造成的延迟是在网络链路上的,不是你服务器本身能解决的,你访问美国服务器很慢,只能在国内再部署服务器来解决。
    Ehco1996
        14
    Ehco1996  
       2018-12-12 13:57:23 +08:00
    @clearT 猴子补丁并不能保证所有的库都能使用,
    假设你连接 redis/db 用的库不支持异步的话,那么每个 request 过来还是会同步的等待 io 的结果
    vencent
        15
    vencent  
    OP
       2018-12-12 16:23:16 +08:00
    @Ehco1996 如果数据库的包是 c 语言写的当然不支持,但是对于 pymysql 这样的纯 python 库而言,猴子补丁应该是有效的。因此,“如果卡在 io 上 db/redis 这种,gevent 当然不会有帮助”这个“当然”是不成立的。
    vencent
        16
    vencent  
    OP
       2018-12-12 16:28:36 +08:00
    @xpresslink 访问数据库的 IO 不算网络 IO 嘛?我想说的网络 IO 是内网的数据库通讯这种。另外想问一下,使用云平台的数据库还需要考虑数据库瓶颈吗?我这个只是一个个人的小项目
    xpresslink
        17
    xpresslink  
       2018-12-12 16:41:10 +08:00
    @vencent 个人小项目通常很少涉及性能问题。用平台的数据库当然也要考虑性能了,因为有很多配置级别价格差距很大,估计你也就是最低的那个配置,只是可用性级别高点,性能不见得比自己在 ECS 上安装的性能强。数据库这部分主要是结构设计,查询优化对性能影响比较大。尽量减少带锁操作,这个不是一两句话能说清楚的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3273 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:40 · PVG 08:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.