Eu tenho um pequeno programa Java que executa o loop de InetAddress.getByName ("example.com") a cada segundo. Quando o executo em uma caixa do 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 o executo no Debian 7, vejo que /etc/resolv.conf é aberto repetidamente 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 armazenamento em cache de nomes em execução.
Usei a mesma versão da 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 Debian 7 tem 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?
fonte
Respostas:
Os desenvolvedores glibc do RedHat 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 é de responsabilidade do aplicativo, portanto, todo aplicativo precisará criar sua própria lógica para isso.
Como isso é absolutamente doido, 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, caso contrário, precisará ser reiniciado após uma alteração no resolv.conf. Nos 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, encerrar os servidores DNS antigos e depois ter que reiniciar mais de 1200 servidores mysql. Escusado será dizer que isso não é divertido.
fonte
/etc/resolv.conf
ser relido a cada pesquisa de DNS? É realmente esperado que mude com frequência? Agora, se o comportamento não tiver sido documentado, então eu pude entender ...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 Embedded GLIBC (eglibc
), portanto a implementação real das chamadas do sistema de busca de nomes é completamente diferente.Provavelmente, isso representaria um comportamento diferente de chamada do sistema entre essas duas distribuições.
Eu assumo
InetAddress.getByName
traduz emgetaddrinfo()
. Você pode começar lendo a fonte de cada syscall na implementação e nas versões relevantes da biblioteca CCertifique-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 as versões originais do upstream. Presumo que o mesmo se aplica aos pacotes Debian.
fonte