【问题标题】:CherryPy and concurrencyCherryPy 和并发
【发布时间】:2023-03-09 11:18:01
【问题描述】:

我正在使用 CherryPy 来通过 WSGI 为 python 应用程序提供服务。

我尝试对其进行基准测试,但 CherryPy 似乎只能处理 10 个请求/秒。 不管我做什么。

构建一个简单的应用程序,暂停 3 秒,以便准确确定发生了什么......并且我可以确认 10 req/sec 与 python 脚本使用的资源无关。

__

有什么想法吗?

【问题讨论】:

  • 嘿,只是一个友好的提示 - 如果 diatoid 的答案是正确的,您是否要将其标记为已接受? :)

标签: python concurrency wsgi cherrypy


【解决方案1】:

这对我来说也非常令人困惑。文档说 CherryPy 将根据观察到的负载自动扩展其线程池。但我的经验是不会。如果您的任务可能需要一段时间,同时也可能几乎不使用任何 CPU,那么您需要根据您的预期负载和目标响应时间来估计 thread_pool 大小。

例如,如果处理平均请求需要 1.5 秒,而您希望每秒处理 50 个请求,那么您的 thread_pool 中将需要 75 个线程来处理您的期望。

就我而言,我通过multiprocessing 模块将繁重的工作委派给其他进程。这使 CherryPy 主进程和线程处于空闲状态。但是,CherryPy 线程仍将被阻塞,等待来自委派的multiprocessing 进程的输出。出于这个原因,服务器需要thread_pool 中有足够的线程来为新请求提供可用的线程。

我最初的想法是thread_pool 不需要大于multiprocessing 池工作者大小。但事实证明,这也是一个被误导的假设。不知何故,即使multiprocessing 池中有可用容量,CherryPy 线程仍将保持阻塞状态。

另一个被误导的假设是阻塞和性能不佳与 Python GIL 有关。它不是。在我的情况下,我已经通过multiprocessing 完成了这项工作,并且仍然需要一个thread_pool 大小的平均时间和期望的每秒请求数目标。提高 thread_pool 大小解决了这个问题。虽然它看起来像并且不正确的修复。

对我来说很简单:

cherrypy.config.update({
    'server.thread_pool': 100
})

【讨论】:

    【解决方案2】:

    您的客户端需要实际读取服务器的响应。否则套接字/线程将保持打开/运行,直到超时和垃圾收集。

    使用行为正确的客户端,您会发现您的服务器也能正常运行。

    【讨论】:

    • 假设客户表现良好会让您面临“慢懒猴”攻击。
    【解决方案3】:

    默认情况下,CherryPy 的内置 HTTP 服务器将使用一个有 10 个线程的线程池。如果您仍在使用默认值,您可以尝试在配置文件中增加它。

    [global]
    server.thread_pool = 30
    

    【讨论】:

    • @diatoid:非常感谢!顺便说一句,我认为cherrypy是为了支持尽可能多的请求/秒而构建的。
    • CherryPy 尝试设置合理的默认值,这会在我的笔记本电脑上产生大约 1200 个请求/秒的最大值。但是,这些基准请求每个都不需要 3 秒。您网站的实际情况应该在中间的某个地方;如果您的实际请求每次需要 3 秒,那么您可能做错了什么;)
    • 请求需要 3 秒,因为它们正在等待从其他地方收集信息。在等待期间,我没有使用任何资源!那么为什么我必须让我的机器闲置而我可以同时处理更多的请求呢?
    • 你正在使用资源;对于任何 web 应用程序,您都保持套接字打开,它使用文件描述符和临时端口。在 CherryPy 中,每个子连接在其生命周期内都绑定到一个线程,因此您还使用了一个工作线程(以及它的 1MB 堆栈大小和处理每个请求所需的任何堆对象)。所以你有一个选择:1)增加线程数,2)重新设计你的应用程序以返回 202 Accepted 并轮询答案(这也会释放套接字),或者 3)使用异步网络服务器(然后解决延迟问题而不是吞吐量问题)。
    • CherryPy 会根据需要增加工作线程的数量。 thread_pool = 10initial 线程数。
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多