【发布时间】:2012-02-13 09:33:45
【问题描述】:
我们的应用程序 (RHEL 5/c++) 使用 gethostid 返回的 hostid 进行日志记录。由于某种原因,本地网络环境的主 DNS 服务器下线。这导致gethostid 出现大量问题:函数调用挂起超过 60 秒,导致我们的应用程序内部超时。几分钟后,在命令行上对hostid 的调用也没有返回。一旦 DNS 服务器再次启动,应用程序和 hostid 命令行工具中的超时/问题就会消失。
我的问题是:如何防止 gethostid 进行 DNS 查找?答案有一些边界条件:
- 文件
/etc/hostid不得存在。 - 不允许拨打
sethostid。 - 无法更改
/etc/hosts。
我很惊讶会发生这种情况。据我了解gethostid 它是这样工作的:
- 如果是手动设置的,则返回最后一个
sethostid的值。 - 如果文件存在,则以 /etc/hostid 形式返回 hostid。
- 如果已设置,则返回主机的主 IP。
- 其他情况失败。
我认为不需要 DNS 查询。
要验证 gethostid 实际上是否依赖于正常工作的 DNS 服务器,请尝试以下操作:
- 以 root 身份创建/更改您的 /etc/reslov.conf,使其仅包含无效的
nameserver条目。 - 在命令行调用
hostid。
在我的 debian/squeeze 安装中,这会导致主机 ID 为 00000000,而没有任何挂起。我假设 hostid 的 RedHat 版本不同/较旧,结果挂起。
【问题讨论】:
-
一些我忘记的小细节:
/etc/nsswitch.conf包含hosts: files dns。系统主 IP 的主机名不在/etc/hosts中。这是由设计和客户要求决定的。 -
只是从
/etc/nsswitch.conf中删除dns是一个可接受的解决方案吗? -
我不这么认为。这将阻止所有 DNS 查找,对吗?绝对是不受欢迎的副作用。