簡體   English   中英

Python Web服務器(CherryPy)在AWS上擴展並發請求

[英]Python web server (CherryPy) scaling concurrent requests on AWS

出於好奇,我將一個簡單的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 config

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.inicherryd -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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM