【问题标题】:cpu load and django application that makes long-response-time requests to external APIcpu 负载和 django 应用程序,它向外部 API 发出长响应时间请求
【发布时间】:2012-01-19 21:15:34
【问题描述】:

我正在用 python 开发一个 Web 应用程序,每个用户请求都会对外部服务进行 API 调用,并且大约需要 20 秒 来接收响应。因此,如果有多个并发请求,CPU 负载会因多个空闲进程而变得疯狂 (>95%)。

服务器由 1.6 GHz 双核 Atom 330 和 2GB RAM 组成。

网络应用程序是用 python 开发的,它通过 Apache 和 mod_wsgi 提供服务

我的问题如下。 Tornado 等非阻塞网络服务器会提高 CPU 负载,从而处理更多并发用户(我也很感兴趣为什么)?您能推荐任何其他可扩展的解决方案吗?

【问题讨论】:

    标签: django web-applications wsgi tornado


    【解决方案1】:

    这真的与阻塞无关;确实如此,但事实并非如此。 20 秒的请求阻塞了一个线程,因此另一个线程已用于下一个请求。而对于快速请求,线程基本上是循环的。

    但是,这确实不应该使您的 CPU 输出达到峰值。网络服务器产生的“工人”有上限,当它们都被捆绑时,它们都被捆绑了。它不会超出限制,因此除非您已设置或默认设置高于您能够运行的框,否则它不应将您的 CPU 推高。

    无论如何,所有这些都只是提供信息,并不能真正解决您的问题。但是,对于这么长时间运行的请求,您应该尽快从您的网络服务器上卸载它。 Web 服务器应该只将请求交给另一个可以异步处理它的进程,然后在响应准备好时使用轮询通知客户端。 Node.js 在类似的场景中被大量使用,但我真的没有足够的经验来给你任何真正的指导。

    【讨论】:

    • 龙卷风不就是这样吗?我认为它使用 epoll,例如 node.js。
    【解决方案2】:

    您应该考虑使用消息队列来卸载任务,这样您的用户请求就不会被阻止。

    您可以查看 python libs kombu 和 celery 来处理消息和任务。

    【讨论】:

      【解决方案3】:

      您很可能将 prefork MPM 与 Apache 和 mod_wsgi 嵌入模式一起使用。默认情况下这是一个糟糕的组合,因为 Apache 是为 PHP 而不是为胖 Python Web 应用程序设置的。阅读:

      http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

      这解释了这种确切的问题。

      至少使用 mod_wsgi 守护程序模式,并且最好也更改为 Apache 的工作 MPM。

      【讨论】:

        猜你喜欢
        • 2016-03-08
        • 2022-10-06
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 2021-07-03
        • 2021-12-24
        • 2016-05-01
        相关资源
        最近更新 更多