为什么环回接口的延迟比 Carp 接口的延迟要小?

为什么环回接口的延迟比 Carp 接口的延迟要小?

Stack Overflow 招聘提供的内容如下:

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 毫秒的延迟。此接口不是真正的物理接口,而是一个鲤鱼接口

有人能向我解释为什么会这样吗?可能是与数据包队列争用?或者可能是因为环回是“软”的,所以总是更快?这里我遗漏了一些基本知识,希望有人能善意地教育我。

答案1

持续 100ms 的延迟看起来很奇怪。看起来好像数据包被缓冲了,并没有立即传送。或者其中一些被丢弃并重新传输。您可以在此接口上运行 tcpdump 来显示问题吗?我不知道 FreeBSD 上的 IP 堆栈是如何工作的,也不知道 CARP 是如何实现的,但例如,从属设备是否可能定期使用免费 ARP 通告其 MAC 地址,而主设备则交替向每一侧发送数据包?

您是否还可以在真实接口上运行 tcpdump 以确保没有任何东西被发射出去?

系统是否可以避免缓存 CARP 设备的 ARP 条目,从而导致会话的每个数据包都发出 ARP 请求,CARP 守护进程必须回答?

其中大部分都是一些愚蠢的想法,但这是为了帮助您朝着正确的方向寻找。

答案2

只是为了清楚起见,您只改变了访问方式,从 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

答案3

我曾见过将环回实现为中断级软件接口,这样流量就不会超出范围。当您运行环回时会出现这种情况吗?免责声明:这只是一个一般性问题;我对 FreeBSD 一无所知。

-- 皮特

相关内容