为什么我的 Ruby 或 ADB 网络命令在 Docker 容器内非常慢,但在主机上却正常?

为什么我的 Ruby 或 ADB 网络命令在 Docker 容器内非常慢,但在主机上却正常?

最近,两个不相关的命令在具有主机网络的 Docker 容器内开始表现得非常糟糕:

Android adb 需要 12 秒才能连接到另一台机器的 adb 服务器以使用其模拟器,而 Ruby 则需要 2 分钟以上才能连接到https://rubygems,org

这两个命令通常在几分之一秒内完成,在容器的主机上执行时或在同一网络上针对某些不同的目标服务器执行时仍能完成。

尤其

ruby -ropen-uri -e 'p open("https://rubygems.org").read'|od -ta |head -2

在 Ruby 2.1.2 上花费了 2 分 12 秒,而在 Ruby 2.5.1 上一分钟后超时。

答案1

对于内部服务器,有人为其分配了 IPv6 地址,但没有费心告知机器,并且 ADB 在尝试 IPv4 之前经历了三次 IPv6 超时。

对于外部地址,即使我们的外部路由器丢弃了数据包,某些人也允许 DNS 返回 IPv6 地址 - 在尝试 IPv4 之前使用 IPv6 超时的基本原理相同。

显而易见的建议是,使用慢速命令关闭主机的 IPv6,但这并不奏效,因为不幸的是,Android ADB 在操作系统中发现了 IPv6 逻辑,并且在操作系统表示不可用时爆炸。


我的同事刚刚向我指出 /etc/gai.conf 可用于赋予 IPv4 优先权。

相关内容