Uvicorn 进程在 OOM 杀手之后变成僵尸

Uvicron process becom zombie after OOM killer

我有一个包裹在 docker 中的快速 api 服务, 我是运行它用下面的命令:

uvicorn --host 0.0.0.0 --workers 10 --backlog 20 --timeout-keep-alive 65 my_python_main:app

该服务大部分时间工作正常,但过了一段时间它会收到一个“繁重”的请求,这将导致机器内存上升,结果 OOM 杀手开始杀死许多进程(但是不是这项服务)。 python 进程保持活动状态但停止服务请求。

有没有办法告诉 uvircorn,如果它无法访问,它应该自行重启或杀死自己,以便 docker 重启会为他做?

有没有办法在 docker 的水平上做到这一点?意思是如果 docker 假设暴露端口 80 并且无法重新启动它?

你可以limit the memory一个容器被允许使用,docker本身。如果一个容器超过这个内存并抛出 OOM 错误,它就会被杀死。

docker run --memory=128m --restart on-failure myapp

您还可以启用 health checks,除了根据配置的运行状况命令让您知道容器是否健康之外,它本身不会做太多事情。根据此信息采取行动取决于运营商或运营框架。

docker run --health-cmd <some-cmd> myapp

为了用它做一些有用的事情,您需要 inspect 容器,或者如前所述,让您的操作框架决定要做什么。

也就是说,虽然这些选项有利于安全测量,但您不应依赖它们来进行常规工作流程。如果你知道你的容器一直崩溃,或者导致你的系统出现其他问题,你应该解决问题的根源,而不是简单地一遍又一遍地重新启动它。

对于您的情况,这可能需要首先使用配备齐全的机器。最后你想提供生产价值,如果你的设置不能处理业务需求,那么你应该改进你的设置并确保提供所需的资源。