【问题标题】:Python web server (CherryPy) scaling concurrent requests on AWSPython Web 服务器 (CherryPy) 在 AWS 上扩展并发请求
【发布时间】:2014-09-01 12:09:31
【问题描述】:

出于好奇,我将一个简单的 CherryPy 服务器与以下代码组合在一起,该服务器休眠 5 秒(作为模拟处理延迟),然后返回一个简单的“你好”。

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 的配置是什么?
  • 感谢 behzad 的快速回复 - 在撰写问题时,默认值为:10。我读了一点,改为 100,这似乎有帮助:i.imgur.com/H8igGhu.png .你知道 thread_pool 配置有什么样的限制/收益递减吗?
  • 我认为this答案下的最后一条评论很好地解释了它。

标签: python web-services amazon-ec2 cherrypy


【解决方案1】:

在简单的情况下,您只需管理问题 cmets 中提到的 server.thread_pool 配置参数。

在实际情况下,这取决于许多因素。但我可以肯定地说,CherryPy 是一个线程服务器,由于 Python GIL,一次只能运行一个线程。对于受 IO 限制的工作负载来说,这可能不是什么大问题,尽管您无论如何都可以利用 CPU 内核来运行同一应用程序的许多 CherryPy 进程。它可能会决定一些设计决策,例如避免进程内缓存,并且通常遵循无共享架构,因此您的进程可以互换使用。

拥有许多应用程序实例会使维护更加复杂,因此您应该考虑利弊。好的,下面的例子可以给你一些线索。

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  

【讨论】:

  • 谢谢!这真的很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2013-10-02
  • 2019-12-07
  • 2015-07-28
相关资源
最近更新 更多