Jvm zajmuje dużo czasu, aby rozwiązać adres IP dla localhost


112

Wygląda na to, że mam problem z wykonaniem „testu sbt” (który obejmuje wyszukanie nazw lokalnych hostów / adresów IP) po uaktualnieniu do macOS Sierra. W poprzedniej wersji OS X ukończenie pracy zajęło około 40-50 sekund. Czasy macOS Sierra są znacznie wyższe. Ostatni bieg, jaki zrobiłem, trwał około 15 minut. Czas kompilacji jest mniej więcej taki sam, jak w przypadku „El Capitan”.

Jestem jedynym z mojego zespołu, który wypróbował ten nowy system MacOS, więc nie mogę powiedzieć, czy dzieje się to tylko na moim Macu, czy jest to problem uniwersalny.

Mój kolega miał podobny problem na Ubuntu i był związany z generowaniem liczb losowych spowalniającym testy - Slow service response Times: Java SecureRandom & / dev / random

Niestety to mi się nie udało. Początkowo próbowałem tego na JDK 8u54, a następnie próbowałem zaktualizować do JDK 8u102 i to też nie pomogło.

PS Używam Macbooka Pro z połowy 2015 r. 2,8 GHz i7, 16 GB pamięci RAM, 1 TB SSD.


Używam gradle clean testi mam ten sam problem.
Max Peng

To jest błąd zgłoszony do OpenJDK: bugs.openjdk.java.net/browse/JDK-8143378 Został naprawiony jako duplikat innego błędu, który nie zostanie naprawiony. Powinien prawdopodobnie zostać ponownie otwarty.
Lóránt Pintér

Odpowiedzi:


326

Miałem ten sam problem. Tomcat przeszedł z 15 sekund do 6 minut, aby zainicjować kontekst wiosenny po aktualizacji ... wyłączenie csrutils nie rozwiązało problemu.

I rozwiązać ten problem poprzez dodanie mojego hosta Mac (tj Macbook.local, czy cokolwiek Mac nazywa) na /etc/hostsplik mapowany na 127.0.0.1adres jak również ::1tak:

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

Jeśli jesteś zainteresowany, możesz znaleźć szczegółowe informacje na temat problemu i rozwiązania tutaj: https://thoeni.io/post/macos-sierra-java/

W poście zamieszczam również link do projektu na githubie, aby pomóc w rozwiązaniu problemu i zweryfikowaniu rozwiązania.

Problem jest związany (jak sądzę) z tym, jak działa rozpoznawanie nazw hostów lokalnych i jak klasa java.net.InetAddr pobiera adresy. Weryfikowałem z kilkoma kolegami i najwyraźniej nie zdarza się to każdemu, kto przeszedł na Sierra, ale wciąż badam korzenie tej zmiany.

Rozwiązanie i tak było takie samo, jak zaimplementowane przez antid0te i działające natychmiast.


Ten sam problem ... I mogę potwierdzić, że wyłączenie SIP również nie działa dla mnie.
Borges

Świetnie działa, możesz sprawdzić w projekcie github github.com/thoeni/inetTester
christmo

21
Znalazłem to! To nie jest nazwa Maca. Nazwa hosta. Wpisując "hostname" w terminalu można podać poprawną nazwę hosta.
VK321,

1
Nadal widzę to w OSX 10.14.2, lata później. Dziękuję bardzo za poprawkę.
Malcolm Crum

1
macOS Mojave 10.14.4, nadal problem. Dołączanie nazwy hosta po localhostliniach sprzężenia zwrotnego IPv4 i IPv6 ( 127.0.0.1, ::1) nadal zweryfikowana poprawka!
Pies

43

Prawidłowa odpowiedź: Jvm zajmuje dużo czasu, aby rozwiązać adres IP dla lokalnego hosta

Dla leniwych:

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

4
Niesamowite! To zwiększyło czas uruchamiania mojego Minecrafta z 12 sekund do 0,5 sekundy.
Bob

@camikiller Widzę 2 różne wartości nazwy hosta w porównaniu z udostępnianiem> Nazwa komputera. Proszę wyjaśnić, której użyć?
vikramvi

Lepszym rozwiązaniem jest aktualizacja MacOS @vikramvi
camikiller

@camikiller później zrobiłem na apple.stackexchange.com/questions/66611/… , aby mieć tę samą nazwę, ale nadal nie działa. Czy muszę wprowadzić inne ustawienia w udostępnianiu?
vikramvi

@vikramvi Spróbuj ręcznie edytować /etc/hostsplik i dodaj 2 hosty
camikiller.

6

Mam ten sam problem. Uruchomienie mojej aplikacji wiosennej zajmuje 60 sekund w Sierra w porównaniu z 25 sekundami w Yosemite.

Podczas debugowania zdałem sobie sprawę, że problem pochodzi z InetAddress.getLocalHost (). Zmieniłem plik hosta, dodając nazwę hosta dla 127.0.0.1 i :: 1 i teraz aplikacja uruchamia się tak szybko, jak wcześniej.


2
Cześć, znalazłem to wyjaśnienie wysokiego poziomu, jeśli pomaga (ale nadal nie jest jasne, co zmieniło się w wersji MacOS Sierra): „Kiedy żądasz nazwy hosta, JDK rozwiązuje ją na adresy IP. Następnie próbuje wstecznego wyszukiwania tych adresów i sprawdza, czy co najmniej jeden z wyników jest odwzorowywany z powrotem na nazwę hosta wejściowego. To jest powolne wyszukiwanie wsteczne. Powolność nie ogranicza się do maszyny JVM. Wszystko w systemie operacyjnym, które spróbuje przeprowadzić takie wyszukiwanie wsteczne, będzie powolne bez odpowiednia konfiguracja w / etc / hosts. " (z github.com/spring-projects/spring-boot/issues/7087 )
thoeni

3

Włączenie np. Preferencje systemowe> Udostępnianie> Logowanie zdalne powoduje automatyczne przypisanie do nazwy hosta adresu IP.

Ponieważ ludzie widzą problemy po aktualizacji, warto założyć, że 10.12 zmieniło sposób rozwiązywania nazwy hosta, tj. Co najmniej w 10.11 nazwa hosta jest zawsze rozwiązywana, podczas gdy w 10.12 jest rozwiązywana tylko wtedy, gdy usługa jest włączona w Preferencjach systemowych> Udostępnianie (ktoś z 10.11 może to potwierdzić).


Mam 10.12.5, ale twoje rozwiązanie nie działa. którą masz wersję?
vikramvi

@vikramvi Mam 10.12.6 i do mojej instalacji rzeczy nadal działają zgodnie z opisem. Przy standardowym pliku / etc / hosts i wyłączonym współużytkowaniu polecenie ping $ (nazwa hosta) kończy się niepowodzeniem z nieznanym błędem hosta. Po włączeniu udostępniania nazwa hosta jest tłumaczona na adres IP mojej sieci VLAN. Jeśli chodzi o Javę (8u141), wywołanie InetAddress.getLocalHost () zajmuje 5 sekund w przypadku wyłączenia udostępniania. Po włączeniu udostępniania czas wykonania spada do 13 ms.
jurajw

To działa (choć jest naprawdę dziwne), w zasadzie nawet jeśli opcja „Zdalne logowanie” była już zaznaczona, odznacz ją, a następnie sprawdź ponownie. Wszystko znów zaczyna działać. Musisz to zrobić raz / boot LOL. Zauważ również, że jeśli kiedykolwiek zabiłeś proces "mDNS" (wcześniej), będziesz musiał zrobić tę sztuczkę, aby w ogóle przywrócić adresy .local. Lub użyj sposobu / etc / hosts, aby uzyskać
trwalszą naprawę

1

Myślę, że jest to ogólny problem z nowym systemem operacyjnym. Mam podobny problem: mam aplikację internetową, która jest wdrożona na tomcat. Na El Capitan uruchomił się w 10 sekund, teraz zajmuje to 95 sekund, a klient (aplikacja komputerowa oparta na Swing) nie może się z nim połączyć (lub przynajmniej zajęło to dużo czasu). Myślę, że chodzi o komunikację sieciową, ponieważ prosta aplikacja na konsolę testową działa dobrze.


1
Wyłączenie SIP rozwiązuje mój problem. macossierra-slow.com/…
Andras Gyetvan

1

To był dziwny problem po zainstalowaniu aktualizacji do Mac Sierra 10.12 (16A323). W pliku hosts z poniższym posortowanym problemem.

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

Możesz uzyskać nazwę myhostname za pomocą polecenia w $hostnamedowolnym miejscu terminala.


0

Przyjęta odpowiedź pomogła mi! Dodając to tutaj, wyjaśniając, jaki moim zdaniem problem był dla mnie:

Moja nazwa hosta była podobna do „Mój Mac”, której nie można było rozwiązać. W ustawieniach pokazało mi, że komputer można adresować za pomocą mymac.local

Pomyślałem, że to spacja i zmieniłem nazwę mojego Maca na „my.mac”, ale nawet to nie pomogło, ponieważ automatycznie dodane dns nadal było mymac.local

Pomogło wtedy dodanie my.mac do / etc / hosts.

Zgaduję więc, jaki jest rzeczywisty problem: dzieje się tak tylko wtedy, gdy nazwa twojego komputera zawiera coś, co nie jest literą. Jest to automatycznie usuwane przez system operacyjny, a następnie nazwa hosta i wpis dns nie są zgodne. (co można naprawić, dodając ręcznie)


1
Myślę, że problem jest głębszy ... moja nazwa hosta składała się z normalnych liter alfa, ale dodanie jej do / etc / hosts rozwiązało szereg dziwnych problemów dla mnie
Magnus

0

Napotkałem ten sam problem na moim Macu.

Problem został rozwiązany, gdy zmieniłem nazwę hosta podstawowego i nazwę hosta Bonjour, aby zawierały tylko znaki alfanumeryczne. Pomysł wyszedł od kolegi, który gdzieś przeczytał poradę, gdy stanął przed podobnym problemem (nie pamiętał gdzie).

Czerpiąc inspirację z tego przewodnika, postępowałem zgodnie z następującymi krokami:

Najpierw zmień nazwę hosta podstawowego

sudo scutil --set HostName <new host name>

na przykład:

sudo scutil --set HostName eggsandwich

Następnie zmień nazwę hosta Bonjour (dla kompletności, nigdy nie próbowałem bez tego kroku, więc może być niepotrzebne).

sudo scutil --set LocalHostName <new host name>

na przykład:

sudo scutil --set LocalHostName eggsandwich

Teraz zrestartuj procesy Java, z którymi miałeś problemy i miejmy nadzieję, że nie powinny się już zawieszać.

Na marginesie, rozwiązało to również inny problem, który miałem, polegający na tym, że nowa karta w Terminalu nie uruchamiała bash w tym samym katalogu pomimo moich preferencji. Nie mam wyjaśnienia, dlaczego tak się stało, ale jestem bardzo zadowolony.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.