什么会导致JVM无法parsing负载下的DNS?

我正在调查与我们的服务有关的问题,该问题无法parsing负载下的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

我看到的行为是networking通信开始“行事滑稽”,有时套接字超时发生从我们的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或其他系统设置,我可能会尝试调整,以改善呢? 还有更多的指针来寻找线索?

我怀疑的另一个select是亚马逊(美国东部地区)的基础设施,我怀疑那里的路由器在服务上启用某种DoS预防策略,因为请求几乎立刻从0跳到50.之后时间稳定在一个稳定的50并发速率,在这一点上硬件适应新的stream量。 远达? 我还没有发现任何地方提到这种模式。

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

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

你只是用完文件描述符? 第一个堆栈跟踪看起来没有任何DNS特定的。

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

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