Diferença de resolução de nomes entre CentOS e Debian

Diferença de resolução de nomes entre CentOS e Debian

Eu tenho um pequeno programa Java que faz um loop chamando InetAddress.getByName("example.com") a cada segundo. Quando o executo em uma caixa CentOS 6.4 usando 'strace -f', vejo que /etc/resolv.conf é aberto e lido uma vez:

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

Quando executo no Debian 7, vejo que /etc/resolv.conf é aberto repetidamente ou stat():

$ 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 os sistemas possuem /etc/nsswitch.conf configurado com

hosts: arquivos DNS

Nenhum dos sistemas possui um daemon de cache de nomes em execução.

Usei a mesma versão do Oracle HotSot Java JVM em ambas as máquinas para descartar quaisquer diferenças de Java.

A caixa do CentOS 6.4 possui o glibc 2.12 instalado. A caixa do Debian 7 possui o glibc 2.13 instalado.

O que explica o comportamento diferente entre os dois sistemas operacionais em relação à abertura e leitura do /etc/resolv.conf?

Responder1

Os desenvolvedores do RedHat glibc consideram que alguns bugs em seu software não são bugs. Um desses bugs é a releitura do resolv.conf após a alteração. A glibc considera isso de responsabilidade da aplicação, portanto cada aplicação precisará criar sua própria lógica para isso.

Como isso é absolutamente maluco, os desenvolvedores do eglibc corrigiram esse problema. Portanto, em sistemas não-eglibc, seu aplicativo precisará ter sua própria lógica para reinicializar o nss_dns, ou então precisará ser reiniciado após uma alteração no resolv.conf. Em sistemas eglibc (Debian e coisas baseadas no Debian), você obtém uma libc com menos bugs.

Descobrimos isso da maneira mais difícil depois de alterar o resolv.conf, desativando servidores DNS antigos e tendo que reiniciar mais de 1200 servidores mysql. Escusado será dizer que isso não é divertido.

Responder2

Não apenas as versões da biblioteca C são diferentes, mas o CentOS usa a biblioteca GNU C ( glibc) enquanto o Debian usa Embedded GLIBC ( eglibc), então a implementação real das chamadas do sistema de pesquisa de nome é completamente diferente.

Isso provavelmente explicaria o comportamento diferente das chamadas de sistema entre essas duas distribuições.

Presumo que InetAddress.getByNamese traduz em getaddrinfo(). Você pode começar lendo a fonte de cada syscall na implementação e nas versões relevantes da biblioteca C.

Certifique-se de ler a fonte das versões reais do pacote que você está usando. Os pacotes no EL 6.4 tiveram mais de 2 anos de melhorias em comparação com suas versões originais do upstream. Presumo que o mesmo aconteça com os pacotes Debian.

informação relacionada