2016-03-09 131 views
2

我正在使用curator框架连接到动物园管理员服务器,但遇到奇怪的DNS解析问题。这里是jstack转储线程,Java DNS解析永远挂起

#21 prio=5 os_prio=0 tid=0x0000000001888800 nid=0x3a46 runnable [0x00007f25e69f3000] 
java.lang.Thread.State: RUNNABLE 
    at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) 
    at org.apache.zookeeper.client.StaticHostProvider.resolveAndShuffle(StaticHostProvider.java:117) 
    at org.apache.zookeeper.client.StaticHostProvider.<init>(StaticHostProvider.java:81) 
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:1096) 
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:1006) 
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:804) 
    at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:679) 
    at com.netflix.curator.HandleHolder$1.getZooKeeper(HandleHolder.java:72) 
    - locked <0x00000000fd761f40> (a com.netflix.curator.HandleHolder$1) 
    at com.netflix.curator.HandleHolder.getZooKeeper(HandleHolder.java:46) 
    at com.netflix.curator.ConnectionState.reset(ConnectionState.java:122) 
    at com.netflix.curator.ConnectionState.start(ConnectionState.java:95) 
    at com.netflix.curator.CuratorZookeeperClient.start(CuratorZookeeperClient.java:137) 
    at com.netflix.curator.framework.imps.CuratorFrameworkImpl.start(CuratorFrameworkImpl.java:167) 

线程似乎被卡在本地方法和永远不会返回。它也是非常随机的发生,所以一直无法重现。有任何想法吗?

+0

错误,修复你的DNS? – EJP

+0

不确定它是否有DNS问题。 –

+0

检查这一个:http://stackoverflow.com/questions/1608503/domain-name-resolution-not-working-in-java-applications-on-ubuntu64-9-04-machine –

回答

3

我们也试图解决这个问题。看起来这是由于glibc的错误:https://bugzilla.kernel.org/show_bug.cgi?id=99671或内核错误:https://bugzilla.redhat.com/show_bug.cgi?id=1209433取决于谁你问;)

另外值得一读:https://access.redhat.com/security/cve/cve-2013-7423https://alas.aws.amazon.com/ALAS-2015-617.html

为了证实这的确是这样的连接GDB到java程序:

gdb --pid <JavaProcessPid> 
从GDB

则:

info threads 

找到一个线程,确实recvmsg:

thread <HangingThreadId> 

然后

backtrace 

,如果你看到这样的事情,那么你知道的glibc /内核升级将帮助:

#0 0x00007fc726ff27cd in recvmsg() from /lib64/libc.so.6 
#1 0x00007fc727018765 in make_request() from /lib64/libc.so.6 
#2 0x00007fc727018b9a in __check_pf() from /lib64/libc.so.6 
#3 0x00007fc726fdbd57 in getaddrinfo() from /lib64/libc.so.6 
#4 0x00007fc706dd9635 in Java_java_net_Inet6AddressImpl_lookupAllHostAddr() from /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/lib/amd64/libnet.so 

更新:看起来像内核胜。请参阅此线程:http://www.gossamer-threads.com/lists/linux/kernel/2264958了解详情。 也有是验证你的系统是由你可以使用这个简单的程序内核问题的影响的工具:https://gist.github.com/stevenschlansker/6ad46c5ccb22bc4f3473

验证:

curl -o pf_dump.c https://gist.githubusercontent.com/stevenschlansker/6ad46c5ccb22bc4f3473/raw/22cfe72f6708de1e3468c1e0fa3888aafae42db4/pf_dump.c 
gcc pf_dump.c -pthread -o pf_dump 
./pf_dump 

如果输出是:

[26170] glibc: check_pf: netlink socket read timeout 
Aborted 

然后系统受到影响。如果输出是这样的:

exit success [7618] exit success [7265] exit success 

那么系统就OK了。 在AWS上下文中,使用新内核将AMI升级到(2016.3.2)似乎已解决了问题。

+0

请不要写只有链接的答案。请将其作为评论,或者在文本中包含必要的部分。 –

+0

是的,glibc升级修复了这个问题!我忘了更新这个线程。 –

+0

谢谢@Jacek Tomaka。我认为'curl -O'应该是'curl -o'。 – seanf