【问题标题】:Gunicorn not responding独角兽没反应
【发布时间】:2015-05-09 08:20:43
【问题描述】:

我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将超时时间从 30 秒更改为 900000 秒,我必须这样做,因为我有一个用例需要上传和处理一个巨大的文件(在某些情况下进程需要超过 30m)但是在这个更改之后 Gunicorn 在几个小时后没有响应,我想问题是所有工人(30 岁)都会在这段时间之后忙于一些请求,奇怪的是它甚至发生了如果我根本不运行那么长的请求,并且在 django admin 中进行正常探索时会发生这种情况。我想知道是否有办法监控 gunicorn 上的请求并查看工作人员忙于哪些请求,我想找出让他们忙碌的请求。我试过--log-file=- --log-level=debug,但它没有说明任何有关请求的信息,我需要更详细的日志。

【问题讨论】:

  • 我的直觉是您的某些请求处理代码中可能存在死锁。超时 30 秒后,受影响的工作人员最终将被释放。有 0.9 兆秒的超时,他们实际上不会。
  • 我明白了,这就是为什么我需要日志来了解发生了什么。

标签: django gunicorn


【解决方案1】:

从最新的 Gunicorn 文档中,您可以在 cmd 行/脚本上使用:

--log-file - ("-" means log to stderr)
--log-level debug

或者你可以在配置文件中使用:

errorlog = '-'
accesslog = '-'
loglevel = 'debug'

但没有提及您在问题中指定的参数格式:

--log-file=- 
--log-level=debug

访问的默认记录是“无”(ref),所以在黑暗中拍摄,但这可以解释为什么没有收到详细的日志信息。这是来自 Gunicorn 源的 sample config file,以及最新的 Gunicorn config docs

另外,您可能想查看 Django 中的changing your logging configuration

【讨论】:

  • --log-file=- 相当于--log-file -,它显示了很多日志,但不是我想要的详细日志。我需要知道在服务器上处理每个请求需要多少时间。
【解决方案2】:

虽然我也在寻找有关如何查看有多少工人忙碌的好答案,但您以错误的方式解决了这个问题。对于需要这么长时间的任务,您需要像 Celery/RabbitMQ 这样的工作人员来异步完成繁重的工作,同时保持请求/响应周期很快。

我的网站上有一个脚本,可能需要 5 分钟以上才能完成,这是我正在使用的一个很好的模式:

  1. 当请求首次进入时,生成任务并简单地返回 HTTP 202 Accepted。其目的是“请求已被接受处理,但处理尚未完成。”
  2. 让前端轮询同一个端点(每 30 秒就足够了)。只要任务没有完成,就返回一个202
  3. 最终当它完成时返回 200,以及前端可能需要的任何数据。

对于我的网站,我们想要更新超过 10 分钟的数据。我传递了 Accept-Datetime 标头以指示可以接受的数据的历史时间。如果我们的本地缓存副本比这更旧,我们会生成任务循环。

【讨论】:

  • 不,这并不总是好的解决方案,“通常”它是正确的,但并非总是如此。有时逻辑是让用户等到响应准备好(无论如何)并向他显示响应。就我而言,我需要这样做,这就是我在这里问它的原因(无论如何,我不是拒绝你答案的人)
  • 好的,当然。我提出的只是通常的答案。但是你如何“让用户等待”呢?如果他们点击刷新会发生什么?工作是继续还是他们必须重新开始。如果继续,他们如何获得状态更新?
  • 我刚刚在 Datadog 上设置了一个帐户。他们与 gunicorn 集成,可以让您查看有多少工作人员是忙碌的还是空闲的。
  • 使用此服务的用户经过培训并且知道他们不应该刷新/关闭选项卡,即使他们不小心这样做也不会发生任何坏事(如果他们重新运行任务)。这是一项本地服务,训练有素的用户很少。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 2012-01-05
  • 2017-10-06
  • 2012-01-08
  • 2014-08-19
  • 2013-01-10
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多