Разница в разрешении имен между CentOS и Debian

13

У меня есть небольшая программа на 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?

user1311618
источник
Можете ли вы вставить пастин полные следы.
Данила Ладнер

Ответы:

10

Разработчики RedHat glibc считают, что некоторые ошибки в их программном обеспечении не являются ошибками. Одна из этих ошибок - перечитывание resolv.conf после изменения. Glibc считает, что ответственность за приложение, поэтому каждое приложение должно создать свою собственную логику для этого.

Поскольку это абсолютно безумно, разработчики eglibc исправили эту проблему. Таким образом, в системах, отличных от eglibc, ваше приложение должно иметь собственную логику для повторной инициализации nss_dns, иначе его нужно будет перезапустить после изменения resolv.conf. В системах eglibc (Debian и другие, основанные на Debian) вы получаете менее глючный libc.

Мы нашли это нелегким путем после изменения resolv.conf, вывода из эксплуатации старых DNS-серверов и последующей перезагрузки 1200+ серверов mysql. Излишне говорить, что это не весело.

Деннис Каарсемакер
источник
Почему это считается "абсолютно помешанным"? И почему glibc сделал это так?
Майкл Хэмптон
1
Потому что вместо того, чтобы исправлять glibc, они возлагают бремя на каждое приложение ... Что, почему они это делают? Я не знаю. Я не могу читать мысли Дрэпперов, и я не уверен, что хочу знать, что там происходит ...
Деннис Каарсемакер
1
Дело в том, что я не уверен, что glibc действительно сломан. Почему нужно /etc/resolv.confперечитывать при каждом поиске DNS? Это действительно должно измениться так часто? Теперь, если бы поведение было без документов, тогда я мог бы понять ...
Майкл Хэмптон
1
Это не перечитывается при каждом поиске, что также будет нарушено :) Поведение недокументировано и действительно противоречит интуиции: glibc берет на себя ответственность за инициализацию библиотеки nss_dns, но впоследствии делает приложение ответственным за ее повторную инициализацию, даже если эти приложения этого не делают. Что-нибудь знать о NSS и как это работает. Как это не помешанные?
Деннис Каарсемакер
1
Деннис прав, гей в EL6 намеренно нарушен, потому что ошибочное поведение стало «ожидаемым поведением» - access.redhat.com/site/solutions/541163
suprjami
4

Различаются не только версии библиотеки C, но CentOS использует библиотеку GNU C ( glibc), в то время как Debian использует встроенную GLIBC ( eglibc), поэтому фактическая реализация системных вызовов поиска имен совершенно иная.

Это, вероятно, объясняет разное поведение системных вызовов между этими двумя дистрибутивами.

Я полагаю, InetAddress.getByNameпереводится в getaddrinfo(). Вы могли бы начать с чтения источника каждого системного вызова в соответствующей реализации библиотеки C и ее версиях.

Убедитесь, что вы читаете исходный код из фактических версий пакетов, которые вы используете. У пакетов в EL 6.4 было сделано более 2 лет улучшений по сравнению с их исходными версиями. Я предполагаю, что то же самое верно для пакетов Debian.

suprjami
источник