Что может привести к тому, что JVM не сможет разрешить DNS под нагрузкой? - PullRequest
3 голосов
/ 21 ноября 2011

Я исследую проблему с нашим сервисом, который не может разрешить имена сегментов 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 или другие системные настройки, которые я мог бы попытаться настроить, чтобы улучшить это? Есть еще указатель для поиска улик?

Другим вариантом, который я подозреваю, является инфраструктура в Amazon (регион us-east-1), я подозреваю, что маршрутизаторы там используют какую-то политику предотвращения DoS в службе, потому что запросы почти мгновенно переходят с 0 до 50 Через некоторое время он стабилизируется на постоянной скорости 50, и в этот момент аппаратное обеспечение адаптируется к новому трафику. Куда привезли? Я нигде не нашел упоминаний об этом типе паттернов.

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

У вас просто заканчиваются файловые дескрипторы? Первая трассировка стека не выглядит специфичной для DNS.

Что говорит ulimit -n? Проблема исчезнет, ​​если вы дадите вашему процессу (намного) более высокий лимит дескриптора открытого файла?

(Открытые / полузакрытые сокеты используют файловые дескрипторы).

0 голосов
/ 21 ноября 2011

Похоже, вы пытаетесь просто сделать DNS-серверы Amazon.Кэшируйте IP-адрес хоста, к которому вы пытаетесь подключиться, и периодически обновляйте кеш.Это также повысит общую производительность приложения

Обновление: из трассы видно, что хост DNS просто не отвечает на ваши запросы.Если бы вы достигли ulimit, вы бы столкнулись с другим исключением (что-то вроде неспособности создать сокет).

...