Python 高响应时间

Python 高响应时间,python,django,heroku,gunicorn,newrelic,Python,Django,Heroku,Gunicorn,Newrelic,这是非常具体的,但我会尽量简短: 我们正在Heroku上运行一个应用程序。三台服务器: 测试(1个卷筒纸,1个芹菜dyno) 培训(1个网络,1个芹菜dyno) 产品(2个卷筒纸,1个芹菜袋) 我们正在使用Gunicorn和gevents以及每个dyno上的4名工人 我们正经历零星的高服务时间。以下是日志条目中的一个示例: High Response Time: heroku router - - at=info method=GET path="/accounts/login/" dyn

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

我们正在Heroku上运行一个应用程序。三台服务器:

  • 测试(1个卷筒纸,1个芹菜dyno)
  • 培训(1个网络,1个芹菜dyno)
  • 产品(2个卷筒纸,1个芹菜袋) 我们正在使用Gunicorngevents以及每个dyno上的4名工人

    我们正经历零星的高服务时间。以下是日志条目中的一个示例:

    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秒超时出现应用程序错误屏幕
    • 高响应时间从5000ms到30000ms不等
    • 《新遗迹》并没有指出具体的问题。以下是过去的几笔交易和时间:
      • RegexURLResolver.resolve
        4270ms
      • SessionMiddleware.process_请求
        2750ms
      • Render login.html
        1230ms
      • WSGIHandler
        1390ms
      • 以上都是简单的通话,通常不会占用那么多时间
    我把范围缩小到了什么

    • 我见过这种情况发生在速度较慢的客户身上,但我们的办公室也有这种情况,因为我们有光纤连接
  • Gevent和async workers没有很好地发挥作用
    • 我们已经切换到gunicorn sync workers,但问题仍然存在
  • Gunicorn工作线程超时
    • 工人们可能以某种方式被保持在一种空状态
  • 工人/动力不足
    • 没有CPU/内存/db过度使用的迹象,New Relic也没有显示任何db延迟的迹象
  • 吵闹的邻居
    • 在我与Heroku的多封电子邮件中,支持代表提到我的一个长时间请求中至少有一个是由于邻居吵闹引起的,但他不相信这就是问题所在
  • 子域301
    • 请求顺利通过,但在应用程序中会被随机卡住
  • Dynos重新启动
    • 如果是这种情况,许多用户将受到影响。此外,我可以看到我们的dynos最近没有重新启动
  • Heroku路由/服务问题
    • Heroku服务可能比广告宣传的少,这只是使用他们的服务的一个缺点

  • 在过去的几个月里,我们一直存在这个问题,但现在我们正在扩展它,需要修复它任何想法都将受到极大的赞赏,因为我已经用尽了几乎所有的SO或Google链接。

    不确定这是否会有所帮助,但我现在在Heroku上的Rails应用程序也经历了同样的事情——似乎不确定的偶尔高请求时间。例如,
    HEAD
    newrelic正常运行时间ping到我的站点索引,通常需要2-5毫秒,需要5秒,或者呈现我的站点登录,通常需要12秒。偶尔也会出现30秒的随机超时。以下是Heroku对我的支持(至少在某些情况下):

    今天早些时候的一个看起来像是重启后排队的一大块请求。如果你想避免这些,你可能想看看我们的。这将允许您在部署后启动一组匹配的dynos,然后将请求转交给它们,而不是跳过现有的dynos并强制请求排队


    我应该注意到,这是Heroku的标准dyno重启之一,不是我的部署或任何东西。尽管preboot页面上有一些警告,但我在几分钟前就启用了它,所以我们将看看它对我的情况是否有任何影响。希望这可能会有帮助,因为我也一直在为此烦恼

    过去6个月,我一直与Heroku支持团队保持联系。通过尝试/错误缩小范围已经有很长一段时间了,但我们已经发现了问题所在

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

    在与他们的支持团队进行多次讨论后,我得到了以下解释:

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

    自从这个问题变得越来越明显以来,我们根本没有改变打包运行时的严格程度,因此我们目前的假设是,问题可能来自于客户从Ruby 2.1之前的版本迁移到2.1+。在我们的平台和Ruby 2.1上运行的应用程序中,Ruby占了很大比例