raa*_*cer 13 python multithreading load-balancing process uwsgi
我在具有3个CPU内核的VDS上安装了Nginx + uWSGI + Django.uWSGI配置为每个进程6个进程和5个线程.现在我想告诉uWSGI使用进程进行负载平衡,直到所有进程都忙,然后根据需要使用线程.似乎uWSGI更喜欢线程,我没有找到任何配置选项来改变这种行为.第一个进程占用100%的CPU时间,第二个进程占用大约20%,另一个进程大部分未使用.
我们的网站收到40 r/s.实际上即使没有线程的3个进程也足以处理所有请求.但是由于锁定共享资源等各种原因,请求处理会不时挂起.在这种情况下,我们有-1进程.用户不喜欢等待并反复单击该链接.因此,所有进程都会挂起,所有用户都必须等待.
我会添加更多的线程来使服务器更健壮.但问题可能是python GIL.线程不会使用所有CPU核心.因此,多个进程可以更好地实现负载平衡.但是在锁定共享资源和i/o等待延迟的情况下,线程可能会有很大帮助.当其中一个线程被锁定时,一个进程可能会做很多工作.
在没有其他解决方案之前,我不想减少时间限制.理论上可以用线程来解决这个问题,我不希望向用户显示错误消息或让他等待每个请求,直到没有其他选择.
raa*_*cer 10
所以,解决方案是:
现在我每个进程运行50个线程,所有请求都在进程之间平均分配.
每个进程实际上都是一个线程,因为线程是同一进程的执行上下文.
出于这样的原因,没有什么比"一个进程执行它而不是一个线程".即使没有线程,您的进程也有1个执行上下文(一个线程).我将调查的是,为什么在每个进程使用多个线程时,你会感觉到(感知)性能不佳.您确定使用的是稳定的(具有可靠的线程支持)uWSGI版本吗?(1.4.x或1.9.x)
您是否考虑过在服务器过载时动态生成更多进程?检查uWSGI更便宜的模式,有各种算法可用.也许一个适合你的情况.
GIL对你来说不是问题,因为你所描述的问题是缺少用于管理新请求的线程(即使从你的数字看起来你可能对其他东西有太多沉重的锁争用)