cpu load和django应用程序,它对外部API发出长响应时间请求

时间:2012-01-19 21:15:34

标签: django web-applications wsgi tornado

我正在使用python开发一个Web应用程序,每个用户请求都会对外部服务进行API调用,并且需要 20秒来接收响应。结果,在发生多个并发请求的情况下,CPU负载在几个空闲进程中变得疯狂(> 95%)。

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

Web应用程序是用python开发的,它通过Apache与mod_wsgi

一起提供
  

我的问题如下。像Tornado这样的非阻塞Web服务器是否会改善CPU负载,从而处理更多的并发用户(我也感兴趣为什么)?你能建议任何其他可扩展的解决方案吗?

3 个答案:

答案 0 :(得分:1)

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

但是,这真的不应该是你的CPU输出。 Web服务器有一个向上限制的“工人”,这些工作人员会被催生,当他们全部被绑起来时,他们都被束缚了。它不会超出限制,所以除非你设置或默认设置高于你能够运行的盒子,否则它不应该把你的CPU推高。

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

答案 1 :(得分:1)

您应该考虑使用消息队列卸载任务,以便不阻止您的用户请求。

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

答案 2 :(得分:1)

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

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

解释了这种确切的问题。

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