Cloud-init 将 Gunicorn 流量限制为仅少数工作人员。为什么?
Cloud-init restricts Gunicorn traffic to only a few workers. Why?
我是 运行 Python Flask 应用程序,位于 Ubuntu VM 上的 Gunicorn 后面。 Ubuntu VM 托管在 Azure 中,我正在使用 cloud-init 脚本安装应用程序并在 VM 实例化时启动 Gunicorn。
Gunicorn 启动时有 8 个工作器(建议用于具有 4 个 vCPU 的 VM)。但是,在 VM 初始化之后,我的 VM 吞吐量立即被限制为每秒大约 100 个请求。
如果我杀死由 cloud-init 启动的 8 个 Gunicorn worker 并以超级用户身份手动启动 Gunicorn(同样是 8 个 worker),那么吞吐量会跃升至每秒约 900 个请求。
我无法分辨 cloud-init 启动的 Gunicorn 进程和超级用户启动的 Gunicorn 进程之间的任何区别,只是它们在负载下表现出不同的行为。
这是 top
虚拟机刚刚初始化且处于压力下时的屏幕截图:
这是我杀死 Gunicorn worker 并以超级用户身份重新启动它们后 top
的屏幕截图:
您可以看到,对于 cloud-init-spawned worker,似乎只有少数进程获得任何负载,而负载均匀分布在超级用户 worker 中。
下面我将比较 ps
对于 cloud-init 和超级用户工作者的输出。
云初始化:
超级用户:
ps
的输出显示 cloud-init worker 确实分布在所有 4 个 vCPU 上。我想知道为什么他们表现得好像只有少数人在获得流量。
下面是我的云内容-init.txt:
#cloud-config
package_upgrade: true
package_update: true
packages:
- python3-pip
runcmd:
- sudo -H pip3 install -U pipenv
- cd /home/azureuser
- git clone https://github.com/[user]/[repo].git
- cd /home/azureuser/serve-stateful
- pipenv install
- pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app
通过向我的 gunicorn 启动命令添加守护程序、用户和组标志解决了问题:
pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app --user root --group root --daemon
不能 100% 确定细节,但我认为问题在于 gunicorn workers 在未以守护进程模式启动时保留 stdio 继承:http://docs.gunicorn.org/en/stable/settings.html#enable-stdio-inheritance所有写入 stdio 的操作都可能会限制性能。
有趣(并且令人兴奋!)注意到现在每秒请求数已进一步上升到每秒 1368 次,因为即使是我在上面的问题中产生的超级用户工作者也在写出到 stdio。
我是 运行 Python Flask 应用程序,位于 Ubuntu VM 上的 Gunicorn 后面。 Ubuntu VM 托管在 Azure 中,我正在使用 cloud-init 脚本安装应用程序并在 VM 实例化时启动 Gunicorn。
Gunicorn 启动时有 8 个工作器(建议用于具有 4 个 vCPU 的 VM)。但是,在 VM 初始化之后,我的 VM 吞吐量立即被限制为每秒大约 100 个请求。
如果我杀死由 cloud-init 启动的 8 个 Gunicorn worker 并以超级用户身份手动启动 Gunicorn(同样是 8 个 worker),那么吞吐量会跃升至每秒约 900 个请求。
我无法分辨 cloud-init 启动的 Gunicorn 进程和超级用户启动的 Gunicorn 进程之间的任何区别,只是它们在负载下表现出不同的行为。
这是 top
虚拟机刚刚初始化且处于压力下时的屏幕截图:
这是我杀死 Gunicorn worker 并以超级用户身份重新启动它们后 top
的屏幕截图:
您可以看到,对于 cloud-init-spawned worker,似乎只有少数进程获得任何负载,而负载均匀分布在超级用户 worker 中。
下面我将比较 ps
对于 cloud-init 和超级用户工作者的输出。
云初始化:
超级用户:
ps
的输出显示 cloud-init worker 确实分布在所有 4 个 vCPU 上。我想知道为什么他们表现得好像只有少数人在获得流量。
下面是我的云内容-init.txt:
#cloud-config
package_upgrade: true
package_update: true
packages:
- python3-pip
runcmd:
- sudo -H pip3 install -U pipenv
- cd /home/azureuser
- git clone https://github.com/[user]/[repo].git
- cd /home/azureuser/serve-stateful
- pipenv install
- pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app
通过向我的 gunicorn 启动命令添加守护程序、用户和组标志解决了问题:
pipenv run gunicorn -w 8 --bind "$(hostname -I):8034" gunicorn_server:app --user root --group root --daemon
不能 100% 确定细节,但我认为问题在于 gunicorn workers 在未以守护进程模式启动时保留 stdio 继承:http://docs.gunicorn.org/en/stable/settings.html#enable-stdio-inheritance所有写入 stdio 的操作都可能会限制性能。
有趣(并且令人兴奋!)注意到现在每秒请求数已进一步上升到每秒 1368 次,因为即使是我在上面的问题中产生的超级用户工作者也在写出到 stdio。