解析 localhost 的 ip 地址需要很长时间

在升级到 macOS Sierra 之后,“ sbt test”(包括查找本地主机名/IP 地址)的性能似乎出现了问题。在之前的 OS X 版本中,大约需要40-50秒才能完成。MacOS Sierra 时间要比这个高得多。我最后一次跑步是15分钟左右。编译时间和“ El Capitan”上的差不多。

我是我的团队中唯一一个尝试这个新 MacOS 的人,所以我不知道这是否只发生在我的 Mac 上,或者这是一个普遍的问题。

我的同事在 Ubuntu 上也遇到过类似的问题,这个问题和随机数的生成减慢了测试的速度有关—— 缓慢的服务响应时间: JavaSecureRandom &/dev/Random

不幸的是,这招对我不管用。最初,我在 JDK 8u54上尝试了这种方法,然后尝试更新到 JDK 8u102,但这也没有帮助。

另外,我正在运行 Macbook Pro 2015年中期的2.8 GHz i7,16GB 内存,1TB 固态硬盘。

45037 次浏览

我认为这是新操作系统普遍存在的问题。我有一个类似的问题: 我有一个部署到 tomcat 的 Web 应用程序。在 El Capitan 上,它只用了10秒就启动了,现在只需要95秒,而客户端(一个基于 Swing 的桌面应用程序)无法连接到它(或者至少花了很多时间)。我认为它是围绕着网络通信,因为一个简单的测试控制台应用程序运行良好。

我也有同样的问题。Tomcat 在升级后从15秒到6分钟初始化春季环境... 禁用 csrutils 并没有解决我的问题。

我通过在映射到 127.0.0.1::1/etc/hosts文件中添加我的 Mac 主机名(即 Macbook.local,或者不管你的 Mac 叫什么)来解决这个问题:

127.0.0.1   localhost mbpro.local
::1         localhost mbpro.local

如果你有兴趣,你可以在这里找到一些关于这个问题和解决方案的细节: Https://thoeni.io/post/macos-sierra-java/

在这篇文章中,我还链接到一个 Github 项目来帮助解决问题和验证解决方案。

这个问题(我相信)与本地主机名解析的工作方式和 java.net 的工作方式有关。InetAddr 类正在检索地址。我和几个同事进行了验证,显然不是每个升级到 Sierra 的人都会遇到这种情况,但我仍在调查这种变化的根源。

无论如何,解决方案与 antid0te实现并立即工作的方案是相同的。

我也有同样的问题,我的弹簧启动应用程序在 Sierra 上启动需要60秒,在 Yosemite 上需要25秒。

While debugging, I realized that the problem comes from InetAddress.getLocalHost(). I changed my host file to add my hostname for 127.0.0.1 and :: 1 and now the application starts as fast as before.

正确答案: 解析 localhost 的 ip 地址需要很长时间

对于懒惰的人:

sudo sed -i bak "s^127\.0\.0\.1.*^127.0.0.1 localhost $(hostname)^g" /etc/hosts
sudo sed -i bak "s^::1.*^::1 localhost $(hostname)^g" /etc/hosts
sudo ifconfig en0 down
sudo ifconfig en0 up

启用例如系统首选项 > 共享 > 远程登录,会导致主机名被自动分配一个 IP 地址。

由于人们在升级后发现了问题,所以假设10.12改变了主机名的解析方式是合理的,即至少在10.11时主机名总是被解析,而在10.12时,只有在系统首选项 > 共享(System Preferences > Share)中启用服务时才能解析主机名(10.11的用户可以证实这一点)。

It was a weird issue after installing the update to Mac Sierra 10.12 (16A323). In the hosts file with the below sorted the issue.

::1         localhost <myhostname>.local   <--- Was already present
127.0.0.1   localhost <myhostname>.local   <--- Solved the tomcat loading issue

您可以通过命令 $hostname在终端的任何位置获得 我的主机名

这个被接受的答案帮助了我! 只是在这里加上这个,解释我认为我的问题是:

我的主机名就像“我的 Mac”一样无法解决。在设置中,它向我展示了计算机可以用 mymac.local 进行寻址

我认为这是空间,并将我的 mac 重命名为“ my.mac”,但即使这样也没有帮助,因为 dns 自动添加的仍然是 mymac.local

将 my.mac 添加到/etc/hosts 对此有所帮助。

所以我猜实际的问题是: 只有当你的计算机名包含任何不是字母的东西时才会发生这种情况。这是自动删除的操作系统,然后主机名和 dns 条目不匹配。(这可以修复我手动添加它)

我在 Mac 上也遇到过同样的问题。

When I changed my primary and Bonjour hostnames to only contain alphanumeric characters it resolved the issue. The idea came from a colleague who had read the advice somewhere when he was facing a similar problem (he couldn't remember where).

这本指南中获得灵感的步骤如下:

首先,更改主主主机名

sudo scutil --set HostName <new host name>

例如:

sudo scutil --set HostName eggsandwich

Next, change Bonjour hostname (for completeness, I never tried without this step so it could be it's not needed).

sudo scutil --set LocalHostName <new host name>

例如:

sudo scutil --set LocalHostName eggsandwich

Now restart the java processes you were having issues with, and hopefully they should no longer hang.

另外,这也解决了我遇到的另一个问题,即终端中的一个新选项卡不会在同一目录中启动 bash,尽管我有自己的首选项。我不知道为什么会这样,但我很高兴。