如何告诉uWSGI在负载平衡方面更喜欢进程而不是线程

2024-04-25 21:53:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

在没有其他解决办法之前,我不想减少时间限制。从理论上讲,用线程解决这个问题是可能的,我不想向用户显示错误消息,也不想让他在没有其他选择之前等待每个请求。


Tags: django用户进程站点链接选项时间情况
2条回答

所以,解决办法是:

  1. 升级uWSGI至最新稳定版本(如roberto所建议)。
  2. 使用--thunder锁选项。

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

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

正因为如此,没有什么比“进程执行它而不是线程”更合适的了。即使没有线程,进程也有1个执行上下文(线程)。我要调查的是,当每个进程使用多个线程时,为什么会(感觉)性能差。你确定你在使用一个稳定的uWSGI版本吗?(1.4.x或1.9.x)

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

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

相关问题 更多 >