Java 的‘tnameserv’需要 3 多分钟才能“准备就绪”,为什么?

Java 的‘tnameserv’需要 3 多分钟才能“准备就绪”,为什么?

我正在尝试帮助我想使用的应用程序的开发人员解决使用 Linux 上的 Corba Server 的问题。我将问题缩小到tnameserv调用后需要 3 分钟以上才能准备就绪。

这 3 分钟究竟在做什么tnameserv?有什么办法可以加快速度?应用程序失败是因为它尝试进行 5 次连接尝试,每次重试间隔 1 秒;这显然没有给 tnameserv 足够的时间来准备就绪。我在 Slackware 13.0 上使用 Java 6u17

以防万一。实际调用tnameserv如下:

tnameserv -ORBInitialPort 23423

在 shell 中运行该命令后,它似乎挂起了,直到大约 3 分钟后我才终于看到它显示“就绪”。

更新

我做了一个strace -f tnameserv -ORBInitialPort 23423,看到大量对 gettimeofday()、clock_gettime() 和 futex() 的调用,其中后者总是返回 '-1 ETIMEDOUT(连接超时)。我感觉这与我的问题有关,但我不知道如何或为什么。

这只是我从 strace 中看到的一小部分。有人可以复制和/或理解这一点吗?

[pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49903084}) = -1 ETIMEDOUT (连接超时)
[pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329619,995857482}) = 0
[pid 30950] gettimeofday({1260930158, 92108}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329619,995996617}) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329619,996088536}) = 0
[pid 30950] gettimeofday({1260930158, 92328}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_REALTIME,{1260930158,92424295}) = 0
[pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49903705}) = -1 ETIMEDOUT (连接超时)
[pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,46761098}) = 0
[pid 30950] gettimeofday({1260930158, 143084}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,46913924}) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,47006961}) = 0
[pid 30950] gettimeofday({1260930158, 143303}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_REALTIME,{1260930158,143398317}) = 0
[pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49904683}) = -1 ETIMEDOUT (连接超时)
[pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,97818379}) = 0
[pid 30950] gettimeofday({1260930158, 194127}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,97957235}) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,98049154}) = 0
[pid 30950] gettimeofday({1260930158, 194346}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_REALTIME,{1260930158,194441349}) = 0
[pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49904651}) = -1 ETIMEDOUT (连接超时)
[pid 30950] futex(0x8098a28,FUTEX_WAKE_PRIVATE,1) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,148806370}) = 0
[pid 30950] gettimeofday({1260930158, 245055}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,148947182}) = 0
[pid 30950]clock_gettime(CLOCK_MONOTONIC,{329620,148981547}) = 0
[pid 30950] gettimeofday({1260930158, 245280}, NULL) = 0
[pid 30950]clock_gettime(CLOCK_REALTIME,{1260930158,245374859}) = 0
[pid 30950] futex(0x8128e14,FUTEX_WAIT_PRIVATE,1,{0,49905141}) = -1 ETIMEDOUT (连接超时)

答案1

我无法直接解决您的问题,但经验告诉我,很多时候,三到五分钟的无法解释的延迟是由于等待 DNS 超时造成的。

您的配置是否通过主机名调用任何东西?

答案2

事实证明,问题出在防火墙上。Wireshark 没有显示任何有用的信息,因为防火墙丢弃了某个数据包。尽管我查看了防火墙日志好几次以确保不是这种情况,但结果发现我找错了地方。我忽略了这个“tnameserv”是 IPv6 感知的(因为它绑定到 :::23423),粗略浏览了一下防火墙脚本,我发现我将 IPv6 相关数据包记录到与 IPv4 数据包不同的位置。这不是疏忽,而是必须这样做,因为 ip6tables 目前不支持 -j ULOG 目标。

长话短说,允许 IPv6 环回解决了这个问题并且‘tnameserv’几乎立即返回“Ready”。

相关内容