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 服务器后,我们发现了这一点。不用说,这并不好玩。
归档时间: |
|
查看次数: |
625 次 |
最近记录: |