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 一无所知。
-- 皮特