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