LINUX.ORG.RU

Как создать из ноды много исходящих запросов?

 ,


0

2

Нужно просканировать 500К картинок на разных сайтах. Планировщик запросов свой. Проблема в том, что после ~ первой тысячи параллельных запросов все нафик затыкается и отваливается по таймауту. Памяти хватает, процессора тоже. Все просто тупо висит.

Я видел в интернетах про http(s).globalAgent.maxSockets, но там вроде давно infinity поставили по умолчанию. ulimit -n тоже подкручен. Ограничивать планировщик на 200 max параллельных соединений (по всем доменам в сумме) тоже пробовал, не помогло.

Кто-нибудь сталкивался с подобным эффектом? Для запросов пробовал модули request и got. Мне сейчас не нужно кешировать соединения, SSL-сессии и т.п. Хочу пока просто делать много запросов к разным серверам, и чтобы они не провисали с моей стороны (пока процессор не кончится).

★★★★★

Последнее исправление: Vit (всего исправлений: 2)

Я слышал не помню где что v8 может выделять в куче не более 1,4 гига памяти и иметь до 250k сокетов активных. Может в этом затык Но это не точно )

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)

у человека есть задача. инструмент человека не справляется. человек вместо другого инструмента просит починить ему выбранный им инструмент. человек, конечно же, не упоротый дебил, сейчас таких людей принято политкорректно называть джаваскриптерами

anonymous
()

первой тысячи параллельных запросов

все нафик затыкается и отваливается по таймауту.

я б тоже заткнулся и отвалился

может имеет смысл сделать как это обычно делают - очередь задач и n активных потоков ?

Ford_Focus ★★★★★
()
Ответ на: комментарий от Ford_Focus

во-первых оне не обучены как нормальные люди делать. во-вторых, что такое 1к запросов, скорее всего синхронных GET, для более-менее свежей даже десктопной тачки и нормального канала? плюнуть и растереть

anonymous
()
Ответ на: комментарий от Ford_Focus

Перечитай вторую фразу первого абзаца. Ограничение по максимальному количеству параллельных соединений есть.

Vit ★★★★★
() автор топика
Ответ на: комментарий от anonymous

так не синхронных же.

я хз что происходит с фотографией после загрузки, но когда я игрался с многопоточкой и c#, 64 потока гарантированно отправляли 6ядерник в нокдаун

Ford_Focus ★★★★★
()
Ответ на: комментарий от Ford_Focus

в котором косарь одновременных задач

Это не много

Dron ★★★★★
()
Ответ на: комментарий от Ford_Focus

Ты не в теме, просто не пиши ничего :) . У меня вопрос конкретно по ноде, по request/got (где-то там).

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

ой-ой-ой, а у нас похоже не просто джаваскриптер с большой буквы Ж, он ещё и анонимусов заигнорил, похоже, которые ему ссылку дали куда надо. да уж, беречь надо такие светлые головы

anonymous
()

Эм.

1) С кластером как? Если тоже никак — дело не в ноде.

2) Меня слегка смущает твоя задача. Я бы очередь впилил, она делается тривиально. Всё равно на определённом количестве запросов ты упрёшься в память, а на ещё одном — в количество эфемерных портов.

3) Где код?

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

https://github.com/nodeca/connection_test/blob/master/test_request_db.js

Вот последний вариант, берет ссылки из базы и тупо скачивает. Канал не забит, проц подскачивает до 40% но не все время.

Я там еще добавил { agent: false, pool: false } на всякий случай.

Картина такова - общее время соединения быстро дорастает до 60 секунд, через эдак минуту спадает до 15. Но если глядеть количество записей в логе то в среднем штук 50-100/сек.

Ссылки в основном https.

Vit ★★★★★
() автор топика
Ответ на: комментарий от ChALkeR

По ссылке из предыдущего поста по таймауту слетает немного, но там таймауты большие, 120 секунд. А это не совсем нормально.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

А можно без обращения в базу монги плз, файлом какие-нибудь тестовые ссылки по которым воспроизводится?

И если понизить concurrency — что будет?

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 1)
Ответ на: комментарий от ChALkeR

Давай чуть позже. Пока экспериментируем, например выбираем только http или https. Без базы неудобно.

У нас похоже 2 косяка, и в настройках соединений и в планировщике. Не подскажешь, какие опции в `request` передать, из расчета на 500 параллельных соединений?

{
  agentOptions: {
    keepAlive: true,
    keepAliveMsecs: ???,
    maxFreeSockets: ???,
    maxCachedSessions: ???,
    ...
  }
  ...
}


И есть ли еще пакеты кроме request/got, которые упрощают массовые запросы по ссйлкам и поддерживают редиректы.

Vit ★★★★★
() автор топика

я не особо в теме за ноду, такчто возможно скажу глупость - но по описанию проблемы очень похоже, что не переиспользуются сокеты, что приводит к какомуто внутреннему лимиту ноды (про который тут писали и я гдето про него читал). как вариант - посмотреть как изменяется колво открытых файловых дискрипторов, возможно заметиш там аномалию...

genryRar ★★
()

злой ты - но попробую подсказать тебе ulimit не единственная точка входа PAM лимитов /etc/security/limits.conf правим где то так * soft nproc 65000 * hard nproc 1000000 * - nofile 1048576 (памовские лимиты при логине срабатывают - поэтому новая консоль)

ну и в ядре подкрутить сисктл типа net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0 net.ipv4.ip_local_port_range = 1024 65535 net.nf_conntrack_max = 1000000 скорее всего на этих параметрах ядра и затык, если было больше информации , например когда затыкается подключится через strace -p то былоб понятно где ограничения срабатывают

Adekamer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.