• Записи 1597
  • Теги 119
  • Комментарии 3400

Лог жизни

Экспериментирую с SiteKnockerBot и лимитом соединений

Вчера ещё раз попытался избавить SiteKnockerBot от ложных срабатываний. Думал, что проблема в нехватке пропускной способности канала VDSа, на котором он работает. Посмотрел загрузку канала утилитой nload. Потом интереса ради загрузил iso-образ какого-то дистрибутива и увидел, что бот занимает далеко не весь канал.
Решил попробовать со своего компьютера. Вытащил базу на localhost, запустил, и обнаружил, что и тут то же самое: если поставить большое количество одновременных соединений, то через некоторое время ошибки таймаута начинают идти сплошным потоком.
Сначала попытался поменять настройки Http.Transport — увеличить размер приёмного буфера. Для этого пришлось обновлять версию go, так как по умолчанию у меня стояла 1.10, а менять его можно только с 1.13. Безрезультатно. Но позапускав бота на своём компьютере, обнаружил, что даже после его завершения какое-то время даже броузеры не могут нормально устанавливать соединение. Стало понятно, что всё упирается в какие-то системные ограничения.
В результате полдня экспериментировал с настройками: пытался уменьшить tcp_fin_timeout, увеличить tcp_mem, tcp_rmem, включить tcp_tw_reuse. Но безрезультатно. Максимум, чего удалось добиться — это при увеличении количества потоков вместо таймаута начала возникать ошибка no such host. Ещё думал, что дело в нехватке свободных TCP ports, но их увеличение тоже не помогло.
В общем, после всего этого понизил количество одновременных потоков до 25, и пока так и оставил. Плохо только одно: максимальное количество проверяемых сайтов становится равно всего около 15 тысяч. Может, потом придут ещё какие-нибудь идеи.

3 комментария:

Нет
Олег
0

Добрый день.
А где можно более подробно почитать про SiteKnockerBot. В частности интересуют описания ошибок. В частности сообщение "Ошибка SSL, код 1".
Это какой-то ваш код? Или это ошибка рукопожатия?

4X_Pro
0

Вообще, подробной документации по нему нет, поэтому напишу здесь.
Сейчас я мониторинговую часть переписал, и теперь она работает с использованием модуля curl, соответственно, коды ошибок все оттуда. А логика проверки ошибок выстроена так: сначала вызывается curl_getinfo с параметром CURLINFO_RESPONSE_CODE и проверяется статус ответа HTTP. Если он равен нулю (то есть запрос вообще не был выполнен), то вызывается curl_getinfo с параметром CURLINFO_OS_ERRNO и проверяются ошибки соединения на уровне TCP/IP (типа connection refused, no route to host и тому подобных). Если и он равен нулю, то снова вызывается curl_getinfo с параметром CURLINFO_SSL_VERIFYRESULT, и в этом случае и выдаётся та самая ошибка SSL и её код. Код 1 вроде соответствует handshake error, остальные — вот этой таблице.

Нет
Олег
0

Благодарю за ответ

Написать комментарий
Прикрепить файлы: (не более 4 файлов, не более 102400 Кб каждый, 102400 Кб всего)


Задать вопрос