测试例子
#!/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