Saya memiliki program Java kecil yang loop memanggil InetAddress.getByName ("example.com") setiap detik. Ketika saya menjalankannya pada kotak CentOS 6.4 menggunakan 'strace -f' saya melihat bahwa /etc/resolv.conf dibuka dan dibaca sekali:
$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6
Ketika saya menjalankannya di Debian 7 saya melihat bahwa /etc/resolv.conf berulang kali dibuka atau 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
Kedua sistem memiliki konfigurasi /etc/nsswitch.conf
host: file dns
Sistem tidak memiliki daemon caching nama yang berjalan.
Saya menggunakan versi yang sama dari Oracle HotSot Java JVM pada kedua mesin untuk menyingkirkan perbedaan Java.
Kotak CentOS 6.4 telah menginstal glibc 2.12. Kotak Debian 7 telah menginstal glibc 2.13.
Apa yang menyebabkan perilaku yang berbeda antara kedua sistem operasi sehubungan dengan membuka dan membaca /etc/resolv.conf?
sumber
Jawaban:
Pengembang RedHat glibc menganggap beberapa bug dalam perangkat lunak mereka bukan bug. Salah satu bug ini adalah membaca ulang resolv.conf setelah diubah. glibc menganggap bahwa tanggung jawab aplikasi, sehingga setiap aplikasi perlu membuat logikanya sendiri untuk ini.
Karena ini benar-benar gila, pengembang eglibc telah memperbaiki masalah ini. Jadi pada sistem non-eglibc, aplikasi Anda harus memiliki logikanya sendiri untuk menginisialisasi ulang nss_dns, jika tidak, aplikasi tersebut harus di-restart setelah perubahan resolv.conf. Pada sistem eglibc (Debian dan hal-hal berdasarkan Debian), Anda mendapatkan libc yang kurang buggy.
Kami menemukan ini dengan cara yang sulit setelah mengubah resolv.conf, menonaktifkan server DNS lama dan kemudian harus me-restart 1200+ server mysql. Tidak perlu dikatakan, ini tidak menyenangkan.
sumber
/etc/resolv.conf
dibaca ulang di setiap pencarian DNS? Apakah ini benar-benar diharapkan untuk berubah sesering itu? Sekarang jika perilaku itu tidak berdokumen maka saya bisa mengerti ...Tidak hanya versi pustaka C yang berbeda, tetapi CentOS menggunakan pustaka GNU C (
glibc
) sedangkan Debian menggunakan Embedded GLIBC (eglibc
), sehingga implementasi sebenarnya dari panggilan pemanggilan nama sistem sama sekali berbeda.Itu mungkin akan menjelaskan perilaku sistem panggilan yang berbeda antara kedua distribusi ini.
Saya menganggap
InetAddress.getByName
diterjemahkan ke dalamgetaddrinfo()
. Anda bisa mulai dengan membaca sumber setiap syscall di implementasi dan versi C library yang relevan.Pastikan Anda membaca sumber dari versi paket aktual yang Anda gunakan. Paket-paket dalam EL 6.4 telah mengalami perbaikan lebih dari 2 tahun dibandingkan dengan versi hulu aslinya. Saya berasumsi hal yang sama berlaku untuk paket Debian.
sumber