我在 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 插件(另外我将应用程序更改为不再进行缓存,只是作为测试)。
这并没有解决独角兽超时(尽管它们现在似乎发生得更少了(!))。