2011-11-21 34 views
3

我在调查我们的服务问题,该问题无法解析负载下的s3存储桶名称。什么会导致JVM无法解析负载下的DNS?

我讲一个c1.medium EC2实例:

[email protected]:/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 
[email protected]:/mnt/log# cat /etc/issue 
Ubuntu 10.10 \n \l 
[email protected]:/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或其他系统设置可能会尝试调整以改善此问题?任何更多的指针来寻找线索?

我怀疑的另一个选择是亚马逊(美国东部1区)的基础设施,我怀疑那里的路由器在服务上激活某种DoS预防策略,因为请求几乎立即从0跳转到50.经过一段时间后,它稳定在50个并发速率上,此时硬件适应新的流量。牵强?我还没有发现任何地方提到这种模式。

+0

你可以在你的java.security策略文件中检查值'networkaddress.cache.ttl'吗?默认值是永久性地缓存名称服务查找的结果,但是如果值为300(= 5分钟),那么这可能是您的周期的解释。 – beny23

回答

0

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

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

+1

感谢Funtik,但正如您可以看到的那样,其他服务器(如我们的mongo群集)或其他可以像CloudFront一样扩展的服务也会发生这种情况。因为发送实际请求的是aws-java-sdk S3客户端,所以缓存在这里不重要。 –

+0

还没有用亚马逊这么多,但我仍然试图缓存这个或孤立在一个单独的服务,它不会产生一个新的DNS请求为每个客户端。 Mongo驱动程序是否与aws java同时崩溃? – WeMakeSoftware

+1

@Maxim Veksler:我在生产环境中遇到了类似的问题。你能找到问题的根本原因和解决方案。你能分享一下吗?谢谢,Ashish – user1270392

3

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

ulimit -n说什么? 如果您为进程提供(更高)打开的文件描述符限制,问题是否会消失?

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

+0

谢谢,这是我UnknownHostExceptions的原因。增加打开的文件限制了固定的事情。 –

相关问题