Jvm impiega molto tempo per risolvere l'indirizzo ip per localhost


112

Mi sembra di avere un problema con le prestazioni di "test sbt" (che include la ricerca di nomi host locali / indirizzi IP) dopo l'aggiornamento a macOS Sierra. Su una versione precedente di OS X ci sono voluti circa 40-50 secondi per finire. I tempi di macOS Sierra sono molto più alti di così. L'ultima corsa che ho fatto è stata di circa 15 minuti. I tempi di compilazione sono più o meno gli stessi di "El Capitan".

Sono l'unico del mio team a provare questo nuovo macOS, quindi non posso dire se sta accadendo solo sul mio Mac o è un problema universale.

Il mio collega ha riscontrato un problema simile su Ubuntu ed era correlato alla generazione di numeri casuali che rallentava i test - Tempi di risposta del servizio lenti: Java SecureRandom e / dev / random

Sfortunatamente, non ha funzionato per me. Inizialmente l'ho provato su JDK 8u54 e poi ho provato ad aggiornare a JDK 8u102 e anche questo non ha aiutato.

PS Sto eseguendo Macbook Pro Mid-2015 2.8GHz i7, 16 GB di ram, 1 TB SSD.


Sto usando gradle clean teste ho lo stesso problema.
Max Peng

Questo è il bug segnalato a OpenJDK: bugs.openjdk.java.net/browse/JDK-8143378 È stato risolto come un duplicato di un altro bug che non verrà corretto. Probabilmente dovrebbe essere riaperto.
Lóránt Pintér

Risposte:


326

Ho avuto lo stesso problema. Tomcat è passato da 15 secondi a 6 minuti per inizializzare il contesto primaverile dopo l'aggiornamento ... disabilitare csrutils non ha risolto il problema per me.

Ho risolto il problema aggiungendo il nome host del mio Mac (cioè Macbook.local, o qualunque sia il nome del tuo Mac) sul /etc/hostsfile mappato 127.0.0.1all'indirizzo e in ::1questo modo:

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

Se sei interessato puoi trovare alcuni dettagli sul problema e la soluzione qui: https://thoeni.io/post/macos-sierra-java/

Nel post mi collego anche a un progetto github per aiutare a risolvere il problema e convalidare la soluzione.

Il problema è correlato (credo) a come funziona la risoluzione dei nomi localhost e come la classe java.net.InetAddr sta recuperando gli indirizzi. Ho verificato con pochi colleghi e apparentemente non succede a tutti coloro che sono passati a Sierra, ma sto ancora indagando sulle radici di questo cambiamento.

La soluzione comunque era la stessa che antid0te ha implementato e ha funzionato immediatamente.


Stesso problema ... E posso confermare che disabilitare SIP non ha funzionato anche per me.
borges

Fantastico, puoi verificare con il progetto github github.com/thoeni/inetTester
christmo

21
Trovato! Non è il nome del Mac .. Il suo nome host. Digitando "hostname" nel terminale è possibile fornire il nome host corretto.
VK321

1
Lo vedo ancora su OSX 10.14.2, anni dopo. Grazie mille per la correzione.
Malcolm Crum

1
macOS Mojave 10.14.4, ancora un problema. Aggiunta del nome host dopo localhostalle linee di loopback IPv4 e IPv6 ( 127.0.0.1, ::1) correzione ancora verificata!
Cane

43

Risposta corretta: Jvm impiega molto tempo per risolvere l'indirizzo ip per localhost

Per i pigri:

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
Eccezionale! Questo ha aumentato il mio tempo di lancio di Minecraft da 12 secondi a 0,5 secondi.
Bob

@camikiller Vedo 2 valori diversi per nome host vs Condivisione> Nome computer, per favore chiarisci quale usare?
vikramvi

La soluzione migliore è aggiornare il tuo MacOS @vikramvi
camikiller

@camikiller in seguito l'ho fatto per apple.stackexchange.com/questions/66611/… , per avere lo stesso nome ma ancora non funziona. Devo eseguire altre impostazioni in Condivisione?
vikramvi

@vikramvi Prova a modificare manualmente il tuo /etc/hostsfile e aggiungi i 2 host
camikiller

6

Ho lo stesso problema. La mia applicazione di avvio primaverile impiega 60 secondi per avviarsi su Sierra contro 25 secondi su Yosemite.

Durante il debug, mi sono reso conto che il problema deriva da InetAddress.getLocalHost (). Ho cambiato il mio file host per aggiungere il mio hostname per 127.0.0.1 e :: 1 e ora l'applicazione si avvia velocemente come prima.


2
Ciao, ho trovato questa spiegazione di alto livello se aiuta (ma ancora non è chiaro cosa sia cambiato nella versione di MacOS Sierra): "Quando richiedi un nome host, il JDK lo risolve in indirizzi IP. Quindi prova una ricerca inversa di quegli indirizzi e controlla che almeno uno dei risultati sia mappato al nome host di input. È questa ricerca inversa che è lenta. La lentezza non è limitata alla JVM. Qualsiasi cosa sul sistema operativo che tenti di eseguire una ricerca inversa di questo tipo sarà lenta senza configurazione appropriata in / etc / hosts. " (da github.com/spring-projects/spring-boot/issues/7087 )
thoeni

3

Abilitando, ad esempio, Preferenze di Sistema> Condivisione> Accesso remoto, al nome host viene assegnato automaticamente un indirizzo IP.

Poiché le persone vedono problemi dopo l'aggiornamento, ha senso presumere che 10.12 abbia cambiato il modo in cui viene risolto il nome host, cioè almeno con 10.11 il nome host è sempre risolto, mentre con 10.12 viene risolto solo se un servizio è abilitato in Preferenze di Sistema> Condivisione (qualcuno con 10.11 potrebbe confermarlo).


Ho 10.12.5 ma la tua soluzione non ha funzionato. quale versione hai?
vikramvi

@vikramvi Ho 10.12.6 e per la mia installazione le cose funzionano ancora come descritto. Con un file / etc / hosts standard e la condivisione disabilitata, ping $ (nome host) non riesce con un errore host sconosciuto. Con la condivisione abilitata, il nome host viene risolto sull'IP della mia VLAN. Come per Java (8u141), la chiamata a InetAddress.getLocalHost () richiede 5 secondi in caso di condivisione disabilitata. Con la condivisione abilitata, il tempo di esecuzione scende a 13 ms.
jurajw

Funziona (anche se è davvero strano), in pratica anche se "Accesso remoto" era già selezionato, deselezionalo, quindi ricontrollalo. Le cose ricominciano a funzionare. Devi farlo una volta / boot LOL. Nota anche che se hai terminato una volta il processo "mDNS" (in precedenza), dovrai eseguire questo trucco per ripristinare gli indirizzi .local. Oppure usa il modo / etc / hosts per una correzione più permanente
rogerdpack

1

Penso che sia un problema generale con il nuovo sistema operativo. Ho un problema simile: ho un'applicazione web distribuita su Tomcat. Su El Capitan si avviava in 10 secondi, ora ci vogliono 95 secondi e il client (un'app desktop basata su Swing) non riesce a connettersi (o almeno ci è voluto molto tempo). Penso che sia qualcosa che riguarda la comunicazione di rete, perché una semplice app per console di test funziona bene.


1
La disattivazione di SIP risolve il mio problema. macossierra-slow.com/…
Andras Gyetvan,

1

È stato un problema strano dopo l'installazione dell'aggiornamento a Mac Sierra 10.12 (16A323). Nel file hosts con quanto segue ordinato il problema.

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

Puoi ottenere il miohostname tramite comando $hostnameovunque nel terminale.


0

La risposta accettata mi ha aiutato! Aggiungo solo questo qui per spiegare quello che penso che il problema per me fosse:

Il mio nome host era qualcosa come "Il mio Mac" che non poteva essere risolto. Nelle impostazioni mi ha mostrato che il computer potrebbe essere indirizzato con mymac.local

Pensavo fosse lo spazio e ho rinominato il mio mac in "my.mac" ma anche questo non ha aiutato poiché il dns aggiunto automaticamente era ancora mymac.local

L'aggiunta di my.mac a / etc / hosts ha aiutato.

Quindi immagino qual è il vero problema: questo accade solo quando il nome del tuo computer contiene qualcosa che non è una lettera. Questo viene automaticamente rimosso dal sistema operativo e quindi il nome host e la voce DNS non corrispondono. (che può essere risolto aggiungendolo manualmente)


1
Penso che il problema sia più profondo di così ... il mio hostname era composto da normali lettere alfa, ma aggiungerlo a / etc / hosts ha risolto una serie di strani problemi per me
Magnus

0

Ho riscontrato lo stesso problema sul mio Mac.

Quando ho cambiato i miei nomi host principale e Bonjour per contenere solo caratteri alfanumerici, il problema è stato risolto. L'idea è venuta da un collega che aveva letto il consiglio da qualche parte quando stava affrontando un problema simile (non ricordava dove).

Prendendo ispirazione da questa guida questi sono stati i passaggi che ho seguito:

Innanzitutto, cambia il nome host principale

sudo scutil --set HostName <new host name>

per esempio:

sudo scutil --set HostName eggsandwich

Successivamente, cambia il nome host Bonjour (per completezza, non ho mai provato senza questo passaggio, quindi potrebbe non essere necessario).

sudo scutil --set LocalHostName <new host name>

per esempio:

sudo scutil --set LocalHostName eggsandwich

Ora riavvia i processi Java con cui hai avuto problemi e, si spera, non dovrebbero più bloccarsi.

In una nota a margine, questo ha anche risolto un altro problema che avevo in cui una nuova scheda in Terminal non si avviava bash nella stessa directory nonostante le mie preferenze. Non ho spiegazioni sul perché sia ​​successo, ma sono molto soddisfatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.