У меня есть небольшая программа на Java, которая вызывает InetAddress.getByName ("example.com") каждую секунду. Когда я запускаю его на CentOS 6.4 с помощью strace -f, я вижу, что /etc/resolv.conf открывается и читается один раз:
$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6
Когда я запускаю его в Debian 7, я вижу, что /etc/resolv.conf повторно открывается или 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
В обеих системах файл /etc/nsswitch.conf настроен с
хосты: файлы днс
Ни в одной из систем не запущен демон кэширования имен.
Я использовал одну и ту же версию Java HotSot Java JVM на обеих машинах, чтобы исключить любые различия в Java.
В коробке CentOS 6.4 установлен glibc 2.12. На коробке Debian 7 установлен glibc 2.13.
Чем объясняется разное поведение двух операционных систем в отношении открытия и чтения /etc/resolv.conf?
источник
Ответы:
Разработчики RedHat glibc считают, что некоторые ошибки в их программном обеспечении не являются ошибками. Одна из этих ошибок - перечитывание resolv.conf после изменения. Glibc считает, что ответственность за приложение, поэтому каждое приложение должно создать свою собственную логику для этого.
Поскольку это абсолютно безумно, разработчики eglibc исправили эту проблему. Таким образом, в системах, отличных от eglibc, ваше приложение должно иметь собственную логику для повторной инициализации nss_dns, иначе его нужно будет перезапустить после изменения resolv.conf. В системах eglibc (Debian и другие, основанные на Debian) вы получаете менее глючный libc.
Мы нашли это нелегким путем после изменения resolv.conf, вывода из эксплуатации старых DNS-серверов и последующей перезагрузки 1200+ серверов mysql. Излишне говорить, что это не весело.
источник
/etc/resolv.conf
перечитывать при каждом поиске DNS? Это действительно должно измениться так часто? Теперь, если бы поведение было без документов, тогда я мог бы понять ...Различаются не только версии библиотеки C, но CentOS использует библиотеку GNU C (
glibc
), в то время как Debian использует встроенную GLIBC (eglibc
), поэтому фактическая реализация системных вызовов поиска имен совершенно иная.Это, вероятно, объясняет разное поведение системных вызовов между этими двумя дистрибутивами.
Я полагаю,
InetAddress.getByName
переводится вgetaddrinfo()
. Вы могли бы начать с чтения источника каждого системного вызова в соответствующей реализации библиотеки C и ее версиях.Убедитесь, что вы читаете исходный код из фактических версий пакетов, которые вы используете. У пакетов в EL 6.4 было сделано более 2 лет улучшений по сравнению с их исходными версиями. Я предполагаю, что то же самое верно для пакетов Debian.
источник