Jvm benötigt viel Zeit, um die IP-Adresse für localhost aufzulösen

112

Ich habe anscheinend ein Problem mit der Leistung des "sbt-Tests" (einschließlich der Suche nach lokalen Hostnamen / IP-Adressen) nach dem Upgrade auf macOS Sierra. In einer früheren Version von OS X dauerte der Abschluss ca. 40-50 Sekunden. Die Zeiten für macOS Sierra sind viel höher. Der letzte Lauf, den ich gemacht habe, war ungefähr 15 Minuten. Die Kompilierungszeiten sind ungefähr die gleichen wie bei 'El Capitan'.

Ich bin der einzige aus meinem Team, der dieses neue MacOS ausprobiert, sodass ich nicht sagen kann, ob es nur auf meinem Mac passiert oder ob es sich um ein universelles Problem handelt.

Mein Kollege hatte ein ähnliches Problem unter Ubuntu und es hing mit der Generierung von Zufallszahlen zusammen, die die Tests verlangsamte - Langsame Service-Antwortzeiten: Java SecureRandom & / dev / random

Leider hat das bei mir nicht funktioniert. Ursprünglich habe ich das auf JDK 8u54 versucht und dann versucht, auf JDK 8u102 zu aktualisieren, und das hat auch nicht geholfen.

PS Ich verwende Macbook Pro Mitte 2015 mit 2,8 GHz i7, 16 GB RAM und 1 TB SSD.

Tomasz Mikuś
quelle
Ich benutze gradle clean testund habe das gleiche Problem.
Max Peng
Dies ist der Fehler, der OpenJDK gemeldet wurde: bugs.openjdk.java.net/browse/JDK-8143378 Er wurde als Duplikat eines anderen Fehlers behoben, der nicht behoben werden kann. Es sollte wahrscheinlich wieder geöffnet werden.
Lóránt Pintér

Antworten:

324

Ich hatte das gleiche Problem. Tomcat ging von 15 Sekunden auf 6 Minuten, um den Frühlingskontext nach dem Upgrade zu initialisieren ... das Deaktivieren von csrutils hat das Problem für mich nicht gelöst.

Ich habe das Problem gelöst , indem ich meinen Mac-Hostnamen (dh Macbook.local oder wie auch immer Ihr Mac heißt) zu der /etc/hostsDatei hinzugefügt habe, die der 127.0.0.1Adresse zugeordnet ist, und Folgendes ::1:

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

Wenn Sie interessiert sind, finden Sie hier einige Details zu dem Problem und der Lösung: https://thoeni.io/post/macos-sierra-java/

In diesem Beitrag verlinke ich auch auf ein Github-Projekt , um das Problem zu beheben und die Lösung zu validieren.

Das Problem hängt (glaube ich) damit zusammen, wie die Auflösung des lokalen Hostnamens funktioniert und wie die Klasse java.net.InetAddr die Adressen abruft. Ich habe mit wenigen Kollegen überprüft, und anscheinend passiert es nicht jedem, der ein Upgrade auf Sierra durchgeführt hat, aber ich untersuche immer noch die Wurzeln dieser Änderung.

Die Lösung war sowieso die gleiche, die antid0te implementiert und sofort funktioniert hat.

thoeni
quelle
Gleiches Problem ... Und ich kann bestätigen, dass das Deaktivieren von SIP auch bei mir nicht funktioniert hat.
Borges
Großartig, es funktioniert, Sie können mit dem Github-Projekt github.com/thoeni/inetTester
christmo
21
Fand es! Es ist kein Mac-Name. Sein Hostname. Durch Eingabe von "Hostname" im Terminal kann der korrekte Hostname angegeben werden.
VK321
1
Ich sehe dies noch Jahre später unter OSX 10.14.2. Vielen Dank für das Update.
Malcolm Crum
1
macOS Mojave 10.14.4, immer noch ein Problem. Das Anhängen des Hostnamens localhostan IPv4- und IPv6-Loopback-Zeilen ( 127.0.0.1, ::1) wurde weiterhin überprüft.
Hund
43

Richtige Antwort: Jvm benötigt viel Zeit, um die IP-Adresse für localhost aufzulösen

Für die Faulen:

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
Camikiller
quelle
4
Genial! Dies erhöhte die Startzeit meines Minecraft von 12 Sekunden auf 0,5 Sekunden.
Bob
@camikiller Ich sehe 2 verschiedene Werte für Hostname vs Freigabe> Computername. Bitte klären Sie, welche verwendet werden sollen.
Vikramvi
Bessere Lösung ist das Upgrade Ihres MacOS @vikramvi
camikiller
@camikiller später habe ich per apple.stackexchange.com/questions/66611/… den gleichen Namen gehabt , aber es funktioniert immer noch nicht. Muss ich unter Freigabe andere Einstellungen vornehmen?
Vikramvi
@ Vikramvi Versuchen Sie, Ihre /etc/hostsDatei manuell zu bearbeiten und fügen Sie die 2 Hosts hinzu
Camikiller
6

Ich habe das gleiche Problem. Meine Spring-Boot-Anwendung benötigt 60 Sekunden, um in Sierra zu starten, gegenüber 25 Sekunden in Yosemite.

Beim Debuggen wurde mir klar, dass das Problem von InetAddress.getLocalHost () herrührt. Ich habe meine Hostdatei geändert, um meinen Hostnamen für 127.0.0.1 und :: 1 hinzuzufügen, und jetzt startet die Anwendung so schnell wie zuvor.

Antid0te
quelle
2
Hallo, ich habe diese allgemeine Erklärung gefunden, wenn sie hilft (aber es ist immer noch nicht klar, was sich in der MacOS Sierra-Version geändert hat): "Wenn Sie einen Hostnamen anfordern, löst das JDK ihn in IP-Adressen auf. Anschließend wird eine umgekehrte Suche dieser Adressen versucht und überprüft, ob mindestens eines der Ergebnisse dem Namen des eingegebenen Hosts wieder zugeordnet ist. Diese umgekehrte Suche ist langsam. Die Langsamkeit ist nicht auf die JVM beschränkt. Alles auf dem Betriebssystem, das versucht, eine solche umgekehrte Suche durchzuführen, ist ohne langsam entsprechende Konfiguration in / etc / hosts. " (von github.com/spring-projects/spring-boot/issues/7087 )
thoeni
3

Wenn Sie z. B. Systemeinstellungen> Freigabe> Remote-Anmeldung aktivieren, wird dem Hostnamen automatisch eine IP-Adresse zugewiesen.

Da nach dem Upgrade Probleme auftreten, ist es sinnvoll anzunehmen, dass 10.12 die Auflösung des Hostnamens geändert hat, dh zumindest mit 10.11 wird der Hostname immer aufgelöst, während er mit 10.12 nur behoben wird, wenn ein Dienst in den Systemeinstellungen> aktiviert ist Teilen (jemand mit 10.11 könnte dies bestätigen).

jurajw
quelle
Ich habe 10.12.5, aber Ihre Lösung hat nicht funktioniert. Welche Version hast du?
Vikramvi
@vikramvi Ich habe 10.12.6 und für meine Installation funktionieren die Dinge immer noch wie beschrieben. Wenn eine Standarddatei / etc / hosts deaktiviert ist und die Freigabe deaktiviert ist, schlägt ping $ (Hostname) mit einem unbekannten Hostfehler fehl. Bei aktivierter Freigabe wird der Hostname in die IP meines VLAN aufgelöst. Wie bei Java (8u141) dauert das Aufrufen von InetAddress.getLocalHost () 5 Sekunden, wenn die Freigabe deaktiviert ist. Bei aktivierter Freigabe sinkt die Ausführungszeit auf 13 ms.
Jurajw
Dies funktioniert (obwohl es wirklich seltsam ist), im Grunde genommen, auch wenn "Remote Login" bereits aktiviert war, deaktivieren Sie es und überprüfen Sie es dann erneut. Die Dinge beginnen wieder zu funktionieren. Sie müssen es einmal tun / LOL booten. Beachten Sie auch, dass Sie, wenn Sie den "mDNS" -Prozess (früher) einmal beendet haben, diesen Trick ausführen müssen, um überhaupt lokale Adressen wiederherzustellen. Oder verwenden Sie die Methode / etc / hosts für eine dauerhaftere Lösung
Rogerdpack
1

Ich denke, es ist ein allgemeines Problem mit dem neuen Betriebssystem. Ich habe ein ähnliches Problem: Ich habe eine Webanwendung, die auf Tomcat bereitgestellt wird. Auf El Capitan wurde es in 10 Sekunden gestartet, jetzt dauert es 95 Sekunden und der Client (eine Swing-basierte Desktop-App) kann keine Verbindung herstellen (oder es hat zumindest viel Zeit in Anspruch genommen). Ich denke, es geht um Netzwerkkommunikation, da eine einfache Testkonsolen-App gut läuft.

Andras Gyetvan
quelle
1
Das Ausschalten von SIP löst mein Problem. macossierra-slow.com/…
Andras Gyetvan
1

Es war ein seltsames Problem nach der Installation des Updates auf Mac Sierra 10.12 (16A323). In der Hosts-Datei mit der folgenden sortiert das Problem.

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

Sie können den Namen myhost per Befehl an einer $hostnamebeliebigen Stelle im Terminal abrufen .

Sidd Gautama
quelle
0

Die akzeptierte Antwort hat mir geholfen! Fügen Sie dies hier hinzu und erklären Sie, was meiner Meinung nach das Problem für mich war:

Mein Hostname war so etwas wie "Mein Mac", der nicht aufgelöst werden konnte. In den Einstellungen zeigte es mir, dass der Computer mit mymac.local adressiert werden konnte

Ich dachte, es sei der Speicherplatz und benannte meinen Mac in "my.mac" um, aber selbst das half nichts, da der automatisch hinzugefügte DNS immer noch mymac.local war

Das Hinzufügen von my.mac zu / etc / hosts hat dann geholfen.

Ich vermute also, was das eigentliche Problem ist: Dies passiert nur, wenn Ihr Computername etwas enthält, das kein Buchstabe ist. Dies wird vom Betriebssystem automatisch entfernt und dann stimmen Hostname und DNS-Eintrag nicht überein. (was durch manuelles Hinzufügen behoben werden kann)

Arne
quelle
1
Ich denke, das Problem geht tiefer als das ... mein Hostname war alles normale Alpha-Buchstaben, aber das Hinzufügen zu / etc / hosts löste eine Reihe von seltsamen Problemen für mich
Magnus
0

Ich habe das gleiche Problem auf meinem Mac festgestellt.

Als ich meine primären und Bonjour-Hostnamen so änderte, dass sie nur alphanumerische Zeichen enthielten, wurde das Problem behoben. Die Idee kam von einem Kollegen, der den Rat irgendwo gelesen hatte, als er vor einem ähnlichen Problem stand (er konnte sich nicht erinnern, wo).

Ich ließ mich von diesem Leitfaden inspirieren und folgte den folgenden Schritten:

Ändern Sie zunächst den primären Hostnamen

sudo scutil --set HostName <new host name>

z.B:

sudo scutil --set HostName eggsandwich

Ändern Sie als Nächstes den Hostnamen von Bonjour (der Vollständigkeit halber habe ich es nie ohne diesen Schritt versucht, sodass er möglicherweise nicht benötigt wird).

sudo scutil --set LocalHostName <new host name>

z.B:

sudo scutil --set LocalHostName eggsandwich

Starten Sie nun die Java-Prozesse neu, mit denen Sie Probleme hatten, und hoffentlich sollten sie nicht länger hängen bleiben.

Nebenbei bemerkt, dies löste auch ein anderes Problem, bei dem eine neue Registerkarte im Terminal trotz meiner Einstellungen nicht im selben Verzeichnis Bash starten würde. Ich habe keine Erklärung dafür, warum das passiert ist, aber ich bin sehr zufrieden.

Erik Madsen
quelle