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

13

Eu tenho um pequeno programa Java que faz um loop chamando InetAddress.getByName ("example.com") a cada segundo. Quando eu executo em uma caixa do CentOS 6.4 usando 'strace -f' eu 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 eu executo no Debian 7 eu vejo que /etc/resolv.conf é repetidamente aberto ou 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 os sistemas têm o /etc/nsswitch.conf configurado com

hosts: arquivos dns

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

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

A caixa CentOS 6.4 possui o glibc 2.12 instalado. A caixa 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 de /etc/resolv.conf?

    
por user1311618 21.12.2013 / 01:25

2 respostas

10

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

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

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

    
por 24.12.2013 / 15:27
4

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

Isso provavelmente levaria em conta o comportamento diferente de chamadas do sistema entre essas duas distribuições.

Suponho que InetAddress.getByName seja traduzido em getaddrinfo() . Você pode começar lendo a origem 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 feitas em comparação com suas versões originais originais. Eu presumo que o mesmo seja verdade para os pacotes Debian.

    
por 24.12.2013 / 15:03