![如何告诉 uWSGI 优先使用进程而不是线程来实现负载平衡](https://linux22.com/image/804608/%E5%A6%82%E4%BD%95%E5%91%8A%E8%AF%89%20uWSGI%20%E4%BC%98%E5%85%88%E4%BD%BF%E7%94%A8%E8%BF%9B%E7%A8%8B%E8%80%8C%E4%B8%8D%E6%98%AF%E7%BA%BF%E7%A8%8B%E6%9D%A5%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我在具有 3 个 CPU 核心的 VDS 上安装了 Nginx + uWSGI + Django。uWSGI 配置为 6 个进程,每个进程 5 个线程。现在我想要告诉 uWSGI 使用进程进行负载平衡,直到所有进程都繁忙,然后在需要时使用线程。uWSGI 似乎更喜欢线程,而且我还没有找到任何配置选项来改变这种行为。第一个进程占用了超过 100% 的 CPU 时间,第二个进程占用了大约 20%,其他进程基本没有使用。
我们的网站每秒接收 40 次请求。实际上,即使有 3 个无线程的进程通常也足以处理所有请求。但是请求处理有时会因各种原因(如锁定共享资源等)而挂起。在这种情况下,我们有 -1 个进程。用户不喜欢等待并一次又一次地单击链接。结果所有进程都挂起,所有用户都必须等待。
我会添加更多线程以使服务器更加强大。但问题可能是 python GIL。线程不会使用所有 CPU 核心。因此,多个进程对于负载平衡来说效果更好。但在锁定共享资源和 I/O 等待延迟的情况下,线程可能会有很大帮助。当其中一个线程被锁定时,进程可能会做很多工作。
我不想减少时间限制,除非没有其他解决方案。理论上可以使用线程解决这个问题,我不想向用户显示错误消息或让他等待每个请求,直到没有其他选择。