Ich habe ein kleines Java-Programm, das jede Sekunde InetAddress.getByName ("example.com") aufruft. Wenn ich es mit 'strace -f' auf einer CentOS 6.4-Box ausführe, sehe ich, dass /etc/resolv.conf einmal geöffnet und gelesen wird:
$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6
Wenn ich es unter Debian 7 starte, sehe ich, dass /etc/resolv.conf wiederholt geöffnet wird oder 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
Beide Systeme haben /etc/nsswitch.conf mit konfiguriert
Hosts: Dateien DNS
Auf keinem System wird ein Name-Caching-Daemon ausgeführt.
Ich habe auf beiden Computern dieselbe Version der Oracle HotSot Java JVM verwendet, um Java-Unterschiede auszuschließen.
Auf der CentOS 6.4-Box ist glibc 2.12 installiert. Auf der Debian 7-Box ist glibc 2.13 installiert.
Was erklärt das unterschiedliche Verhalten der beiden Betriebssysteme beim Öffnen und Lesen von /etc/resolv.conf?
quelle
Antworten:
Die RedHat glibc-Entwickler betrachten einige Fehler in ihrer Software nicht als Fehler. Einer dieser Fehler ist das erneute Lesen der resolv.conf nach einer Änderung. glibc ist der Ansicht, dass die Verantwortung bei der Anwendung liegt. Daher muss jede Anwendung ihre eigene Logik dafür erstellen.
Da dies absolut verrückt ist, haben die Eglibc-Entwickler dieses Problem behoben. Auf Nicht-Eglibc-Systemen muss Ihre Anwendung eine eigene Logik für die Neuinitialisierung von nss_dns haben, oder sie muss nach einer Änderung von resolv.conf neu gestartet werden. Auf eglibc-Systemen (Debian und auf Debian basierende Dinge) erhalten Sie eine weniger fehlerhafte libc.
Wir haben dies auf die harte Tour herausgefunden, nachdem wir die resolv.conf geändert, alte DNS-Server außer Betrieb genommen und anschließend mehr als 1200 mysql-Server neu gestartet haben. Das macht natürlich keinen Spaß.
quelle
/etc/resolv.conf
bei jedem DNS-Lookup erneut gelesen werden? Wird es wirklich erwartet, dass sich das häufig ändert? Wenn das Verhalten undokumentiert wäre, könnte ich verstehen ...Nicht nur die C-Bibliotheksversionen unterscheiden sich, CentOS verwendet auch die GNU C-Bibliothek (
glibc
), während Debian Embedded GLIBC (eglibc
) verwendet, so dass die tatsächliche Implementierung der Systemaufrufe für die Namenssuche völlig unterschiedlich ist.Dies würde wahrscheinlich ein unterschiedliches Systemaufrufverhalten zwischen diesen beiden Verteilungen erklären.
Ich nehme an,
InetAddress.getByName
übersetzt ingetaddrinfo()
. Sie können damit beginnen, die Quelle jedes Systemaufrufs in der entsprechenden C-Bibliotheksimplementierung und -version zu lesen.Stellen Sie sicher, dass Sie den Quellcode der tatsächlich verwendeten Paketversionen lesen. Die Pakete in EL 6.4 wurden über 2 Jahre lang im Vergleich zu ihren ursprünglichen Upstream-Versionen verbessert. Ich gehe davon aus, dass dies auch für die Debian-Pakete gilt.
quelle