0

我在 Heroku 上有一个应用程序,我分叉了它以尝试欧洲地区的支持。经过一些最初的障碍(Heroku 欧洲地区:尝试分叉时出现“应用程序错误”),这似乎工作正常。

我使用 ab(Apache Bench)工具运行了一个简单的负载测试,并希望看到每秒请求数的改进。然而,并非如此:

10 个并发用户的 1000 个请求的计时(ab -n 1000 -c 10 <URL>)

我们:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      305  349  44.4    337     719
Processing:   128  356 282.8    244    2213
Waiting:      127  350 283.0    238    2213
Total:        442  705 280.5    610    2521

欧盟:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      125  188  47.6    175     451
Processing:    67 2595 3537.9   3309   30171
Waiting:       66 2591 3538.9   3309   30170
Total:        207 2783 3536.2   3472   30321

有些东西跳出来:

  • 正如预期的那样,欧盟的延迟(参见“连接:”)明显低于美国。很好。
  • 欧盟的一些要求需要 30 多岁?什么?

经过调查,这是我发现的:

  • Heroku 的默认请求超时时间为 30 秒:任何花费超过该时间的请求都会被终止。这解释了最大 30 秒。
  • 但是为什么会这样呢?我查看了日志,发现请求最初很快,然后开始花费更长的时间,直到最终,它们似乎“挂在”独角兽工人身上。这些工作人员有 15 秒的超时,之后工作人员被主 Unicorn 进程杀死并重新启动(在 Heroku 日志中显示为 H13 错误)。我假设这个请求没有重试,导致最后的时间是 30 秒。

我看过 New Relic,但这些奇怪的缓慢请求仅显示 99% 的时间花费在一些未指定的“应用程序代码 (ROOT)”(与实际的数据库访问等分开显示)上,无法深入研究(注意:我的计划是免费的)。应用程序代码似乎没有任何问题(毕竟它在美国运行良好)。

我的问题:我该如何调试呢?有没有我可以更改的配置来解决这个问题?我错过了什么?

更新

我尝试了评论中的建议,最后完全为欧盟禁用了 Memcachier 插件(另外我将应用程序更改为不再进行缓存,只是作为测试)。

这并没有解决独角兽超时(尽管它们现在似乎发生得更少了(!))。

4

1 回答 1

0

我怀疑您的一个附加组件是在不同的区域提供的。使用以下命令检索 memcachier URL config:get

$ heroku config:get MEMCACHIER_URL

然后将域粘贴到http://ip-lookup.net/之类的内容中,以查看加载项的托管位置。

如果它在美国,那么您需要在欧盟重新提供:

$ heroku addons:remove memcachier
$ heroku addons:add memcachier

它应该在正确的区域提供。

如果在错误的区域中配置了附加组件,那么这是一个错误。如果是这样,请在此处使用您的应用名称发表评论,我们可以对其进行调查。

于 2013-05-06T14:21:40.693 回答