我有一台位于nginx(反向代理)后面的cherrrypy应用程序服务器。 Cherrypy作为每个内核(我的服务器为4个内核)的守护进程运行,nginx(也配置有4个工作线程)对传入的请求执行负载平衡。
我正在使用hey对GET获取Web应用程序的首页进行基准测试。对于200个并发请求和总共1万个请求的值,我达到了约400-500 rps。我需要至少能够处理10倍的数据。当我看直方图时:
Response time histogram:
0.014 [1] |
0.721 [9193] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
1.429 [693] |■■■
2.137 [13] |
2.844 [0] |
3.552 [88] |
4.259 [0] |
4.967 [0] |
5.674 [0] |
6.382 [0] |
7.089 [12] |
考虑到主页URL处理程序中没有任何IO操作,只是生成一个静态模板并发送过来,这很奇怪,有些请求要花这么长时间(1.5-7秒)来处理。
在经历过一些过早优化的兔子洞之前,我怎么能知道瓶颈是什么?是樱桃吗? python本身?我的硬件?
答案 0 :(得分:0)
除了您提到的内容外,还考虑使用自动python garbage collector。
如果您每秒需要500 X 10请求,那么除非您增加线程池大小并可能添加更多CPU来运行更多CherryPy守护程序,否则CherryPy / Cheroot线程池(默认为10个线程)将很难。 >
如果您有4个守护程序和默认线程池,那么CherryPy实际上有4个10 = 40个线程可以同时工作(忽略OS调度程序和GIL)。
对于您描述基于异步/事件的服务器的负载类型似乎更合适。否则,您必须在nginx代理中提高 smart 的价值,尝试直接从nginx提供静态服务,并且仅请求到达CherryPy的一些请求。