我们的应用程序使用 FastAPI 版本
0.111.0
。 uvicorn
服务器启动如下图:
uvicorn.run(
"main:app",
host='0.0.0.0',
port=8080,
log_level="DEBUG",
workers=3
)
在我们的开发/测试环境中,这适用于 Windows 计算机。当我们将此代码部署到 Azure Kubernets 集群时,子进程在启动过程中会终止。
错误信息:
INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
INFO: Started parent process [1]
INFO: Waiting for child process [12]
INFO: Child process [12] died
INFO: Waiting for child process [13]
INFO: Child process [13] died
INFO: Waiting for child process [14]
INFO: Child process [14] died
INFO: Waiting for child process [13]
INFO: Child process [13] died
INFO: Waiting for child process [15]
如果我们删除
workers
调用的 uvicoen.run
参数,应用程序将在 AKS 中启动。我想了解,为什么子进程会因 workers
参数而终止。
看来,这是一个错误: https://github.com/encode/uvicorn/discussions/2372
将在 v0.30.2 修复: https://github.com/encode/uvicorn/pull/2380
这里也一样。 回滚到旧版本的 fastapi。
pip install fastapi[all]==0.110.3
编辑:不起作用。
编辑2:将工人从4人改为2人,工作了
编辑3:又发生了。 将工人从 2 人改为 1 人,工作了
我的 fastapi 应用程序的请求/限制 cpu 设置已过期,该应用程序在小型 AKS 节点上运行 5 个子线程。
我注意到,当 pod 的 cpu 限制值太低时,子进程在初始启动期间会崩溃。
在我们的例子中(非常简单的 API),我不得不将限制设置为 400mi(我的请求保持在 20mi)。 在 0.5 分钟左右的时间里,吊舱使用了 330 英里,一旦启动,它就会下降到 10 英里。
我看到的唯一一致的事情是第一个生成的子进程仍然崩溃。但那直接被另一个子进程替代了。
也许当您不指定任何限制并且 pod 部署在可用 cpu 不足的节点上时,它就无法正确启动。
我还想知道将代码预编译为 pyc 可能会减少对更高限制的需求。
提供您的 Dockerfile。