`
gashero
  • 浏览: 962865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

协程才是未来-性能夸张的协程服务器,基于eventlet(greenlet)的http性能测试

阅读更多

早上好友baojing.jiao发来消息跟我讨论eventlet。早就知道有这么个玩意,一直没空看。正好今天试试。发现其给出的聊天服务器的例子还算简单,就自己改改做出个http服务器的例子。一测性能才发现如此夸张。

 

先看程序:

 

#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# File: eventlet_httpd.py
# Date: 2009-08-07
# Author: gashero

"""
一个使用eventlet作为底层的http服务器,测试一下性能
"""

from eventlet import api

def httpd(writer,reader):
    req=''
    while True:
        chunk=reader.readline()
        if not chunk:
            break
        req+=chunk
        if chunk=='\r\n':
            break
    data='Hello world!\r\n'
    writer.write('HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s'%(len(data),data))
    writer.close()
    reader.close()
    return

def main():
    try:
        server=api.tcp_listener(('0.0.0.0',3000))
        print 'Server started!'
        while True:
            conn,addr=server.accept()
            #print 'client %s connected!'%repr(addr)
            writer=conn.makefile('w')
            api.spawn(httpd,writer,conn.makefile('r'))
    except KeyboardInterrupt:
        pass
    return

if __name__=='__main__':
    main()
 


简单的说就是识别http请求报文结束,然后发送响应报文而已。

 

100并发时的apache ab性能测试结果:

 

Concurrency Level:      100
Time taken for tests:   17.710 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      5300000 bytes
HTML transferred:       1400000 bytes
Requests per second:    5646.57 [#/sec] (mean)
Time per request:       17.710 [ms] (mean)
Time per request:       0.177 [ms] (mean, across all concurrent requests)
Transfer rate:          292.25 [Kbytes/sec] received

 

1000并发时的apache ab性能测试结果:

 

Concurrency Level:      1000
Time taken for tests:   16.422 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      5300000 bytes
HTML transferred:       1400000 bytes
Requests per second:    6089.30 [#/sec] (mean)
Time per request:       164.223 [ms] (mean)
Time per request:       0.164 [ms] (mean, across all concurrent requests)
Transfer rate:          315.17 [Kbytes/sec] received

 

如上测试环境是分别在1G局域网内两台机器之间的测试,可不是同一台机器内部的测试 。而且,1000并发居然比100并发速度还要快一些。

 

下面给出一些对比数据,测试环境不同,但是数据不会相差太大:

1、大部分python web framework,600req/s

2、web.py,800req/s

3、曾经在土豆网用twisted写的htmid框架,2300req/s

4、nginx+mod_wsgi,2900req/s

5、eventlet,约5800req/s

 

当然,如上的服务器功能确实少了点,但是提供了这样一种基础,方便以后扩展。记得N年前看过一篇论文说服务器的发展是多进程=>多线程=>异步=>协程。而现在主流的高性能服务器都是基于异步的(lighttpd、nginx),这次试了一下协程,效果果然不同凡响。

 

过段时间试试用eventlet提供服务器做个wsgi/http服务器来玩。

6
1
分享到:
评论
9 楼 xiaoyao3857 2013-01-10  
好吧,我这个外行,现在想就用这段代码来实验一下,但是完全不知道怎么用?运行这个脚本,然后这个怎么发并发?怎么样能从控件台看到上面的控制台的输出?
8 楼 fengmk2 2009-11-19  
diesel的性能测试也很不错.

http://dieselweb.org
diesel is a framework for writing network applications using asynchronous I/O.
7 楼 mryufeng 2009-08-10  
这coroutine是不错 但是和erlang的process 和 port相比只是toy级别的。 erlang的进程和port都有调度,能够保证IO的公平, 同样的测试,在erlang下包含完整的http报文分析,普通的台式机器单cpu可以跑你2.5倍的效能了。
6 楼 joshzhu 2009-08-10  
再补充一句,此类IO密集型应用场合,问题的关键不在于是否是coroutine,而在于底层是否有个高性能的实现。
5 楼 joshzhu 2009-08-10  
1、虽然nginx是full featured的,但是不用mod_wsgi模块,我预测它的结果会轻易超过你的这个结果,我自己测的结果都是超10000的。

2、和mryufeng交流过后得出:对这个benchmark来说,性能最高的将是Erlang。
4 楼 gashero 2009-08-10  
我也写过一个erlang的http服务器的小例子来玩,当时跑到12300req/s。不过环境已经很不同了。再者就是这个服务器只能使用1个CPU核,前面加上负载均衡以后性能可以叠加。

关于与全攻能的http server的性能对比,我认为没多大意义。我现在是需要一个使用http协议的应用服务器,又不作静态文件服务。所以不需要考虑文件缓存、文件句柄管理等很多事情。只要协议解析够快,撑的并发数够高就行了。
3 楼 joshzhu 2009-08-10  
mryufeng(http://mryufeng.iteye.com)对Erlang做过和你差不多的测试,结果是16000+,不过是单机。BTW,这个测试和full featured的HTTP server来比,确实有点不公平。
2 楼 est 2009-08-07  
完成了测验能留言啊  


内存web服务器没有多少测的必要吧。。。囧。。。
1 楼 linac 2009-08-07  
这里测的只是网络性能。连最基本的http协议分析都没有。

协程就是异步的封装吧?

相关推荐

    Python-diesel基于Greenlet的事件IOPython框架

    Python-diesel是一个基于Greenlet的事件I/O框架,专为高效、并发地处理网络编程任务而设计。在本文中,我们将深入探讨diesel的核心概念、Greenlet的工作原理以及如何利用这个框架来提升Python网络应用的性能。 首先...

    Python库 | eventlet-0.15.2-py2.py3-none-any.whl

    1. **Greenlet支持**:Eventlet使用greenlet库来实现协程,greenlet是一种轻量级的线程替代品,它们之间可以快速切换,无需操作系统级别的上下文切换开销。这使得Eventlet能处理大量并发连接,而不会像多线程那样...

    Eventlet学习总结.pdf

    Eventlet中的协程基于greenlet,这是一种轻量级的协程实现,它们在同一个原生线程中运行,通过复制和切换堆栈帧数据来实现多任务执行。与传统的多线程相比,greenlets之间的切换代价较小,因为它们不需要系统级别的...

    PyPI 官网下载 | greenlet-0.4.3.win-amd64-py2.7.exe

    标题中的"PyPI 官网下载 | greenlet-0.4.3.win-amd64-py2.7.exe"表明这是一个从Python Package Index(PyPI)官方源下载的软件包,具体是绿色线程库(greenlet)的0.4.3版本,适用于64位Windows操作系统和Python 2.7...

    Python库 | greenlet-0.4.12-cp27-cp27m-manylinux1_x86_64.whl

    `greenlet-0.4.12-cp27-cp27m-manylinux1_x86_64.whl`是一个Python的whl文件,这是一种预编译的Python轮子(wheel)包,可以直接通过`pip`工具进行安装,无需编译源代码。在命令行中,用户可以使用以下命令来安装: ...

    greenlet-0.4.10.zip

    Greenlet是python的一个C扩展,旨在提供可自行调度的‘微线程’, 即协程。generator实现的协程在yield value时只能将value返回给调用者(caller)。 而在greenlet中,target.switch(value)可以切换到指定的协程...

    C 协程库orchid.zip

    orchid是一个构建于强大的boost库基础上的C 库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型。 协程,顾名思义,协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程...

    Python库 | greenlet-0.3.3.win32-py2.4.exe

    在本文中,我们将深入探讨“greenlet-0.3.3.win32-py2.4.exe”这一特定的Python库,以及它在Python开发中的应用。 首先,让我们了解什么是greenlet。Greenlet是Python中一个轻量级的协程库,它基于C语言编写,用于...

    Python中协程用法代码详解

    本文将深入探讨Python协程的定义、与线程的区别、可能遇到的问题、优势以及如何通过`yield`和`greenlet`实现简单的协程案例。 首先,协程(Coroutine)是一种可暂停和恢复的函数,它自身保存了执行状态,允许在执行...

    greenlet-1.1.1-cp38-cp38-win32

    greenlet-1.1.1-cp38-cp38-win32

    Python库 | greenlet-1.0a1-cp36-cp36m-manylinux1_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:greenlet-1.0a1-cp36-cp36m-manylinux1_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    python-greenlet-0.4.2-4.el7.x86_64.rpm

    使用packstack安装redhat openstack10,报错:Error appeared during Puppet run: x.x.x.x_controller.pp ,经检查日志,原因是python-greenlet包未安装,且版本需要大于.0.3.1 安装此包,就ok啦。

    uwsgi-plugin-python3-greenlet-2.0.18-4.el8.aarch64.rpm

    离线安装包,亲测可用

    greenlet-0.4.15-cp38-cp38-win_amd64.whl

    python3.8版本的greenlet wheel文件,pip安装某个库失败的时候,如果提示greenlet安装失败,可以用这个wheel文件安装

    Eventlet学习总结汇编.pdf

    Eventlet的协程基于greenlet,这是一种微线程实现。greenlet可以在同一个原生线程上通过复制和切换堆栈帧来模拟多个独立执行的工作流。这种机制使得开发者可以使用同步(阻塞)的编程风格,但实际执行时却能实现非...

    七、协程 自己学习PPT

    `gevent`是另一个基于`greenlet`的库,它封装了epoll(用于Linux系统的IO复用技术)和greenlet,提供了自动的协程切换功能。当一个协程遇到IO操作时,`gevent`会自动切换到另一个协程,避免了阻塞。这种特性使得`...

    PyPI 官网下载 | greenlet-0.4.2.win-amd64-py2.7.exe

    **PyPI 官网下载 | greenlet-0.4.2.win-amd64-py2.7.exe** PyPI(Python Package Index)是Python开发者的重要资源库,它提供了大量预编译的Python软件包,使得用户能够方便地下载、安装和管理这些包。在给定的标题...

    greenlet-0.4.15-cp35-cp35m-win32

    greenlet-0.4.15-cp35-cp35m-win32

    Python库 | greenlet-0.4.16-cp37-cp37m-manylinux1_x86_64.whl

    资源分类:Python库 所属语言:Python 资源全名:greenlet-0.4.16-cp37-cp37m-manylinux1_x86_64.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    greenlet-1.1.1-cp39-cp39-win_amd64

    greenlet-1.1.1-cp39-cp39-win_amd64

Global site tag (gtag.js) - Google Analytics