Heroku偶尔请求缓慢

时间:2013-04-20 19:43:09

标签: performance heroku

我们发现Heroku上的性能不一致与最近的独角兽/智能路由问题无关。

这是一个请求的示例,通常需要大约150毫秒(20倍中的19个是需要多长时间)。你可以看到,在这个请求上花了大约4秒,或者长了1到2个数量级。

enter image description here

有些注意事项:

  • 数据库不是瓶颈,它只花了25ms进行数据库查询
  • 我们有足够多的dynos,所以我不认为这是瓶颈(20个双dynos运行独角兽,每个5个工人,我们每分钟只获得1000个请求,平均响应时间为150ms,这意味着我们应该是能够服务(60 / 0.150)* 20 * 5 =每分钟40,000个请求。换句话说,在进行此测量时,我们的dynos容量是40倍。

所以我想知道什么可能导致这些偶尔的慢速请求。正如我所提到的,传闻似乎在20个请求中大约有1个发生。我唯一能想到的是盒子上存在嘈杂的邻居问题,或者路由层的性能不一致。如果有人有其他信息或想法,我会很好奇。谢谢。

1 个答案:

答案 0 :(得分:9)

我自己一直在追逐类似的问题,到目前为止没有太多运气。

我认为第一项业务是推荐NewRelic。在这些情况下,它可能会为您提供更多信息。

其次,我建议您查看排队时间:您的请求排队多长时间。请查看NewRelic,或者使用Heroku添加到您的传入请求的“开始时间”HTTP标头(仅打印()减去“开始时间”作为您的队列时间)来自行完成。

如果那些人在我的情况下失败了,我试着提出可能出错的事情,这里有一个(非正统的?奇怪的?)清单:

1)DNS - 你在视图中进行任何DNS调用吗?这些可能需要一段时间。甚至DNS请求解析数据库主机名,Redis主机名,外部服务提供商等

2)日志性能 - Heroku使用他们的“Logplex”收集你的所有标准输出,然后它将消耗到你自己定义的logdrains,Papertrail等服务。没有关于这个的性能的文档,并写入从理论上讲,你的进程中的stdout可以阻塞Heroku冲刷它可能存在的任何缓冲区。

3)获取数据库连接 - 不确定您正在使用哪个框架,但是您可能有一个连接池,您正在从中获取数据库连接,这需要时间?它不会显示为查询时间,它会阻止您的流程。

4)Dyno性能 - Heroku具有一个附加功能,可以每隔几秒将一些服务器指标(加载平均值,内存)打印到stdout。我使用Graphite来绘制这些图表并查找指标与我看到“偶发慢速请求”实例增加的时间之间的相关性。它没有帮助我,但可能会帮助你:)。

请告诉我们您的想法。