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

nginx + uwsgi + flask 性能测试

  •  
  •   hydrazt · 2014-08-07 11:48:49 +08:00 · 8422 次点击
    这是一个创建于 3765 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在一台4核2cpu,16G内存的服务器上做了个测试

    1. 直接通过nginx访问一个1k大小的文件,能处理13000req/s
    2. 通过nginx代理到uwsgi,访问flask的static文件,也是1k大小,能处理3000req/s

    性能差了4倍,访问同样的文件,方法2多走了一层uwsgi,性能差距能有4倍吗?

    测试时nginx,uwsgi都是8process的
    17 条回复    2014-09-16 13:16:50 +08:00
    tanywei
        1
    tanywei  
       2014-08-07 11:56:44 +08:00   ❤️ 1
    nginx本来就是干静态的料吧
    passluo
        2
    passluo  
       2014-08-07 11:59:31 +08:00   ❤️ 1
    send_from_directory() ?
    datou552211
        3
    datou552211  
       2014-08-07 12:03:04 +08:00 via iPhone   ❤️ 1
    你连动态性能都没测
    hydrazt
        4
    hydrazt  
    OP
       2014-08-07 12:10:17 +08:00
    @tanywei 性能上有区别时意料中的,但是4倍,表示有些惊讶

    @datou552211
    也做了动态的测试

    1. nginx + uwsgi + flask + mongodb 测试的网页需要到mongodb中获取数据,页面大概6k, 只能处理300req/s

    2. nginx + uwsgi + flask + flask-redis + mongodb flask-redis 对flask的页面做了类似 varnish的cache, 性能直接从300req/s 增加到 3000req/s

    考虑到flask-redis是在uwsgi后端的,如果使用varnish,且放在nginx 和 uwsgi之间,估计能处理10000req/s
    hydrazt
        5
    hydrazt  
    OP
       2014-08-07 12:11:51 +08:00
    @passluo 没有使用send_from_directory, 测试文件直接放到project/static/目录中,测试时直接时http://xxx.com/static/test.file
    zjgood
        6
    zjgood  
       2014-08-07 12:13:15 +08:00 via Android   ❤️ 1
    @hydrazt 我觉得前端就放一个varnish就够了,然后设置好各种刷新缓存的例外情况,如admin登陆,提交评论。后端标准lnmp或者lamp,这样不折腾
    hydrazt
        7
    hydrazt  
    OP
       2014-08-07 12:16:05 +08:00
    @zjgood 性能没遇到瓶颈,flask-redis相当简单,就没上varnish了,打算有时间再说了
    还是很想问问 uwsgi对性能的影响
    lj0014
        8
    lj0014  
       2014-08-07 12:18:08 +08:00 via Android
    有试下把uwsgi再多开几个吗
    hydrazt
        9
    hydrazt  
    OP
       2014-08-07 12:19:56 +08:00
    @lj0014 没有试过,uwsgi使用的是多进程模式,多跑几个uwsgi感觉没有什么用
    est
        10
    est  
       2014-08-07 12:22:34 +08:00 via Android
    呵呵。
    lianghui
        11
    lianghui  
       2014-08-07 12:27:16 +08:00
    你敢在裹一个https么,不keep-alive 请相信80req/s很正常
    hydrazt
        12
    hydrazt  
    OP
       2014-08-07 13:04:11 +08:00
    @lianghui nginx + uwsgi + flask + mongodb 这个结构已经很简单了啊
    lj0014
        13
    lj0014  
       2014-08-07 13:08:48 +08:00   ❤️ 1
    @hydrazt 可试下多开uwsgi实例,uwsgi的队列可能会成为瓶颈
    hydrazt
        14
    hydrazt  
    OP
       2014-08-07 13:44:25 +08:00
    @lj0014 之前使用1个uwsgi -M -p 8的参数,修改为4个uwsgi -M -p 4后,处理能力从3000req/s 提高到 5500 req/s了, 有意思啊
    KDr2
        15
    KDr2  
       2014-08-07 16:01:35 +08:00
    nginx 静态文件 主要是 sendfile 立功了吧。
    hydrazt
        16
    hydrazt  
    OP
       2014-08-07 18:27:55 +08:00
    @lj0014 重新测试了一下,之前的测试是有问题的,uwsgi启动的时候,我将log直接在console上输出了,压测的时候会有大量的打印输出,影响了测试结果。

    把输出重定向到文件后,单个uwsgi -M -p 8的处理能力已经达到6700req/s, 相比nginx直接提供服务的13000req/s,算是合理的结果了。

    之前单个uwsgi和4个uwsgi测试出来的处理能力不同,应该也是和大量输出log有关的,4个uwsgi的话,有4个uwsgi主进程,打印输出可以同时使用到4个cpu的中断,性能上相比单个uwsgi好,也解释的通了。
    NCE
        17
    NCE  
       2014-09-16 13:16:50 +08:00
    add tornado.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:14 · PVG 03:14 · LAX 11:14 · JFK 14:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.