CentOS和Debian之间的名称解析差异

Modified on: Wed, 18 Sep 2019 12:00:03 +0800

我有一个小的Java程序,它每秒循环调用InetAddress.getByName(“example.com”)。当我使用'strace -f'在CentOS 6.4盒子上运行它时,我看到/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

hosts:files dns

两个系统都没有运行名称缓存守护程序。

我在两台机器上使用相同版本的Oracle HotSot Java JVM来排除任何Java差异。

CentOS 6.4盒子安装了glibc 2.12。 Debian 7盒子安装了glibc 2.13。

两个操作系统在打开和阅读/etc/resolv.conf方面的不同行为是什么原因?

最佳答案

RedHat glibc开发人员认为他们软件中的一些错误不是bug。其中一个错误是更改后重新读取resolv.conf。 glibc认为应用程序的责任,因此每个应用程序都需要为此创建自己的逻辑。

因为这绝对是疯狂的,所以eglibc开发人员已经解决了这个问题。因此,在非eglibc系统上,您的应用程序需要有自己的逻辑来重新初始化nss_dns,否则需要在resolv.conf更改后重新启动它。在eglibc系统(Debian和基于Debian的东西)上,你可以获得更少的错误libc。

我们在更改resolv.conf,退役旧DNS服务器然后重新启动1200+ mysql服务器后发现了这个问题。不用说,这不好玩。


相关问答

添加新评论