Gunicorn worker 以信号 9 终止

Gunicorn worker terminated with signal 9

我是 运行 一个 Flask 应用程序,并通过 Docker 容器将其托管在 Kubernetes 上。 Gunicorn 正在管理回复 API 请求的工作人员。

以下警告消息是经常出现的,似乎请求由于某种原因被取消了。在 Kubernetes 上,pod 没有表现出任何奇怪的行为或重新启动并保持在其内存的 80% 和 CPU 限制内。

[2021-03-31 16:30:31 +0200] [1] [WARNING] Worker with pid 26 was terminated due to signal 9

我们怎样才能找出这些工人被杀的原因?

我遇到了同样的警告信息。

[WARNING] Worker with pid 71 was terminated due to signal 9

我遇到了这个 faq,它说“SIGKILL 的一个常见原因是 OOM 终止程序由于内存不足而终止进程。”

我用了dmesg发现确实是kill掉了,因为运行内存不足

Out of memory: Killed process 776660 (gunicorn)

在我的例子中,问题是由于 ml 模型预热(超过 3 秒)导致应用程序启动时间过长

我在限制docker的内存时遇到了同样的警告信息,像-m 3000m一样使用。

docker-memory

gunicorn-Why 工人是否被无声杀害?

避免这种情况的简单方法是为 docker 设置高内存或不设置。

在我们的案例中,应用程序大约需要 5-7 分钟才能将 ML 模型和字典加载到内存中。所以添加600秒的超时时间解决了我们的问题。

gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8443 --timeout 600

我在使用 AWS Beanstalk 部署我的 Flask 应用程序时遇到了类似的错误。

  • 在我看到的日志中:
  • 网络:内存错误
  • [严重] 工人超时
  • [警告] pid 为 XXXXX 的工作人员因信号 9
  • 而被终止

我正在使用 t2.micro 实例,当我将其更改为 t2.medium 时,我的应用程序运行良好。除此之外,我还更改了我的 nginx 配置文件中的超时时间。