我有一个仅限API的Phoenix 1.3系统。我注意到响应时间很慢,看看是否有其他人遇到过这个问题。
情景非常简单。我在远程计算机上有一个数据库。即使是最简单的查询,往返时间约为140-156毫秒。我在本地机器上运行elixir / phoenix服务器。
当我从chrome,curl或任何东西(再次从本地计算机)点击一个简单的端点时,日志将报告“在141ms内发送200”,ecto将db时间报告为140-141ms。乍一看这是个好消息。我的期望是数据库占用大部分时间,编码响应速度很快。服务器的日志输出似乎显示了这一点。
然而,在镀铬/卷曲方面,报告的时间范围在450-700ms之间 - 远不及日志所说的。我本以为时间会更接近。
如果200时间在140ms范围内,则往往需要450ms才能到达客户端。 200次向北移动到156ms,然后在chrome / curl报告的时间接近700ms。
我在这里看到了另一个类似的问题,有人注意到他们的priv / static是问题 - 然而,即使该目录为空,这仍然会发生。
其他一些随机事实:
有没有人见过这个?我敢肯定我忽略了一些显而易见的事情。任何可能导致从报告的“已发送”到本地计算机上的客户端看到响应的延迟的问题?
也许不那么明显:小的响应是否有可能通过套接字以某种方式被刷新直到关闭因为它们很小?
更新3 :
它看起来像响应时间的一个大波动是由于连接进入端点的速度很慢。在请求进入Phoenix.Endpoint之前,与elixir / phoenix应用程序的新连接似乎需要250-300ms。如果请求通过重用连接进入,则速度更快(接近您的预期)。我并不是说实际的tcp接受速度很慢 - 只是在那里和进入App的EndPoint之间发生了什么。
有关何处查看可能导致此问题的建议?凤凰/牧场/牛仔在最初的连接上做什么可能会出现瓶颈吗?或者,我忽略了某个地方的环境?
更新4 /解决方案“接受延迟”
看起来我已经解决了“接受延迟”问题 - 根本不是你可能猜到的灵丹妙药问题。在对我用来测试的工具进行了大量调试之后,我发现我正在使用的是尝试首先连接到ipv6上的localhost,然后是ipv4。灵丹妙药进程只与ipv4绑定。因此,从chrome等开始的新连接从ipv6到ipv4失败大约需要250-300ms。
解决方法是将此添加到配置中:
...
http: [port: 4000, ip: {0, 0, 0, 0, 0, 0, 0, 0}],
....
这使服务器等待ipv6和ipv4上的连接。创造了一个与众不同的世界。