什么可能导致JVM无法在负载下解析DNS?

时间:2011-11-21 14:28:36

标签: java linux load amazon-ec2 linux-kernel

我正在调查我们服务的问题,该问题无法解决负载下的s3存储桶名称。

我在强调单个c1.medium ec2实例:

root@ip-10-243-126-111:/mnt/log# uname -a
Linux ip-10-243-126-111 2.6.35-30-virtual #56-Ubuntu SMP Mon Jul 11 23:41:40 UTC 2011 i686 GNU/Linux
root@ip-10-243-126-111:/mnt/log# cat /etc/issue
Ubuntu 10.10 \n \l
root@ip-10-243-126-111:/mnt/log# free
             total       used       free     shared    buffers     cached
Mem:       1746008    1681752      64256          0      29600    1582508
-/+ buffers/cache:      69644    1676364
Swap:       917500         32     917468

应用程序正在使用-server, jvm build 1.6.0_23-b05, 32bit

运行

我看到的行为是网络通信开始“行为有趣”,有时套接字超时发生在我们的mongo连接驱动程序中,如下所示:

Caused by: java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.6.0_23]
        at java.net.SocketInputStream.read(SocketInputStream.java:129) ~[na:1.6.0_23]
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) ~[na:1.6.0_23]
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) ~[na:1.6.0_23]
        at java.io.BufferedInputStream.read(BufferedInputStream.java:317) ~[na:1.6.0_23]
        at org.bson.io.Bits.readFully(Bits.java:35) ~[mongo-java-driver-2.5.3.jar:na]
        at org.bson.io.Bits.readFully(Bits.java:28) ~[mongo-java-driver-2.5.3.jar:na]
        at com.mongodb.Response.<init>(Response.java:35) ~[mongo-java-driver-2.5.3.jar:na]
        at com.mongodb.DBPort.go(DBPort.java:110) ~[mongo-java-driver-2.5.3.jar:na]
        at com.mongodb.DBPort.go(DBPort.java:75) ~[mongo-java-driver-2.5.3.jar:na]
        at com.mongodb.DBPort.call(DBPort.java:65) ~[mongo-java-driver-2.5.3.jar:na]
        at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:201) ~[mongo-java-driver-2.5.3.jar:na]
        ... 43 common frames omitted

有时会发生以下情况

Caused by: java.net.UnknownHostException: bucket-system.s3.amazonaws.com
        at java.net.InetAddress.getAllByName0(InetAddress.java:1158) ~[na:1.6.0_23]
        at java.net.InetAddress.getAllByName(InetAddress.java:1084) ~[na:1.6.0_23]
        at java.net.InetAddress.getAllByName(InetAddress.java:1020) ~[na:1.6.0_23]
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:242) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:130) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:562) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) ~[httpclient-4.1.jar:4.1]
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) ~[httpclient-4.1.jar:4.1]
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:240) ~[aws-java-sdk-1.2.5.jar:na]
        ... 48 common frames omitted

这是可重复的但不一致。一旦在机器上启动加载(50个并发的http请求),机器就会在正确响应约5分钟的循环之间进行,然后在所有请求中失效约10秒,然后是另一个正确响应循环。

什么可能导致这种行为?是否有任何ulimit或其他系统设置我可能会尝试调整以改善这一点?还有指向搜索线索的指针吗?

我怀疑的另一个选择是亚马逊(us-east-1地区)的基础设施,我怀疑那里的路由器在服务上激活了某种DoS预防策略,因为请求几乎立即从0跳到50一段时间后,它稳定在稳定的50并发速率上,此时硬件将调整到新的流量。远远不够?我在任何地方都没有发现任何类型的图案。

2 个答案:

答案 0 :(得分:3)

您是否只是用完了文件描述符?第一个堆栈跟踪看起来并不特定于DNS。

ulimit -n说什么? 如果你给你的进程一个(更多)更高的打开文件描述符限制,问题是否会消失?

(开放/半封闭套接字使用文件描述符)。

答案 1 :(得分:0)

看起来你正在尝试使用亚马逊DNS服务器。 缓存您尝试访问的主机的IP并定期更新缓存。这也将提高应用程序的整体性能

更新: 从跟踪中可以看出,DNS主机只是没有响应您的请求。如果你要达到ulimit,你将面临另一个异常(类似无法创建套接字)。