CentOS 和 Debian 的名称解析差异

use*_*618 13 domain-name-system debian redhat

我有一个小的 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
Run Code Online (Sandbox Code Playgroud)

当我在 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
Run Code Online (Sandbox Code Playgroud)

两个系统都配置了 /etc/nsswitch.conf

主机:文件 dns

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

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

CentOS 6.4 机器安装了 glibc 2.12。Debian 7 box 安装了 glibc 2.13。

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

Den*_*ker 10

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

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

在更改 resolv.conf、停用旧的 DNS 服务器然后不得不重新启动 1200 多个 mysql 服务器后,我们发现了这一点。不用说,这并不好玩。