Python web应用 - N个工作进程不等于QPS乘以N吗?

0 投票
1 回答
1195 浏览
提问于 2025-04-18 17:17

我有一个同步的单进程网页应用,每秒能处理2200个请求(QPS)。当我把它改成多进程时,QPS的提升并不明显:

  • 单进程:2200 QPS。用top命令查看CPU使用率是100%
  • 两个进程:2230 QPS。用top看,每个进程的CPU使用率是60%
  • 四个进程:2280 QPS。用top看,每个进程的CPU使用率是30%

我不太明白这些数字。为什么两个进程的QPS没有翻倍?四个进程的QPS也没有翻四倍?

实现细节

  • 这个网页应用只是响应一个GET请求。我使用了Falcon,代码是文档中这个例子的复制粘贴
  • 服务器是通过gunicorn运行的。以下是命令行:
    • 单进程:gunicorn things:app
    • 两个进程:gunicorn things:app -w 2
    • 四个进程:gunicorn things:app -w 4
  • 我使用locust进行负载测试并测量QPS。配置是:一个主节点和五个从节点。每个GET请求之间的等待时间是0毫秒。
  • 所有操作都在localhost上进行。测试机器有16个核心,所以每个网页应用的进程和每个负载测试的进程都使用自己的核心。

更多结果

根据dano的建议,我在GET处理器中插入了time.sleep。以下是得到的QPS:

QPS与进程数量和睡眠时间的关系

1 个回答

-1

看起来你现在的情况是,locust发送请求到你的服务器的速度已经快到极限了(或者说是gunicorn在把请求分配给工作进程时的能力达到了极限)。如果没有网络延迟,而且服务器几乎没有在处理任何工作(所以响应时间非常快),那么你可能能和locust发送请求的速度几乎持平。

gunicorn的文档强烈建议将它放在NGINX后面运行。你可以试试看这样做会对性能有什么影响。

撰写回答