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

tcpforward server benchmark go python pypy twisted gevent

  •  
  •   myrual ·
    myrual · 2012-10-18 15:10:21 +08:00 · 5645 次点击
    这是一个创建于 4438 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我作的一个试验。
    主机 amazon ec2, small, ubuntu 10.04 32bit

    pypy2.7 + twisted 最大连接 320 峰值流量 20M
    python2.6 + twisted 最大连接 250 峰值流量 16M
    golang1.0.2 最大连接 200 峰值流量 13M
    python2.6 + gevent 最大连接 150 峰值流量 10M

    感受:
    pypy确实很强大。
    golang很好用。
    gevent不是简单的线程替代品,不sleep或者其他io block是不会交出控制权的。

    代码库如下
    https://github.com/myrual/tcpforward_benchmark
    16 条回复    1970-01-01 08:00:00 +08:00
    phuslu
        1
    phuslu  
       2012-10-18 15:51:20 +08:00
    gevent.sleep(0) 似乎不是必须的.
    http://gist.github.com/3910331
    phuslu
        2
    phuslu  
       2012-10-18 15:53:50 +08:00
    还有, python 2.6 比较老, 可能测试 python 2.7 更有说服力.
    lookhi
        3
    lookhi  
       2012-10-18 15:59:04 +08:00
    再加个tornado的吧
    phuslu
        4
    phuslu  
       2012-10-18 16:03:49 +08:00
    @lookhi tornado 其实不必加上啦, 这种 benchmark 它不占优势. nodejs 最新版本倒是值得一试, 估计性能会非常好.
    phuslu
        5
    phuslu  
       2012-10-18 16:16:31 +08:00
    看了一下 twisted 代码, 使用的 buffer size 是 65536, 大概是这点比较占便宜.
    建议楼主把 golang/gevent 的 buffer size 也改成 65536 试下.
    myrual
        6
    myrual  
    OP
       2012-10-18 16:35:44 +08:00
    @phuslu 用了你的代码,最大连接260, 最大流量13M
    phuslu
        7
    phuslu  
       2012-10-18 17:23:56 +08:00
    @myrual buffer size 调成 65536 呢?
    myrual
        8
    myrual  
    OP
       2012-10-18 17:55:38 +08:00
    @phuslu 把go lang里面的接受buffer改到65535就获得了 23M的稳定峰值流量, 400个转发socket.
    phuslu
        9
    phuslu  
       2012-10-18 18:10:19 +08:00
    @myrual 理论上说 python27+gevent 不会比 python27+twisted 更慢. nodejs 0.8.x 在这类 benchmark 中应该最占便宜.
    myrual
        10
    myrual  
    OP
       2012-10-18 18:13:07 +08:00
    python gevent 把recv的数量改大没有变化。
    phuslu
        11
    phuslu  
       2012-10-18 18:19:51 +08:00
    @myrual 呃, 我又把 gist 的代码改了改, 之前 write 没用 buffer, 现在用上了, 可能会好些.
    myrual
        12
    myrual  
    OP
       2012-10-18 20:57:54 +08:00
    明天到公司试试。顺便尝试一下python27 + gevent 的效果
    myrual
        13
    myrual  
    OP
       2012-10-19 09:22:37 +08:00
    @phuslu 峰值稳定在20M,400左右的连接。
    phuslu
        14
    phuslu  
       2012-10-19 09:48:53 +08:00
    @myrual 嗯, 谢谢. 这个结果差不多是 python 的极限了.
    之前也看过一些 web 或 tcp 方面 benchmark, gevent 基本是 python 目前唯一拿得出手的比较完备的框架. (单测 web 框架的话, bjoern/meinheld 都会比 gevent 快很多, 可惜不够完备)
    tornado 的话, 基本比 gevent 慢 30% 以上, 吃亏在它的 IOStream 的 buffer 是用 collection.deque 实现, 尽管已经高度优化, 但是还是比不上 gevent 集成的 libev/libevent.
    纯 IO 的测试(不涉及后端), gevent 勉强可以达到 golang/nodejs 同一个数量级, 但是如果加上一些简单的计算, 差不多慢2~3倍. 如果计算量比较大或者设计后端操作, 那就更慢了.
    nodejs/golang 目前做这类 benchmark 性能最好, 而且 golang 在不断发展中, 很期待~
    lookhi
        15
    lookhi  
       2012-10-27 07:42:00 +08:00
    @myrual 激发这个benchmark的程序在哪里啊?
    myrual
        16
    myrual  
    OP
       2012-10-27 12:51:09 +08:00
    @lookhi 你说的是客户端么?刚刚简单改了一下,把自己业务相关的名字修改了一下,没验证就push到 github了。依赖gevent库。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5104 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:40 · PVG 16:40 · LAX 00:40 · JFK 03:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.