为什么我的JVM应用程序会间歇性地解析主机名,就像它们不是绝对的一样?

时间:2014-06-30 13:39:13

标签: java linux dns jvm

几个星期前,我开始看到在ec2 Centos盒子上运行的JVM应用程序记录了间歇性的UnknownHostExceptions。 dnstop显示1%到10%之间的错误频率。这个错误似乎是由这个特定应用程序不常见的负载触发的,尽管与我们部署的其他平滑运行的应用程序相比,这并不罕见(我能以任何方式看到)。

tcpdump显示来自DNS服务器的NXDomain响应是准确的:错误是由应用程序间歇性地解析主机名引起的,就好像它们不是绝对的一样。例如,当连接到www.example.com时,应用程序通常会发送DNS查询以了解www.example.com的地址。这些查询成功。间歇性地,在1%到10%的时间内,应用程序尝试解析www.example.com.foo.mycompany.com,其中foo.mycompany.com是/ etc / resolv的搜索部分中的唯一条目托管应用程序的盒子上的.conf。当应用程序执行此操作时,DNS服务器将使用NXDomain进行响应,并抛出UnknownHostException。当发生这种情况时,应用程序不会尝试以任何其他方式解析名称:它会进行单个DNS查询,然后抛出异常。

还有其他人经历过这个吗?为什么会这样?有修复吗?目前我们似乎通过从resolv.conf中删除搜索域来解决问题,但它并不是一个令人满意的解决方案。

有关好奇的更多信息:resolv.conf的手册页指示当点数小于可配置阈值时,应将主机名解析为非绝对主机名。默认值为1,并且在这些框中不会覆盖它,这就是为什么www.example.com(有两个点)通常被解析为绝对主机名的原因。如果我要运行" ssh bar",ssh进程会认为bar不是绝对的主机名,所以它会参考/etc/resolv.conf中的搜索路径并假设我试图ssh到bar.foo.mycompany.com。如果我要运行" ssh bar.example.com",ssh进程会将该参数识别为绝对主机名,并且尝试解析bar.example.com .foo.mycompany.com。

编辑:输出java -version:

java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode, sharing)

0 个答案:

没有答案