如何告诉uWSGI更喜欢进程到线程以实现负载平衡

时间:2013-10-07 19:37:25

标签: python multithreading process load-balancing uwsgi

我在具有3个CPU内核的VDS上安装了Nginx + uWSGI + Django。 uWSGI配置为每个进程6个进程和5个线程。现在我想告诉uWSGI使用进程进行负载平衡,直到所有进程都忙,然后根据需要使用线程。似乎uWSGI更喜欢线程,我没有找到任何配置选项来改变它行为。第一个进程占用100%的CPU时间,第二个进程占用大约20%,而另一个进程大多没有使用。

我们的网站收到40转/秒。实际上即使没有线程的3个进程也足以处理所有请求。但是由于锁定共享资源等各种原因,请求处理会不时挂起。在这种情况下,我们有-1进程。用户不喜欢等待并反复单击该链接。因此,所有进程都会挂起,所有用户都必须等待。

我会添加更多线程以使服务器更强大。但问题可能是python GIL。线程不会使用所有CPU核心。因此,多个进程可以更好地实现负载平衡。但是在锁定共享资源和i / o等待延迟的情况下,线程可能会有很大帮助。当其中一个线程被锁定时,一个进程可能会做很多工作。

在没有其他解决方案之前,我不想减少时间限制。在理论上可以用线程来解决这个问题,我不想向用户显示错误消息或让他等待每个请求,直到没有其他选择。

2 个答案:

答案 0 :(得分:10)

所以,解决方案是:

  1. 将uWSGI升级到最近的稳定版本(正如roberto建议的那样)。
  2. 使用--thunder-lock选项。
  3. 现在我每个进程运行50个线程,所有请求都在进程之间平均分配。

答案 1 :(得分:8)

每个进程实际上都是一个线程,因为线程是同一进程的执行上下文。

由于这个原因,没有什么比“一个进程执行它而不是一个线程”。即使没有线程,您的进程也有1个执行上下文(一个线程)。我将调查的是,为什么在每个进程使用多个线程时,你会感觉到(感知)性能不佳。您确定使用的是稳定的(具有可靠的线程支持)uWSGI版本吗? (1.4.x或1.9.x)

您是否考虑过在服务器过载时动态生成更多进程?检查uWSGI更便宜的模式,有各种算法可用。也许一个人适合你的情况。

GIL对您来说不是问题,因为您所描述的问题是缺少管理新请求的线程(即使从您的数字看起来您可能对其他内容有太多沉重的锁争用)< / p>