Mam mały program Java, który co sekundę zapętla wywołanie InetAddress.getByName („example.com”). Kiedy uruchamiam go na polu CentOS 6.4 za pomocą 'strace -f', widzę, że /etc/resolv.conf jest otwarty i czytam raz:
$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6
Kiedy uruchamiam go na Debianie 7, widzę, że plik /etc/resolv.conf jest wielokrotnie otwierany lub 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
Oba systemy mają skonfigurowane /etc/nsswitch.conf
hosts: pliki dns
Żaden system nie ma uruchomionego demona buforowania nazw.
Użyłem tej samej wersji JVM Oracle HotSot Java na obu komputerach, aby wykluczyć wszelkie różnice w Javie.
W pudełku CentOS 6.4 zainstalowano glibc 2.12. Debian 7 ma zainstalowany glibc 2.13.
Co tłumaczy odmienne zachowanie obu systemów operacyjnych w odniesieniu do otwierania i czytania /etc/resolv.conf?
źródło
Odpowiedzi:
Programiści glibc RedHat uważają, że niektóre błędy w ich oprogramowaniu nie są błędami. Jednym z tych błędów jest ponowne czytanie resolv.conf po zmianie. glibc uważa, że to odpowiedzialność aplikacji, więc każda aplikacja będzie musiała stworzyć własną logikę.
Ponieważ jest to absolutnie szalone, programiści eglibc naprawili ten problem. Tak więc w systemach innych niż eglibc aplikacja będzie musiała mieć własną logikę ponownego inicjowania nss_dns, w przeciwnym razie konieczne będzie jej ponowne uruchomienie po zmianie resolv.conf. W systemach eglibc (Debian i rzeczy oparte na Debianie) otrzymujesz mniej błędów libc.
Dowiedzieliśmy się tego na własnej skórze po zmianie resolv.conf, wycofaniu starych serwerów DNS, a następnie ponownym uruchomieniu ponad 1200 serwerów mysql. Nie trzeba dodawać, że to nie jest zabawne.
źródło
/etc/resolv.conf
ponownie czytać przy każdym wyszukiwaniu DNS? Czy naprawdę należy się tak często zmieniać? Teraz, jeśli zachowanie nie zostało udokumentowane, wtedy mogłem zrozumieć ...Nie tylko wersje bibliotek C są różne, ale CentOS używa biblioteki GNU C (
glibc
), podczas gdy Debian używa Embedded GLIBC (eglibc
), więc rzeczywista implementacja wywołań systemowych wyszukiwania nazw jest zupełnie inna.To prawdopodobnie tłumaczyłoby różne zachowanie wywołania systemowego między tymi dwiema dystrybucjami.
Zakładam, że
InetAddress.getByName
przekłada się nagetaddrinfo()
. Możesz zacząć od przeczytania źródła każdego wywołania systemowego w odpowiedniej implementacji i wersjach biblioteki C.Upewnij się, że czytasz źródło z aktualnie używanych wersji pakietu. W pakietach w wersji EL 6.4 wprowadzono ponad 2-letnie udoskonalenia w porównaniu z ich oryginalnymi wersjami wcześniejszymi. Zakładam, że to samo dotyczy pakietów Debiana.
źródło