web.py性能测试

一直从事后台系统的开发工作,对web、甚至前端技术一无所知;为了响应leader提出的多面手号召,决定一探前端技术。由于个人对python是情有独钟,毅然决定从python web开发下手。在众多的python web框架中,我看上了简单、轻量的web.py,没有特别喜欢的原因,就是简单,下手成本较低,哈哈。不过自己对轻量级的东西都比较乐意接受,比如nginx。本文不会介绍web.py的开发、不会介绍环境部署,这些东西官网都有相当详细的介绍,或者网上一堆一堆的文档。平时自己在调研新技术的顺序基本是:文档详细否、性能如何、稳定性能不能生产、功能是否满足需求等。所以本文只是记录自己对web.py框架和搭配nginx做的一个benchmark。


测试例子

#!/bin/env /usr/local/bin/python

import web 

web.config.debug = False

urls = ('/(.*)', 'hello')
app = web.application(urls, globals())

class hello:    
    def GET(self, name):
        if not name: 
            name = 'World'
            return 'Hello, ' + name + '! fuck the hello'

if __name__ == "__main__":
    app.run()

ps:貌似是从官网直接copy的demo,自己猥琐的修改了一下。


测试工具
apache自带的著名ab,虽然我认为它不怎么样,至少感觉没它名声那么好。测试参数如下:

ab -n 10000 -c 100 http://127.0.0.1:1988/  


web.py性能

直接利用web.py内置的web server来启动这个hello word服务,启动时将标准输出和标准错误重定向到/dev/null以此减少IO的消耗。benchmark如下图:



web.py程序默认启动虽然是多线程的(这个在/proc/pid里面是可以看到的),但由于python多线程实现上的锁问题,在并发上面一直没有显著的效果,所以这里的benchmark有点惨不忍睹,至少让研究高并发服务器的会很不满意。16核的cpu放在那里一动不动的,好可惜啊。


nginx + spawn-fcgi + flup + web.py性能

这里nginx没有做任何调优,基本属于默认配置,除了加入fastcgi相关指令外。web.py是利用spawn-fcgi启动了32个进程,其实和16个进程没有多大的区别。测试主机是8核、超线程到了16核;内存对本次测试不会构造影响。benchmark如下图:


ps:采用这个的一个架构,性能有了明显的提升了,qps是单web.py的8倍。性能的提升主要就是在python的多进程复用了多核cpu。16个核都跑到了70%-80%,基本属于跑满了;load也达到了50-60了。24G内存的测试主机,内存不是瓶颈。这个结果的优化空间应该也不会太大了,毕竟cpu几乎跑满了负载也上来了,cpu终究成为了瓶颈。


总结一点

高性能服务器的设计可以采用多线程或多进程,最大的复用cpu。cpu就放在那里,不用白不用。


错误小记

利用spawn-fcgi启动web.py的测试程序时,总是抛出如下错误, 最后发现居然是-f 选项指定的文件没有采用绝对路径,spawn-fcgi的用户体验太低了。

spawn-fcgi: child exited with: 127

你可能感兴趣的:(python)