出于好奇,我将一个简单的 CherryPy 服务器与以下代码放在一起,该服务器休眠 5 秒(作为模拟处理延迟),然后返回一个简单的“hello”。
import cherrypy
import time
class server_runner(object):
@cherrypy.expose
def api(self, url):
time.sleep(5)
return "hello"
if __name__ == '__main__':
cherrypy.server.socket_host = '0.0.0.0'
cherrypy.quickstart(server_runner())
我运行了一个简单的负载测试(结果在这里 http://i.imgur.com/LUpEtFL.png),应用程序似乎在响应时间(蓝色)上保持一致,直到第 27 个活跃用户(绿线显示活跃用户数):响应时间迅速增加。如果在没有重大延迟的情况下无法处理 27 个用户,我对如何将 CherryPy 标记为“生产就绪”服务器感到有点困惑。我的执行或理解有问题吗?这是在 C3 大型 Ec2 实例上运行。
最佳答案
在简单的情况下,您只需管理 server.thread_pool
问题评论中提到的配置参数。
在实际情况中,它取决于许多因素。但我可以肯定地说,CherryPy 是一个线程服务器,由于 Python,一次只有一个线程运行 GIL .对于受 IO 限制的工作负载来说,这可能不是什么大问题,尽管您无论如何都可以利用运行同一应用程序的许多 CherryPy 进程的 CPU 核心。它可能会决定一些设计决策,例如避免进程内缓存和通常遵循无共享架构,以便您的进程可以互换使用。
拥有许多应用程序实例会使维护变得更加复杂,因此您应该权衡利弊。好的,下面是一个例子,可以给你一些线索。
mp.py -- CherryPy 应用
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cherrypy
class App:
@cherrypy.expose
def index(self):
'''Make some traffic'''
return ('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean quis laoreet urna. '
'Integer vitae volutpat neque, et tempor quam. Sed eu massa non libero pretium tempus. '
'Quisque volutpat aliquam lacinia. Class aptent taciti sociosqu ad litora torquent per '
'conubia nostra, per inceptos himenaeos. Quisque scelerisque pellentesque purus id '
'vulputate. Suspendisse potenti. Vestibulum rutrum vehicula magna et varius. Sed in leo'
' sit amet massa fringilla aliquet in vitae enim. Donec justo dolor, vestibulum vitae '
'rhoncus vel, dictum eu neque. Fusce ac ultrices nibh. Mauris accumsan augue vitae justo '
'tempor, non ullamcorper tortor semper. ')
cherrypy.tree.mount(App(), '/')
srv8080.ini -- 第一个实例配置
[global]
server.socket_host = '127.0.0.1'
server.socket_port = 8080
server.thread_pool = 32
srv8081.ini -- 第二个实例配置
[global]
server.socket_host = '127.0.0.1'
server.socket_port = 8081
server.thread_pool = 32
proxy.conf -- nginx 配置
upstream app {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
将mp.py
和*.ini
放在一个目录下。添加*.conf
到nginx的sites-enabled
,重新加载。在两个终端中使用 mp.py
打开目录。然后首先运行 cherryd -e production -i mp -c ./srv8080.ini
,然后运行 cherryd -e production -i mp -c ./srv8081.ini
。
现在你可以玩了。我在我的开发机器(Linux Mint 15、Core i5 x2 + HT)上运行以下命令。
ab -c 1 -n 12800 -k http://127.0.0.1:8080/ # ~1600 rps
ab -c 16 -n 12800 http://127.0.0.1:8080/ # ~400 rps
ab -c 32 -n 12800 http://127.0.0.1/ # ~1500 rps
关于Python Web 服务器 (CherryPy) 在 AWS 上扩展并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24688032/