Diferencia de resolución de nombres entre CentOS y Debian

13

Tengo un pequeño programa Java que realiza un bucle que llama a InetAddress.getByName ("example.com") cada segundo. Cuando lo ejecuto en un cuadro de CentOS 6.4 usando 'strace -f' veo que /etc/resolv.conf se abre y lee una vez:

$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6

Cuando lo ejecuto en Debian 7 veo que /etc/resolv.conf se abre repetidamente o stat () 'd:

$ grep  /etc/resolv.conf strace.out
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0

Ambos sistemas tienen /etc/nsswitch.conf configurado con

hosts: archivos dns

Ninguno de los dos sistemas tiene un demonio de almacenamiento en caché de nombres en ejecución.

Utilicé la misma versión de Oracle HotSot Java JVM en ambas máquinas para descartar cualquier diferencia de Java.

La caja CentOS 6.4 tiene instalado glibc 2.12. La caja Debian 7 tiene glibc 2.13 instalado.

¿Qué explica el comportamiento diferente entre los dos sistemas operativos con respecto a abrir y leer /etc/resolv.conf?

usuario1311618
fuente
¿Puedes por favor pegar rastros completos?
Danila Ladner

Respuestas:

10

Los desarrolladores de RedHat glibc consideran que algunos errores en su software no son errores. Uno de estos errores es la relectura de resolv.conf después de cambiar. glibc considera que es responsabilidad de la aplicación, por lo que todas y cada una de las aplicaciones necesitarán crear su propia lógica para esto.

Debido a que esto es absolutamente loco, los desarrolladores de eglibc han solucionado este problema. Entonces, en sistemas que no sean eglibc, su aplicación necesitará tener su propia lógica para reinicializar nss_dns, o de lo contrario deberá reiniciarse después de un cambio resolv.conf. En los sistemas eglibc (Debian y cosas basadas en Debian), obtienes una libc con menos errores.

Descubrimos esto de la manera difícil después de cambiar resolv.conf, desmantelar viejos servidores DNS y luego tener que reiniciar más de 1200 servidores mysql. No hace falta decir que esto no es divertido.

Dennis Kaarsemaker
fuente
¿Por qué esto se considera "absolutamente loco"? ¿Y por qué glibc lo hizo de esta manera?
Michael Hampton
1
Porque en lugar de arreglar glibc, ponen la carga en cada aplicación ... ¿Por qué lo hacen? No lo sé. No puedo leer la mente de Dreppers, y no estoy seguro de querer saber qué sucede allí ...
Dennis Kaarsemaker
1
La cuestión es: no estoy seguro de que glibc esté realmente roto. ¿Por qué se debe /etc/resolv.confvolver a leer en cada búsqueda de DNS? ¿Realmente se espera que cambie eso con frecuencia? Ahora, si el comportamiento era indocumentado, entonces podría entender ...
Michael Hampton
1
No se vuelve a leer en cada búsqueda, eso también se rompería :) El comportamiento es indocumentado y realmente contradictorio: glibc se encarga de inicializar la biblioteca nss_dns, pero luego hace que la aplicación sea responsable de reinicializarla, aunque esas aplicaciones no saber algo sobre nss y cómo funciona. ¿Cómo es que no son locos?
Dennis Kaarsemaker
1
Dennis es correcto, gai en EL6 se rompe intencionadamente debido a que el comportamiento incorrecto se ha convertido en el "comportamiento esperado" - access.redhat.com/site/solutions/541163
suprjami
4

No solo las versiones de la biblioteca C son diferentes, sino que CentOS usa la biblioteca GNU C ( glibc) mientras que Debian usa Embedded GLIBC ( eglibc), por lo que la implementación real de las llamadas al sistema de búsqueda de nombres es completamente diferente.

Eso probablemente explicaría el comportamiento diferente de las llamadas al sistema entre estas dos distribuciones.

Supongo que se InetAddress.getByNametraduce en getaddrinfo(). Puede comenzar leyendo la fuente de cada llamada al sistema en la implementación y las versiones relevantes de la biblioteca C.

Asegúrese de leer la fuente de las versiones reales del paquete que está utilizando. Los paquetes en EL 6.4 han tenido más de 2 años de mejoras realizadas en comparación con sus versiones originales originales. Supongo que lo mismo es cierto para los paquetes de Debian.

suprjami
fuente