Как Я Решил Проверить Нагрузочную Способность Веб-Сервера

В одно прекрасное утро меня вдруг посетила «гениальная» мысль – а не протестировать ли что-нибудь? Оглядевшись, я поймал свой взгляд – герой этой статьи.

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

Комплексного решения не было, поэтому я решил сделать хотя бы первые шаги.

Получите первые цифры.

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

И так дано - веб-сервер.

Написано .

net ядро .

Сервер используется в корпоративных разработках.

Посмотреть, как это работает, можно, например, здесь — бесплатный сервис хранения ссылок.

http://linkin.link .

я писал о нем .



Введение

Собственно, как протестировать веб-сервер? Если посмотреть на проблему в лоб, веб-сервер должен обслуживать все страницы, которые запрашивали клиенты.

И желательно давать быстро.

Конечно, есть много других сценариев.

В конце концов, веб-сервер не работает сам по себе; как правило, он как минимум работает с какой-то базой данных, общение с которой — это отдельная большая тема.

Опять же, отдельных сервисов может быть много – авторизация и другие.

Перед веб-сервером может быть балансировщик нагрузки.

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

В общем, это целый зоопарк каналов передачи данных — каждый из которых может стать узким местом.

Начинать нужно с малого, и сначала я решил протестировать самый простой и очевидный сценарий.

Есть веб-сервер.

Мы делаем запросы на это.

Все запросы должны быть возвращены без ошибок и в срок.

Задача поставлена.

Я решил протестировать вот так.

Я запускаю веб-сервер на одном компьютере под управлением 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 #веб-сервер

Вместе с данным постом часто просматривают: