|
|
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Я использую apache http async http://hc.apache.org/httpcomponents-asyncclient-dev/index.html для сбора данных. Нагрузка пока небольшая - 4-5 страниц в секунду. Но эта нагрузка только для тестирования. Проблема в том, что где-то на 7000+ странице, начинаются затупы по 20 секунд в минуту, при резолве внешнего соединения и заодно при создании соединения клиента. То есть примерно каждую минуту он тупит 20 секунд. Похоже на то, что linux (fedora) пытается отправить несколько SYN запросов, как раз укладываясь в 20 секунд, но не получает ответа. Я мог бы подумать, что проблема в превышении лимита открытых соединений, но количество соединений, которые можно увидеть - ~140-190. Лимит - 32 тыс. Такое ощущение, что что-то клиент всё-таки не закрывает и от этого проблемы... Попытался проблему решить пересозданием клиента, а заодно вызовом shutdown, так как он все коннекты закрывает и отменяет, но эффекта это не дало. Keepalive - использовался дефолтный апачевский, который в случае чего возвращает -1 либо значение из заголовка, пробовал и без keepalive. Есть одна странная мысль - я запускаю эту штуку из дома и провайдер такой SYN трафик может блокировать. Больше идей у меня нет. Может уважаемые коллеги подскажут куда можно покопать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2013, 01:08:55 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Отвечу сам себе :) Кажется починил, с помощью замены клиента на - https://github.com/AsyncHttpClient/async-http-client . Какой-то странный сетевой затуп по-прежнему есть время от времени, но судя по логам и статистике, он уменьшился. Кроме того эта библиотека с забором данных работает лучше. Затуп сокета почти не мешает другим закачкам, поэтому очередь загрузок непрерывна. Тфу-тфу-тфу. Оставил пока на ночь. p.s. кстати да, затуп сокета не связан с хостом, он происходил за время тестов на каждом из тестовых хостов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2013, 02:44:07 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Тест показал, что от смены клиента проблема не исчезает. Так что актуально. Но похоже, что проблема уже не на стороне java, а всё-таки либо системная, либо сетевая. Может кто-нибудь сталкивался? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2013, 12:24:37 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Сталкивался. Все загрузки обязательно делать с ограничением по времени, причем контролируя это именно на вызывающей стороне. Самый простой способ - feature. Я точно не помню, в чем было дело - но именно на сетевом уровне происходил сбой. Можно отловить, если сделать kill -3 и посмотреть в логах приложения (я из catalina.out доставал). У меня вроде висело на Socket.readBytes или что-то похожее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2013, 12:57:59 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Leonidv, Привет и спасибо :) Без ограничения времени - никуда, тут другой вопрос - что надо выбрать правильный timeout, чтобы хорошие, но медленные урлы не обрубить. 20 секунд - время большое, конечно, но если хочется загружать еще и медиаконтент, то маловато и этого. Кстати apache http client и ning предлагают соответствующие настройки, так что с этим проблем нет. Проблему, надеюсь, окончательно поборол - установкой локального днс сервера/resolver'a - bind . + увеличил время кеша network.address для профилактики. Сейчас, тфу-тфу-тфу, всё работает быстро, только лишь реально медленные ссылки уходят в таймаут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2013, 23:38:03 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
АлексейСLeonidv, Кстати apache http client ning не знаю, а apache httpclient сам по себе проблему зависших соединений решать не умеет. Такое у меня проскакивало примерно раз в неделю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2013, 10:27:05 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Leonidv, С настройками SoTimeout, ConnectionTimeout зависало? А какая версия? У меня сейчас синхронный апачевский клиент используется только для проверки состояния скачиваемых сайтов, опрашивается раз в 20 секунд, пока не вис, тфу-тфу-тфу, а вот TimeoutException'ы вываливает частенько. Верчии использовал начиная с 4. Но посмотрим, у меня до текущей реализации тоже был future против зависаний. Заодно после закачки была куча логики, которая тоже зависела от IO, поэтому future был очень уместен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2013, 12:23:40 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
История имеет продолжение :) Если вам требуется очень быстрый асинхронный сбор данных с множества источников, то не рекомендую использовать ни apache http client, ни ning async client. Последний, к слову, вроде как штатно используется в фреймворке play, я нашёл темы в гугл группах play по багам клиента. Несмотря на то, что ning по умолчанию использует netty, сделан он недостаточно эффективно. Apache async http client - тоже. Счастья с этими продуктами я так и не испытал и пришлось написать свой клиент поверх netty. Благо в интернете есть примеры . Проблемы возникают если поток данных достаточно большой и сайты для сбора неоднородны и могут выдавать непредсказуемые результаты. В итоге получается выбор - либо танцевать с бубном вокруг клиентов и править их код, либо написать сразу по-человечески на базе nio, netty. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 13:19:54 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
АлексейСLeonidv, С настройками SoTimeout, ConnectionTimeout зависало? А какая версия? Я с асинхронными не работал, т.к. не увидел их явной выгоде, а сделать надо было быстро. Использовал только httpclient. SoTimeout - не помню, ставил или нет, но ConnectionTimeout точно мне не подходил. Там было видно в потоках, что процесс создавал и устанавливал связь и похоже, получал какие-то ответы от сервера (потому что не срабатывал ReadTimeout). Я тогда прогуглил ситуацию и нашел на stackoverflow совет/правило все такие вызовы оформлять через feature. Добавил - сборка стабилизировалась. А очень быстрый - это у вас сколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2013, 14:37:23 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
LeonidvЯ с асинхронными не работал, т.к. не увидел их явной выгоде, а сделать надо было быстро. Использовал только httpclient. SoTimeout - не помню, ставил или нет, но ConnectionTimeout точно мне не подходил. Там было видно в потоках, что процесс создавал и устанавливал связь и похоже, получал какие-то ответы от сервера (потому что не срабатывал ReadTimeout). Я тогда прогуглил ситуацию и нашел на stackoverflow совет/правило все такие вызовы оформлять через feature. Добавил - сборка стабилизировалась. А очень быстрый - это у вас сколько? Нужно кравлить несколько сотен доменов одновременно. Сначала мой кравлер был на потоках и обрабатывал штук 50 доменов, по потоку на домен, но сейчас требования изменились. Асинхрон позволяет гораздо лучше контролировать задачи, сеть и использует меньше ресурсов. Сейчас у меня асинхронный resolve, а после него идёт уже отправка запроса + ограничение на количество запросов, это позволяет нагружать сеть равномерно. Также я закачиваю заголовки и если они мне не нравятся - закачку обрубаю, это экономит сеть и ресурсы. С netty проверка только одних заголовков и разные действия после этого - очень удобно делается - в HttpHandler. Хотя в целом это ужасный геморрой и новые, сложновыловимые баги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 16:02:27 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
АлексейС, А почему Nutch не взяли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 16:11:22 |
|
||
|
Apache Async Http Client виснет
|
|||
|---|---|---|---|
|
#18+
Leonidv, В Nutch используется Hadoop. В частности, насколько я знаю, в тасках хадупа происходит закачка ссылок. 1) для меня map-reduce job'ы - это всё-таки задачи, с очевидным результатом. Например обработка данных в хадупе - отличная мысль. Для того он и сделан. Но вот IO в хадупе, да еще и с непредсказуемым результатом - это очень опасная штука. Например многие адреса порождают довольно много редиректов, кроме того есть затупы resolve, сайты часто падают сами по себе на минуту-час-день. Уверен, что в Nutch как-то решили эти проблемы, но посмотрев документацию я понял, что конфигурить это всё - сложно. Проще написать своё. Впрочем я - заядлый велосипедостроитель :) 2) мой кравлер кормит ссылками сам себя постоянно. Разумеется, есть база ссылок и есть хранилище, в котором хранятся recrawlDate и прочее по каждой ссылке. Но он может просто запуститься и работать, работать, работать, пока я не остановлю его. А хадуп джоба, которая работает 2 недели - это какой-то ахтунг. При этом кравлеру особой масштабируемости не надо, так как мы всё-равно упрёмся в сеть. Если только сеть не 10 гигабит :) И всё-таки список урлов на фетчинг - это хорошая штука, если у нас урлов миллиарды. И доменов миллионы. Иначе мы просто не сможем контролировать это всё. Но это не мой случай, у меня просто несколько списков урлов по 50 штук. Всего - несколько сотен на текущий момент. 3) Это решение - относительно простое. 4) Это часть инфраструктуры, хотя можно было бы эту инфраструктуру реализовать на хадупе, но смысла в этом не было. Хадуп всё-таки требователен, да и настраивается непросто. В общем исторически так сложилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2013, 17:00:52 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=247&tid=2130066]: |
0ms |
get settings: |
15ms |
get forum list: |
29ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
53ms |
get topic data: |
24ms |
get forum data: |
5ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 299ms |
| total: | 521ms |

| 0 / 0 |
