Heroku零星的高响应时间

gro*_*pot 19 python django heroku gunicorn newrelic

这是非常具体的,但我会尽量简短:

我们正在Heroku上运行Django应用程序.三台服务器:

  1. 测试(1网,1芹菜dyno)
  2. 培训(1网,1芹菜dyno)
  3. prod(2网,1芹菜dyno).

我们使用Gunicorngevents每个赛道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
Run Code Online (Sandbox Code Playgroud)

我已经谷歌搜索了好几个星期了.我们无法随意复制,但每天会经历0至5次这些警报.值得注意的要点:

  • 在所有三个应用程序上发生(所有运行类似的代码)
  • 发生在不同的页面上,包括404和/ admin等简单页面
  • 随机发生
  • 发生变化的吞吐量.我们的一个实例仅驱动3个用户/天.它与睡觉的dynos无关,因为我们使用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
    • 以上是简单的通话,通常不会接近这段时间

我把它缩小到了:

  1. 这篇关于Gunicorn和慢客户的文章
    • 我已经看到这个问题发生在缓慢的客户端,但也发生在我们有光纤连接的办公室.
  2. Gevent和异步工作者玩得不好
    • 我们已经切换到gunicorn同步工作者,问题仍然存在.
  3. Gunicorn工人超时
    • 工人可能会以某种方式保持活动状态.
  4. 工人/动力不足
    • 没有指示CPU /内存/ db过度使用和New Relic没有显示DB延迟的任何指示
  5. 吵闹的邻居
    • 在我与Heroku的多封电子邮件中,支持代表提到我的至少一个长期请求是由于一个吵闹的邻居,但不相信这是问题.
  6. 子域301
    • 请求很顺利,但在应用程序中随机被卡住.
  7. Dynos重启
    • 如果是这种情况,许多用户将受到影响.另外,我可以看到我们的dynos最近没有重启.
  8. Heroku路由/服务问题
    • Heroku服务可能比宣传的要少,这只是使用他们服务的缺点.

过去几个月我们一直有这个问题,但现在我们正在扩展它需要修复.任何想法都会受到高度赞赏,因为我已经用尽了所有SO或Google链接.

gro*_*pot 17

在过去的6个月里,我一直与Heroku支持团队保持联系.通过试验/错误已经缩短了很长一段时间,但我们已经确定了这个问题.

我最终注意到这些高响应时间与突然的内存交换相对应,即使我支付标准Dyno(这不是空闲),这些内存交换正在我的应用程序最近没有收到流量时发生.通过查看指标图表也可以清楚地知道这不是内存泄漏,因为内存将会停滞不前.例如:

突然记忆交换

经过与支持团队的多次讨论,我得到了这样的解释:

本质上,会发生一些后端运行时最终会导致应用程序组合最终使用运行时必须交换的足够内存.当发生这种情况时,运行时的一组随机dyno容器被强制任意少量交换(请注意,这里的"随机"可能是具有最近未访问但仍驻留在内存中的内存的容器).与此同时,使用大量内存的应用程序最终也会大量交换,这导致运行时的iowait比正常情况更多.

由于这个问题开始变得越来越明显,我们根本没有改变运行时间的紧密程度,所以我们目前的假设是问题可能来自客户从2.1之前的Ruby版本转移到2.1+.Ruby弥补了我们平台上运行的应用程序的很大一部分,而Ruby 2.1对它的GC进行了更改,以换取内存使用速度(实质上,它不太频繁地获取速度增加).这导致从旧版本的Ruby迁移的任何应用程序的内存使用量显着增加.因此,之前维持一定内存使用级别的相同数量的Ruby应用程序现在开始需要更多内存使用.

这种现象加上在平台上滥用资源的行为不当的应用程序达到了一个临界点,这使我们看到了现在我们看到的那些不应该交换的动力学的情况.我们正在研究一些攻击途径,但就目前而言,上述很多仍然有点投机.我们确实知道其中一些是由资源滥用应用程序引起的,这就是为什么迁移到Performance-M或Performance-L dynos(具有专用的后端运行时)不应该出现问题.这些dynos上唯一的内存使用量将是你的应用程序.所以,如果有交换,那将是因为你的应用程序导致了它.

我相信这是我和其他人一直在经历的问题,因为它与架构本身有关,而与语言/框架/配置的任何组合无关.

似乎没有一个好的解决方案,除了A)坚韧并等待它或B)切换到他们的一个专用实例

我知道有人说"这就是你应该使用AWS的原因",但我发现Heroku提供的好处超过了偶尔的高响应时间,而且这些年来它们的定价也变得更好了.如果您遇到同样的问题,"最佳解决方案"将是您的选择.当我听到更多内容时,我会更新这个答案.

祝好运!

  • 在这个问题上我们遇到了和其他人一样的问题,我也看到了这些奇怪的交换问题.我从来没有把两个和两个放在一起,保持警惕,看看我能不能看到一圈.这是非常有帮助的,希望现在他们承认存在这个问题可以解决. (2认同)