Python web应用 - N个工作进程不等于QPS乘以N吗?
我有一个同步的单进程网页应用,每秒能处理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:
1 个回答
-1
看起来你现在的情况是,locust
发送请求到你的服务器的速度已经快到极限了(或者说是gunicorn在把请求分配给工作进程时的能力达到了极限)。如果没有网络延迟,而且服务器几乎没有在处理任何工作(所以响应时间非常快),那么你可能能和locust
发送请求的速度几乎持平。
gunicorn的文档强烈建议将它放在NGINX后面运行。你可以试试看这样做会对性能有什么影响。