Jvm tarda mucho en resolver la dirección IP de localhost

112

Parece que tengo un problema con el rendimiento de la "prueba sbt" (que incluye buscar nombres de host local / direcciones IP) después de actualizar a macOS Sierra. En una versión anterior de OS X, tardó entre 40 y 50 segundos en finalizar. Los tiempos de macOS Sierra son mucho más altos que eso. La última carrera que hice fue de unos 15 minutos. Los tiempos de compilación son aproximadamente los mismos que en 'El Capitán'.

Soy el único de mi equipo que ha probado este nuevo macOS, por lo que no puedo saber si solo está sucediendo en mi mac o si es un problema universal.

Mi colega tuvo un problema similar en Ubuntu y estaba relacionado con la generación de números aleatorios que ralentizaba las pruebas - Tiempos de respuesta de servicio lentos: Java SecureRandom y / dev / random

Desafortunadamente, eso no funcionó para mí. Originalmente probé eso en JDK 8u54 y luego intenté actualizar a JDK 8u102 y eso tampoco ayudó.

PD: Estoy usando Macbook Pro Mid-2015 2.8GHz i7, 16GB de ram, 1TB SSD.

Tomasz Mikuś
fuente
Estoy usando gradle clean testy tengo el mismo problema.
Max Peng
Este es el error informado a OpenJDK: bugs.openjdk.java.net/browse/JDK-8143378 Se ha resuelto como un duplicado de otro error que no se solucionará. Probablemente debería reabrirse.
Lóránt Pintér

Respuestas:

326

Yo tuve el mismo problema. Tomcat pasó de 15 segundos a 6 minutos para inicializar el contexto de primavera después de la actualización ... deshabilitar csrutils no resolvió el problema por mí.

Me solucionó el problema mediante la adición de mi nombre de host Mac (es decir Macbook.local, o lo que su Mac se llama) en el /etc/hostsarchivo asignado a la 127.0.0.1dirección, así como la ::1siguiente manera:

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

Si está interesado, puede encontrar algunos detalles sobre el problema y la solución aquí: https://thoeni.io/post/macos-sierra-java/

En la publicación también me vinculo a un proyecto de github para ayudar a solucionar el problema y validar la solución.

El problema está relacionado (creo) con cómo funciona la resolución de nombres de localhost y cómo la clase java.net.InetAddr está recuperando las direcciones. Verifiqué con algunos colegas y aparentemente no les pasa a todos los que se actualizaron a Sierra, pero todavía estoy investigando las raíces de este cambio.

De todos modos, la solución fue la misma que implementó antid0te y funcionó de inmediato.

thoeni
fuente
El mismo problema ... Y puedo confirmar que deshabilitar SIP tampoco funcionó para mí.
borges
Genial, funciona, puedes consultar con el proyecto github github.com/thoeni/inetTester
christmo
21
¡Lo encontré! No es el nombre de Mac ... Su nombre de host. Al escribir "nombre de host" en la terminal, puede dar el nombre de host correcto.
VK321
1
Todavía veo esto en OSX 10.14.2, años después. Muchas gracias por la solución.
Malcolm Crum
1
macOS Mojave 10.14.4, sigue siendo un problema. ¡La adición del nombre de host después localhostde las líneas de loopback de IPv4 e IPv6 ( 127.0.0.1, ::1) aún se verificó como solución!
Perro
43

Respuesta correcta: Jvm tarda mucho en resolver la dirección IP de localhost

Para los perezosos:

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
fuente
4
¡Increíble! Esto aumentó el tiempo de lanzamiento de mi Minecraft de 12 segundos a 0,5 segundos.
Bob
@camikiller Estoy viendo 2 valores diferentes para el nombre de host vs Compartir> Nombre de la computadora, por favor aclare cuál usar.
vikramvi
Una mejor solución es actualizar su MacOS @vikramvi
camikiller
@camikiller más tarde lo hice por apple.stackexchange.com/questions/66611/… , para tener el mismo nombre pero aún no funciona. ¿Necesito realizar alguna otra configuración en Compartir?
vikramvi
@vikramvi Intente editar manualmente su /etc/hostsarchivo y agregue los 2 hosts
camikiller
6

Tengo el mismo problema. Mi aplicación de arranque de primavera tarda 60 segundos en iniciarse en Sierra frente a 25 segundos en Yosemite.

Mientras depuraba, me di cuenta de que el problema proviene de InetAddress.getLocalHost (). Cambié mi archivo de host para agregar mi nombre de host para 127.0.0.1 y :: 1 y ahora la aplicación se inicia tan rápido como antes.

Antid0te
fuente
2
Hola, encontré esta explicación de alto nivel si ayuda (pero aún no está claro qué cambió en la versión MacOS Sierra): "Cuando solicitas un nombre de host, el JDK lo resuelve en direcciones IP. Luego intenta una búsqueda inversa de esas direcciones y comprueba que al menos uno de los resultados se asigne al nombre del host de entrada. Es esta búsqueda inversa la que es lenta. La lentitud no se limita a la JVM. Cualquier cosa en el sistema operativo que intente realizar dicha búsqueda inversa será lenta sin configuración apropiada en / etc / hosts. " (de github.com/spring-projects/spring-boot/issues/7087 )
thoeni
3

Habilitar, por ejemplo, Preferencias del sistema> Compartir> Inicio de sesión remoto, da como resultado que al nombre de host se le asigne automáticamente una dirección IP.

Como las personas están viendo problemas después de la actualización, tiene sentido asumir que 10.12 cambió la forma en que se resuelve el nombre de host, es decir, al menos con 10.11 el nombre de host siempre se resuelve, mientras que con 10.12 se resuelve solo si un servicio está habilitado en Preferencias del sistema> Compartir (alguien con 10.11 podría confirmar esto).

jurajw
fuente
Tengo 10.12.5 pero tu solución no funcionó. Qué versión tienes ?
vikramvi
@vikramvi Tengo 10.12.6 y para mi instalación las cosas todavía funcionan como se describe. Con un archivo estándar / etc / hosts y el uso compartido desactivado, el ping $ (nombre de host) falla con un error de host desconocido. Con el uso compartido habilitado, el nombre de host se resuelve en la IP de mi VLAN. En cuanto a Java (8u141), llamar a InetAddress.getLocalHost () tarda 5 segundos en caso de que el uso compartido esté desactivado. Con el uso compartido habilitado, el tiempo de ejecución se reduce a 13 ms.
jurajw
Esto funciona (aunque es realmente extraño), básicamente incluso si "Inicio de sesión remoto" ya estaba marcado, desmárquelo y vuelva a marcarlo. Las cosas empiezan a funcionar de nuevo. Tienes que hacerlo una vez / boot LOL. Tenga en cuenta también que si alguna vez ha matado el proceso "mDNS" (anteriormente), necesitará hacer este truco para recuperar las direcciones .local. O use la forma / etc / hosts para una solución más permanente
rogerdpack
1

Creo que es un problema generalizado con el nuevo sistema operativo. Tengo un problema similar: tengo una aplicación web que está implementada en tomcat. En El Capitán se inició en 10 segundos, ahora toma 95 segundos y el cliente (una aplicación de escritorio basada en Swing) no puede conectarse a él (o al menos tomó mucho tiempo). Creo que es algo relacionado con la comunicación en red, porque una aplicación de consola de prueba simple funciona bien.

Andras Gyetvan
fuente
1
Apagar SIP resuelve mi problema. macossierra-slow.com/…
Andras Gyetvan
1

Fue un problema extraño después de instalar la actualización en Mac Sierra 10.12 (16A323). En el archivo de hosts con lo siguiente se solucionó el problema.

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

Puede obtener myhostname mediante un comando $hostnameen cualquier lugar de la terminal.

Sidd Gautama
fuente
0

¡La respuesta aceptada me ayudó! Solo agrego esto aquí explicando cuál creo que fue el problema para mí:

Mi nombre de host era algo así como "Mi Mac" que no se pudo resolver. En la configuración, me mostró que la computadora podría direccionarse con mymac.local

Pensé que era el espacio y renombré mi mac a "my.mac" pero ni siquiera esto ayudó, ya que el dns agregado automáticamente seguía siendo mymac.local

Agregar my.mac a / etc / hosts ayudó entonces.

Entonces, supongo cuál es el problema real: esto solo sucede cuando el nombre de su computadora contiene algo que no sea una letra. Esto es eliminado automáticamente por el sistema operativo y luego el nombre de host y la entrada dns no coinciden. (que se puede arreglar si lo agrego manualmente)

Arne
fuente
1
Creo que el problema es más profundo que eso ... mi nombre de host tenía todas las letras alfa normales, pero agregarlo a / etc / hosts resolvió una serie de problemas extraños para mí
Magnus
0

Experimenté el mismo problema en mi Mac.

Cuando cambié mis nombres de host principal y Bonjour para que solo contengan caracteres alfanuméricos, se resolvió el problema. La idea vino de un colega que había leído el consejo en alguna parte cuando se enfrentaba a un problema similar (no recordaba dónde).

Inspirándome en esta guía, estos fueron los pasos que seguí:

Primero, cambie el nombre de host principal

sudo scutil --set HostName <new host name>

p.ej:

sudo scutil --set HostName eggsandwich

A continuación, cambie el nombre de host de Bonjour (para completar, nunca lo intenté sin este paso, por lo que podría ser que no sea necesario).

sudo scutil --set LocalHostName <new host name>

p.ej:

sudo scutil --set LocalHostName eggsandwich

Ahora reinicie los procesos de Java con los que tenía problemas y, con suerte, ya no deberían bloquearse.

En una nota al margen, esto también resolvió otro problema que tuve donde una nueva pestaña en Terminal no iniciaba bash en el mismo directorio a pesar de mis preferencias. No tengo una explicación de por qué sucedió eso, pero estoy muy contento.

Erik Madsen
fuente