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?
fuente
Respuestas:
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.
fuente
/etc/resolv.conf
volver 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 ...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.getByName
traduce engetaddrinfo()
. 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.
fuente