【发布时间】:2015-05-19 05:36:24
【问题描述】:
这是非常具体的,但我会尽量简短:
我们正在 Heroku 上运行一个 Django 应用程序。三台服务器:
- 测试(1 个 web,1 个 celery dyno)
- 培训(1 个网,1 个芹菜测功机)
- 产品(2 个网,1 个芹菜测功机)。
我们使用 Gunicorn 和 gevents 和 每个 dyno 上的 4 名工人。
我们正在经历零星的高服务时间。下面是 Logentries 的一个例子:
High Response Time:
heroku router - - at=info
method=GET
path="/accounts/login/"
dyno=web.1
connect=1ms
service=6880ms
status=200
bytes=3562
我已经在谷歌上搜索了好几个星期了。我们无法随意复制,但每天会遇到 0 到 5 次这些警报。 值得注意的点:
- 在所有三个应用程序上发生(都运行类似的代码)
- 出现在不同的页面,包括404和/admin等简单页面
- 随机发生
- 以不同的吞吐量发生。我们的一个实例每天只驱动 3 个用户。它与睡眠测功机无关,因为我们使用 New Relic 进行 ping 操作,并且问题可能会在会话中发生
- 无法随意复制。我曾经亲身经历过这个问题。单击通常在 500 毫秒内执行的页面会导致 30 秒的延迟,并最终导致 Heroku 的 30 秒超时导致应用错误屏幕
- 高响应时间从 5000 毫秒到 30000 毫秒不等。
- New Relic 没有指出具体问题。以下是过去的几笔交易和时间:
- RegexURLResolver.resolve
4,270ms - SessionMiddleware.process_request
2,750ms - 渲染 login.html
1,230ms - WSGIHandler
1,390ms - 以上是简单的调用,通常不会花费这么多时间
- RegexURLResolver.resolve
我把范围缩小到了:
-
This article on Gunicorn and slow clients- 我看到这个问题发生在慢速客户端上,但也发生在我们有光纤连接的办公室。
-
Gevent 和 async worker 玩得不好- 我们已切换到 gunicorn 同步工作器,但问题仍然存在。
- Gunicorn 工作程序超时
- 工作人员可能以某种方式在 null 状态下保持活动状态。
-
工人/测功机不足- 没有任何迹象表明 CPU/内存/db 过度使用,New Relic 没有显示任何关于 DB 延迟的迹象
- 吵闹的邻居
- 在我与 Heroku 的多封电子邮件中,支持代表提到我的长请求中至少有一个是由于邻居吵闹,但不相信这是问题所在。
-
子域 301- 请求正常通过,但随机卡在应用程序中。
-
Dynos 重启- 如果是这种情况,很多用户都会受到影响。另外,我可以看到我们的测功机最近没有重新启动。
- Heroku 路由/服务问题
- Heroku 服务可能没有宣传的那么好,这只是使用他们的服务的一个缺点。
过去几个月我们一直遇到这个问题,但现在我们正在扩展它需要修复。 任何想法都将不胜感激,因为我已经用尽了几乎所有 SO 或 Google 链接。
【问题讨论】:
-
这似乎是个好问题,但可能会在serverfault得到更好的答复
-
@jedwards 谢谢,但那里的用户评论说我应该把它移到 SO :)
-
哦,伙计——我不认为两者都有它是不合理的。听起来这可能是一个编程或部署问题——每个站点都有一个专门研究。
标签: python django heroku gunicorn newrelic