Зависают HTTP запросы

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
Всем привет. Столкнулся с такой странной проблемой, тормозят шаблоны на запросах на Zennoposter.
Дано: 2-х процессорная сборка на e5-2689 с 32GB оперативной памяти. Соединение wi-fi, но устойчивое, скорость стабильно 100-250 мегабит. На всем этом удовольствии работает не более чем около 1000 потоков исключительно на запросах. Везде метод HTTP запросов - альтернативный. Из этих 1000 потоков - 900 это что-то типа прокси чекера, то есть взял прокси из списка, отправил запрос к сайту и обработал ответ, в случае удовлетворительного ответа положил в другой список. Тайм-аут таких запросов 10 секунд. Так вот когда работают эти 900 потоков, замечаю, что остальные шаблоны могут обрабатывать запросы от 40 секунд до 2 минут, не смотря на 30 секундный тайм аут и да, при этом не вылетает сообщение о превышении тайм аута. Как только потоки моего "прокси чекера" останавливаются, остальные шаблоны начинают работать как часики. Нагрузка при 1000 потоках на процы всего порядка 15% ну и память там на 25%, сеть не превышает 5-10 мегабит в секунду.
Никто с таким не сталкивался?
В чем может быть проблема?

P.S. прокси из открытых источников, поэтому сразу скажу, что они максимально далеки от идеала...
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
Спасибо, но не то. Я точно знаю кубик, который начинает зависать. Дело тут даже не в ресурсах т.к. при указанном выше объеме потоков их остается еще тьма тьмущая. Что-то именно с соединением http происходит, как будто они могут одновременно только 300 работать например, а потом начинают выстраиваться в очередь. При том если параллельно запустить проект в PM он работает шустро и эту ошибку никогда не выдаст.
 

Wide

Client
Регистрация
04.02.2013
Сообщения
946
Благодарностей
258
Баллы
63
  • Спасибо
Реакции: AleksandrK

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
Проверяли галочку HttpConnectionPool в настройках зенно?
 
  • Спасибо
Реакции: AleksandrK

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
ну если так хочется позаниматься сетью, а не поиском реальной причины, то...
1. чекни сколько потоков держит сеть

103880

2. Отключи пул соединений
103881

3. погугли в инете как увеличить пул соединений который использует виндовс. и как уменьшить время удержания открытого соединения.
4. попробуй другие dll для отправки запросов
5. попробуй отправлять запросы асинхронно.

но все же я бы порекомендовал сделать проверку статики. у меня вот например на 1000 потоков такого же чекера, узкое место было в обращение к локалькой базе SQLite
когда решил проблему с SQLite ни один запрос из 1000 не вызывает проблемы у других проектов.
 
  • Спасибо
Реакции: AleksandrK

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
ну если так хочется позаниматься сетью, а не поиском реальной причины, то...
1. чекни сколько потоков держит сеть

3152 максимум получилось:D

2. Отключи пул соединений
Вот как раз в чате зенолаба посоветовали тоже эту галку, убрал, вроде лучше стало, спасибо

3. погугли в инете как увеличить пул соединений который использует виндовс. и как уменьшить время удержания открытого соединения.
4. попробуй другие dll для отправки запросов
5. попробуй отправлять запросы асинхронно.

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

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
Точно не уверен но в винде вроде ограничение где то.
Точно. При описанной мной работе полностью забиваются TCP-подключения. Так что выход только ставить Win Server
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
или погуглить как настроить обычную винду ;-)
Гуглил, нашел вот такую штуку:
" Увеличение максимального количества одновременных TCP/IP-соединений в Windows 7/8/10
1. Запустите Редактор реестра (Win+R -> regedit -> Enter)

2. Перейдите по пути:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servic es\Tcpip\Parameters

3. Создайте параметр DWORD (32-бита) с наименованием MaxUserPort и значением FFFE

4. Создайте параметр DWORD (32-бита) с наименованием EnableConnectionRateLimiting и значением 0

5. Перезагрузите компьютер".

"FFFE" в десятичной системе будет равно 65534. .
Эффекта не дает.
 

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8
или спросить у GPT :D
Эти команды, по крайней мере в моей версии Windows не работают. возникает ошибка пишет "maxconn" не является аргументом для этой команды. Так что боюсь, что только смена на серверную версию. И то там тоже ограничения есть по-моему. Написано, что Microsoft специально ограничения ставят, что-то там связано с ddos атаками
 

max177

Client
Регистрация
14.04.2017
Сообщения
11
Благодарностей
1
Баллы
3
Нашлось ли решение на обычной windows10? Сейчас уперся в туже проблему, не знаю что и делать ...
 

AleksandrK

Client
Регистрация
20.05.2018
Сообщения
31
Благодарностей
1
Баллы
8

ByMagnum

Client
Регистрация
28.07.2017
Сообщения
37
Благодарностей
7
Баллы
8
Гуглил, нашел вот такую штуку:
" Увеличение максимального количества одновременных TCP/IP-соединений в Windows 7/8/10
1. Запустите Редактор реестра (Win+R -> regedit -> Enter)

2. Перейдите по пути:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servic es\Tcpip\Parameters

3. Создайте параметр DWORD (32-бита) с наименованием MaxUserPort и значением FFFE

4. Создайте параметр DWORD (32-бита) с наименованием EnableConnectionRateLimiting и значением 0

5. Перезагрузите компьютер".

"FFFE" в десятичной системе будет равно 65534. .
Эффекта не дает.


Актуально отсюда брать ключи реестра по данному пути:


MaxUserPort, EnableConnectionRateLimiting - такого ключа даже не существует (((

Предпочтительней поюзать:
1. TCPMaxDataRetransmissions (значение 5 - повторно отправляет keep-alive для получения ответа, очень важно при многопоточном парсинге, в силу того что иногда прокси куку едет и ответа не дождешься свыше 30 сек, либо расшариваем до 60 сек, но при этом надо понимать что за оператор прокси - возможно и так глухая тема, нет смысла... в общем ориентир берем исключительно из своих потребностей)
2. TcpNumConnections (значение - какое поставишь, имей ввиду что зеннопостер будет падать, если используются параллели, и плюс потоков накинул не мало, она просто не успевает обработать все и приводит к массовым Exeption если это Http.Request (WebClient не тестил, но имеет место быть скорее всего тот же синоним), поэтому берем удочку - ловим удачный и классный момент. ОЗУ - не решит проблему*, все упирается в мега очередь и обратную обработку)
3. TcpTimedWaitDelay (значение 1e)
4. TcpWindowSize (значение faf0)

Все DWORD - 32, обязательно (!) перезагрузка машины, любой, попрет и на Windows Server.

Дальше - ранние версии - там вроде ключи другие идут, уточнять по факту - честно, не помню, было давно и не правда :D

Все ключи пишем согласно путям - проверяем, вся информация описана по ссылке. Т.е. пример на ключе KeepAliveInterval

Key: Tcpip\Parameters

Значит путь HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - сюда пишем новое значение / меняем которое уже существует.


Приятной работы!
 

Кто просматривает тему: (Всего: 5, Пользователи: 0, Гости: 5)