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 容器,或者如前所述,让您的操作框架决定要做什么。
也就是说,虽然这些选项有利于安全测量,但您不应依赖它们来进行常规工作流程。如果你知道你的容器一直崩溃,或者导致你的系统出现其他问题,你应该解决问题的根源,而不是简单地一遍又一遍地重新启动它。
对于您的情况,这可能需要首先使用配备齐全的机器。最后你想提供生产价值,如果你的设置不能处理业务需求,那么你应该改进你的设置并确保提供所需的资源。
我有一个包裹在 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 容器,或者如前所述,让您的操作框架决定要做什么。
也就是说,虽然这些选项有利于安全测量,但您不应依赖它们来进行常规工作流程。如果你知道你的容器一直崩溃,或者导致你的系统出现其他问题,你应该解决问题的根源,而不是简单地一遍又一遍地重新启动它。
对于您的情况,这可能需要首先使用配备齐全的机器。最后你想提供生产价值,如果你的设置不能处理业务需求,那么你应该改进你的设置并确保提供所需的资源。