热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonwebserver服务器性能对比

因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-wsgi,效果还不错。但还是想试试别的,比如传说中超级猛的meinheld什么的。软硬件环境硬件:一台04年初购置的IBMX235服务器,CPU为Xeon2.4G两颗,内存1G,100M网卡。软件:Ubuntu

因为换了nginx就不再使用mod_wsgi来跑web.py应用了,现在用的是gevent-wsgi,效果还不错。但还是想试试别的,比如传说中超级猛的meinheld什么的。

软硬件环境

硬件:

一台04年初购置的IBM X235服务器,CPU为Xeon 2.4G两颗,内存1G,100M网卡。

软件:

Ubuntu Server 10.04 LTS
Apache 2.2.14
Nginx 0.7.65
Python 2.6.5
web.py 0.37
mako 0.7.2
sqlalchemy 0.7.8
gevent 0.13.7
gunicorn 0.14.6
meinheld 0.4.15

测试代码

有五个版本,分别是:

最基本的WSGI helloworld

def application(environ, start_response):
    status = '200 OK'
    resp = "Hello world!"
    resp_headers = [('Content-type','text/plain;charset=utf-8')]
    start_response(status, resp_headers)
    return [resp]

最基本的web.py your IP

class yourip:
    def GET(self):
        return "Your IP is : %s" % web.ctx.ip

加了mako模板的web.py

class onlymako(BaseHandler):
    @expose("yourip")
    def GET(self):
        return dict(yourip=web.ctx.ip)

加了数据库的web.py

class onlydb:
    def GET(self):
        created = web.ctx.provider.once_access(web.ctx.ip)
        return "You have logged : %s" % created

和同时加了数据库和mako模板的web.py —— 这也是最接近实际应用的情况

class makodb(BaseHandler):
    @expose("index")
    def GET(self):
        created = web.ctx.provider.once_access(web.ctx.ip)
        return dict(created=created)
测试目标

五种运行环境:

web.py的测试环境app.run
web.py+gevent-WSGI
gunicorn默认(sync)
gunicorn+gevent
gunicorn+meinheld

gunicorn使用 -w 4 参数,经实际比较过,这个参数并不能有效增加rps,但在高并发测试情况下可以在一定程度上减少失败率。

测试方式

ApacheBench 2.3(Ubuntu Desktop 12.04)

RPS测试参数为 -n 200 -c 22 测五次取rps平均值。

之所以用这样比较小的参数,是因为再高了,其中某些测试就通不过了。

测试结果
RPS测试 WSGI helloworld Web.py YourIP Web.py+Mako Web.py
+SQLAlchemy
(SQLite)
Web.py+Mako
+SQLAlchemy
(SQLite)

Web.py
+SQLAlchemy
(Postgresql)

Web.py+Mako
+SQLAlchemy
(Postgresql)
Web.py app.run 130 93 75* 45* 59 40
web.py+gevent 422 130 82 54 74 53
gunicorn default 854 439 136 93 66 90 62
gunicorn+gevent 695 291 115 74 56 78 56
gunicorn+meinheld 3565 682 160 84 65 98 64

其中加了“*”的数字发生了数据库错误,仅供参考。

另外,用同样的参数测了一下Apache2处理静态文件的rps为:1780,nginx为:2951。

===附加的分割线===

再附加一个在我的Atom小服务器上的部分测试结果:

Nginx处理静态文件的rps为:4000左右。

WSGI hello world测试:gunicorn+meinheld约为:3800。gunicorn+gevent约为:1100。gunicorn default约为:1400。

your IP测试:gunicorn+meinheld约为:1000。gunicorn+gevent约为:450。gunicorn default约为:700。

相比之下这个Atom小机器比IBM服务器猛好多。硬件发展速度真是太快了。

附软硬件环境:

Atom D525 1.6G双核,2GRAM,FreeBSD 9,Nginx 1.2.2,Python 2.7.3,其它同IBM服务器。

并且在这个Atom机器上 -w 参数对rps有明显贡献…看来是因为老服务器的问题才效果不明显,只是不确定是硬件问题还是OS问题。

结论

meinheld的确猛,处理最简单的WSGI比Apache2处理静态文件还要猛一倍,跟Nginx相当甚至更强。

app.run的rps比预想的要好很多,只是并发数真不行,-c 参数略加大就会出现大量失败测试。

gevent已经足够好了,不过居然比gunicorn的sync模式还慢真是有点不科学啊。

gunicorn的好处在于管理方便,并且可以灵活使用各种work_class,特别奇怪的一点是居然sync模式也这么快。

web.py的性能影响还是很明显的。

模板的影响也很明显——mako已经算是很快的模板了,真不知道用那些KID之类很慢的模板会是什么效果。

数据库的影响更大,不过pgsql的性能居然能跟sqlite差不多,真不知道是sqlite太慢还是pgsql太快…

本来前一阵我刚听说OpenResty这货的时候还是很有兴趣的,但是现在看到meinheld的表现以后,觉得还是算了吧,毕竟用OpenResty还要去学Lua…现在要学的东西太多,能用Python搞定的事情就不去麻烦Lua了。


推荐阅读
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
author-avatar
雪中侠客79_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有