为什么环回的延迟比鲤鱼接口less?

堆栈溢出职业是这样的:

user -> internet -> our fw -> nginx -> haproxy -> web farm 
  • FreeBSD是正在使用的操作系统
  • 此框上没有防火墙或QoS
  • nginx处理我们的SSL终止
  • haproxy处理负载平衡
  • nginx / haproxy每种方式都推动大约15 Mbps

在正常的操作过程中,nginx收到HTTP请求,完成它的工作,然后将请求转交给绑定到同一个盒子上的环回地址(127.0.0.1)的haproxy实例。

为了进行一些故障排除,我把haproxy实例移到了nginx运行的同一个接口上。 这会立即为所有请求增加100毫秒的延迟。 这个接口不是一个真正的物理接口,而是一个鲤鱼接口 。

任何人都可以向我解释为什么这是事实吗? 与包队列争用也许? 或者也许loopback总是更快,因为它是“软”? 我在这里错过了一些基本的东西,我希望有人会好好教育我。

一个恒定的100毫秒的延迟看起来很奇怪。 它看起来像数据包缓冲,并没有立即交付。 或者,也许其中一些被丢弃并重新发送。 你可以在这个界面上运行tcpdump来显示这个问题吗? 我不知道IP堆栈如何在FreeBSD上工作,也不知道CARP是如何实现的,但是有可能例如从设备定期通过免费的ARP发布自己的MAC地址,并且主设备也可以向每一边发送数据包?

你也可以在真实的界面上运行tcpdump来确保没有任何东西被排出?

系统是否有可能无法cachingCARP设备的ARP条目,从而导致每个会话的数据包发出ARP请求,CARP守护进程将不得不应答?

其中大部分是一些愚蠢的想法,但这是为了帮助您在正确的方向上进行search。

为了清楚起见,您只是改变了从127地址到本地IP的访问方式; 正确?

如果是这样的话,那就有所不同了,有些事情是不对的。 用netstat -rn检查你的路由表,看看本地IP路由到什么地方,它应该路由到lo0接口(就像127)。

你的netstat -rn输出应该与此类似:

 Internet: Destination Gateway Flags Refs Use Netif Expire default 1.2.3.1 UGS 131 2655014 nge1 1.2.3.0/23 link#2 U 0 88 nge1 1.2.3.4 link#2 UHS 0 34848 lo0 127.0.0.1 link#5 UH 0 64678 lo0 192.168.0.0/26 link#1 U 2 41703537 nge0 192.168.0.1 link#1 UHS 0 70088 lo0 

我已经看到作为一个中断级别的软件I / F实现回环,使stream量永远不会超出框。 当你运行环回时,情况会是这样吗? 声明:只是一个普遍的问题; 我对FreeBSD一无所知。

– 皮特