gro*_*pot 19 python django heroku gunicorn newrelic
这是非常具体的,但我会尽量简短:
我们正在Heroku上运行Django应用程序.三台服务器:
我们使用Gunicorn与gevents和每个赛道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次这些警报.值得注意的要点:
4,270ms
2,750ms
1,230ms
1,390ms
我把它缩小到了:
过去几个月我们一直有这个问题,但现在我们正在扩展它需要修复.任何想法都会受到高度赞赏,因为我已经用尽了所有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提供的好处超过了偶尔的高响应时间,而且这些年来它们的定价也变得更好了.如果您遇到同样的问题,"最佳解决方案"将是您的选择.当我听到更多内容时,我会更新这个答案.
祝好运!
归档时间: |
|
查看次数: |
4144 次 |
最近记录: |