В одно прекрасное утро меня вдруг посетила «гениальная» мысль – а не протестировать ли что-нибудь? Оглядевшись, я поймал свой взгляд – герой этой статьи.
Это был вводный момент юмора, а если серьезно, то вопрос тестирования веб-сервера стоит уже давно.
Комплексного решения не было, поэтому я решил сделать хотя бы первые шаги.
Получите первые цифры.
Благодаря чему можно было бы предметно поговорить и продумать дальнейшую стратегию.
И так дано - веб-сервер.
Написано .
net ядро .
Сервер используется в корпоративных разработках.
Посмотреть, как это работает, можно, например, здесь — бесплатный сервис хранения ссылок.
я писал о нем .
Введение
Собственно, как протестировать веб-сервер? Если посмотреть на проблему в лоб, веб-сервер должен обслуживать все страницы, которые запрашивали клиенты.И желательно давать быстро.
Конечно, есть много других сценариев.
В конце концов, веб-сервер не работает сам по себе; как правило, он как минимум работает с какой-то базой данных, общение с которой — это отдельная большая тема.
Опять же, отдельных сервисов может быть много – авторизация и другие.
Перед веб-сервером может быть балансировщик нагрузки.
Все это может быть размещено в нескольких виртуальных контейнерах, которые опять же могут находиться на разных физических серверах.
В общем, это целый зоопарк каналов передачи данных — каждый из которых может стать узким местом.
Начинать нужно с малого, и сначала я решил протестировать самый простой и очевидный сценарий.
Есть веб-сервер.
Мы делаем запросы на это.
Все запросы должны быть возвращены без ошибок и в срок.
Задача поставлена.
Я решил протестировать вот так.
Я запускаю веб-сервер на одном компьютере под управлением Windows 10. Веб-сайт работает на веб-сервере.
На сайте находится куча js, css, mp4 файлов и собственно html страница.
Для простоты я просто взял страницу с готового сайта.
Как заканчивать сервер? Есть 2 пути — скачать что-то готовое или написать свой велосипед. Я решил пойти по второму варианту.
И я сделал этот выбор по нескольким причинам.
Во-первых, это интереснее.
Во-вторых, собственная программа обладает большой гибкостью; любой тестовый сценарий можно реализовать, как только он придет в голову.
И, по моим собственным размышлениям, это займет меньше времени, чем поиск другой программы, скачивание, изучение интерфейса.
И тут вы сталкиваетесь с тем, что тот функционал, который существует, не подходит.
HTTP-дос
Сказано - сделано.Программа работает так: при запуске считывается файл urls.txt — куда вписываются урлы, которые нужно скачать.
Далее нажмите «Пуск».
Список создается Задача по количеству URL-адресов.
Каждая задача открывается разъем , отправляет http-запрос, получает данные, закрывает сокет. Затем процедура повторяется.
Первоначально использовался TCPClient но почему-то почти сразу при запуске выдавало много ошибочных загрузок.
Я не стал разбираться, а спустился ниже.
Реализована отправка в сокет. Добавил в программу таблицу - URL, количество успешных загрузок, количество ошибок, размер загрузки.
Я считал ошибки по 2 сценариям.
Все исключения связаны с открытием, отправкой, получением данных.
Коллективно, если хоть что-то не так, убиваем сокет и увеличиваем счётчик ошибок.
Я также добавил проверку длины данных.
При первой загрузке страницы длина данных запоминается, все повторные загрузки проверяются по этому числу.
Отклонение считается ошибкой.
Можно было бы еще что-то добавить - но для начала мне этого достаточно.
Все готово для эксперимента.
Запустим веб-сервер.
Запускаем httpdos — так я назвал программу, чтобы мы могли и дальше использовать это короткое имя.
И я вижу следующую картину.
Здесь я уточню некоторые технические данные.
Количество потоков, делающих запросы, оказалось 1200. Эта цифра — количество urls, прочитанных из файла urls.txt, плюс я решил умножить все запросы в 20 раз.
Все цифры я взял из головы на момент написания программы.
В любой момент вы можете поставить любые другие, какие пожелаете.
Преимущество велосипеда.
Также позже я добавил сбоку текстовую область — где отображаю все исключения, а также решил добавить вывод — количество запросов в секунду.
Картина меня порадовала.
Во первых все работает).
Во-вторых, работает без ошибок.
Количество обработанных запросов оказалось где-то 4000-6000 в секунду.
Откуда эта цифра? На мой взгляд, это зависит от многих обстоятельств.
Самое очевидное — насколько велики сами запросы.
Как я писал выше, я просто скачиваю все данные с определенной веб-страницы, которая была взята из стороннего веб-проекта.
А файлов mp4 очень много, размер которых около 3-х мегабайт. Если уменьшить размер запросов, например, загружать только css, то количество обрабатываемых запросов наверняка увеличится.
Я даже заинтересовался и начал играться с исходным кодом как со стороны веб-сервера, так и со стороны httpdos. Там куча разных таймеров, буферов и прочего.
Я смотрел, как то или иное изменение повлияет на скорость.
Но я не буду об этом писать.
И целью было проверить отказоустойчивость, а не скорость.
Для начала простая проверка: не зависнет ли сервер от dos-атаки или просто будет медленнее обрабатывать запросы.
Существенное влияние на скорость оказал и тот факт, что веб-сервер и httpdos запускались в режиме отладки в Visual Studio. Поработав пару минут - ни одной ошибки.
Посмотрел загрузку процессора - диспетчер задач показал примерно 28% на веб-сервере и 20% на httpdos. Процессор стоит i7-8700k. Не разогнан.
Это 6-ядерный 12-ниточный камень.
Во время работы работы кулера охлаждения не было слышно - проц был холодный.
Я специально не смотрел на температуру.
Я решил скачать js-файл через браузер параллельно с httpdos. Файл загружается мгновенно.
Те.
httpdos не оказывает существенного влияния на веб-сервер.
Продолжаю свои эксперименты.
Я решил запустить три программы httpdos одновременно.
И наблюдайте за результатами.
То, что я увидел, является причиной этой статьи.
И увидел, что почему-то примерно через минуту стали появляться ошибки загрузки.
И я начал расследование.
Такого поведения просто не должно быть!
Забегая вперед, скажу, что даже не это побудило меня к дальнейшему расследованию.Ну, даже если по каким-то причинам пара запросов из сотен тысяч не доходит. По моему опыту, браузеры делают большое количество одних и тех же запросов, пока не получат запрошенные данные.
Клиенты этого даже не заметят. То, что произошло дальше, заставило меня напрячься.
В процессе экспериментов я так и сяк подшучивал над httpdos. И один сценарий привел к неожиданным результатам.
Если вы запустите хотя бы 3 программы.
Я думаю, что это число связано с количеством одновременных запросов в секунду.
Начните DOS-атаку.
Подождите появления ошибок.
Затем резко закройте программы.
Тогда сервер, слушающий сокет веб-сервера, просто умирает! Всё - ошибки на стороне сервера нет. Все потоки запущены.
А сокет ничего не принимает. Это больше не вариант. «Эксперименты показали, что сокет оживал примерно за 4 минуты, но если дос-атака проводилась долго, то сокет умирал навсегда, по крайней мере я ждал оживления минут 15, а дальше уже было не интересно.
Такого поведения просто не должно быть! Эксперимент проводился много раз – результат всегда один и тот же.
Если перезапустить веб-сервер, т.е.
получается, что мы пересоздали слушающий сокет, то сокет сразу начал принимать клиентов.
Первый шаг
Первое, что я сделал, это попытался получить более подробную информацию об исключении на стороне httpdos. Покопавшись в интернете я нашел то что мне нужно Исключение сокета , и посмотрите на свойство в нем Код ошибки .Сделал.
Получил код ошибки 10061 - WSAECONNREFUSED. Здесь объяснение.
В соединении отказано.Ну.Соединение не может быть установлено, поскольку целевой компьютер активно отклонил соединение.
Обычно это происходит в результате попытки подключения к службе, которая неактивна на внешнем хосте, то есть службе, на которой не запущено серверное приложение.
познавательно (сарказм) однако.
Вроде как стоит понимать, что сокета, к которому мы хотим подключиться, не существует. Запустим консоль.
Входить нетстат -ан и мы видим.
Вот он родной.
Слушает порт 80. Ну по крайней мере система так считает.
И что делать дальше? В этом случае я начинаю искать хоть какие-то зацепки, хоть какие-то отклонения от ожидаемого поведения.
Поэтому я придумываю кучу скриптов, покрываю их отладчиками, отслеживание , нюхать и так далее и я наблюдаю.
Несколько слов о сокете
Веб-сервер использует самый стандартный способ открытия и работы с сокетами в .net. Вот пример кода:
Теги: #программирование #разработка веб-сайтов #тестирование веб-сервисов #.Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) {
NET #тестирование #.
net core #services #веб-сервер
-
#2Хакатон Для Молодых Специалистов В Перми
19 Oct, 24 -
Спутниковый Iphone 13, Канал 14 И Globalstar
19 Oct, 24 -
Игра Свиной Грипп Свиной Боец
19 Oct, 24 -
Онлайн «Школа» Сетевых Технологий Netskills
19 Oct, 24