14

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

我们的站点接收 40 r/s。实际上,即使有 3 个没有线程的进程通常也足以处理所有请求。但是请求处理有时会由于各种原因(例如锁定共享资源等)挂起。在这种情况下,我们有 -1 进程。用户不喜欢等待并一次又一次地点击链接。结果,所有进程都挂起,所有用户都必须等待。

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

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

4

2 回答 2

11

所以,解决方案是:

  1. 将 uWSGI 升级到最新的稳定版本(如 roberto 建议的那样)。
  2. 使用 --thunder-lock 选项。

现在我每个进程运行 50 个线程,所有请求在进程之间平均分配。

于 2013-10-11T20:05:35.613 回答
9

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

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

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

GIL 对您来说不是问题,因为根据您的描述,问题是缺少用于管理新请求的线程(即使从您的数字来看,您可能对其他东西有过多的锁争用)

于 2013-10-08T03:36:18.943 回答