Измерение производительности веб-приложений
97C# и .NET Framework --- Оптимизация приложений .NET Framework --- Измерение производительности веб-приложений
Главная цель веб-приложений - обработка сотен и даже тысяч запросов в секунду. Чтобы обеспечить успех таким приложениям, очень важно определить потенциальные узкие места и сделать все возможное, чтобы избежать проблем. Но узкие места в приложениях ASP.NET могут возникать не только в вашем коде.
С момента, когда веб-запрос достигает сервера, и до момента передачи вашему приложению, запрос проходит через конвейер протокола HTTP, затем через конвейер IIS, после чего передается еще одному конвейеру - конвейеру ASP.NET, и только потом попадает в ваше приложение. А когда приложение заканчивает обработку запроса, отправляемый ответ проходит через те же конвейеры в обратном направлении, пока, наконец, не будет принят клиентским компьютером. Каждый из этих конвейеров может оказаться узким местом, поэтому увеличение производительности приложений ASP.NET фактически подразумевает увеличение производительности не только вашего кода, но и всех конвейеров.
Обсуждая способы увеличения производительности приложений ASP.NET, нужно смотреть дальше, за границы приложения, и исследовать все факторы, оказывающие влияние на общую производительность веб-приложения, которая складывается из производительности:
прикладного кода;
окружения ASP.NET;
системного окружения (в большинстве случаев IIS);
сети;
клиентской части приложения.
Прежде чем пытаться что-то изменить в своем веб-приложении, необходимо узнать, достаточно ли быстро оно работает, то есть, соответствует ли требованиям, обозначенным в соглашении об обслуживании (Service Level Agreement, SLA)? Изменяется ли его производительность под нагрузкой? Наблюдаются ли какие-то типичные проблемы, которые можно устранить? Чтобы ответить на эти и другие вопросы, необходимо воспользоваться инструментами тестирования и мониторинга, которые помогут выявить узкие места в нашем веб-приложении.
Ранее мы познакомились с некоторыми универсальными инструментами анализа, помогающими выявлять проблемы производительности, такие как профилировщики Visual Studio и ANTS, однако существуют и другие инструменты тестирования и исследования «веб-части» приложений.
Тестирование производительности и нагрузочное тестирование веб-приложений в среде Visual Studio
В числе средств тестирования, входящих в состав Visual Studio Ultimate, имеется инструмент тестирования веб-приложений Web Test Recorder, позволяющий оценить их время отклика и пропускную способность. С помощью этого инструмента можно записать все HTTP-запросы и ответы, генерируемые при работе с веб-приложением, как показано на рисунке ниже. (Этот инструмент поддерживается только браузером Internet Explorer.)
Собрав информацию, ее можно использовать для исследования производительности веб-приложения, а также убедиться в правильной его работе, сопоставляя вновь получаемые ответы с ранее записанными ответами.
Описываемый инструмент тестирования веб-приложений позволяет настраивать поток выполнения тестирования. Вы можете изменять порядок следования запросов, добавлять новые запросы, вставлять циклы и условия, изменять заголовки и содержимое запросов, устанавливать правила проверки ответов и даже изменять тест целиком, преобразуя его в код и изменяя его вручную.
Инструмент тестирования веб-приложений ценен сам по себе, но чтобы исследовать производительность веб-приложения под нагрузкой, его следует использовать в комбинации с инструментом нагрузочного тестирования, также входящего в состав Visual Studio. Этот инструмент дает возможность сымитировать нагрузку на систему, создаваемую множеством пользователей, одновременно выполняющих различные операции, и исследовать поведение системы, собирая различную информацию о производительности, например, из счетчиков производительности и журналов событий.
Весьма желательно, чтобы нагрузочное тестирование производилось не на общедоступном веб-сайте, а на вашем собственном. Нагрузочное тестирование общедоступного веб-сайта может быть воспринято как атака вида «отказ в обслуживании» (Denial-Of-Service, DOS) с последующей блокировкой доступа к сайту для вашего компьютера или даже целой локальной сети, где вы находитесь.
Совмещая нагрузочное тестирование с записью получаемой при этом информации, можно сымитировать ситуацию одновременной работы десятков и даже сотен пользователей, обращающихся к разным веб-страницам с разными параметрами в каждом запросе.
Чтобы сымитировать работу сотен пользователей, желательно использовать тестовые агенты. Тестовые агенты (test agents) - это компьютеры, которые принимают инструкции по проведению тестирования от контроллера (управляющего компьютера), выполняют требуемые тесты, и отправляют результаты обратно контроллеру. Использование тестовых агентов позволяет уменьшить нагрузку на компьютер, выполняющий тестирование (не на тот, что подвергается испытаниям), потому что единственный компьютер, имитирующий деятельность сотен пользователей, может страдать от значительного падения производительности и давать искаженные результаты тестирования.
В ходе нагрузочного тестирования мы можем контролировать различные счетчики производительности, отражающие поведение приложения под нагрузкой, например, проверяя постановку запросов в очередь в ASP.NET, увеличение времени обслуживания запросов с течением времени, и превышение времени допустимого времени обработки запросов из-за ошибок в настройках.
Выполняя нагрузочное тестирование с различными параметрами, такими как различное количество одновременно работающих пользователей или различные типы сетей (быстрые/медленные), можно узнать очень многое о работе веб-приложения под нагрузкой, и на основе анализа записанной информации выработать решения по увеличению общей производительности.
Инструменты мониторинга HTTP
Инструменты мониторинга сети, способные перехватывать HTTP-пакеты, такие как Wireshark, NetMon, HTTP Analyzer и Fiddler, могут помочь в выявлении проблем, связанных с передачей HTTP-запросов и ответов между веб-приложением и клиентом. С их помощью можно исследовать самые разные аспекты, оказывающие влияние на производительность веб-приложеиия. Например:
Корректное использование кеша браузера. Просматривая HTTP-трафик, можно определить, какие ответы возвращаются с заголовками, препятствующими хешированию, и отправляются ли запросы на получение информации, которая уже должна находиться в кеше.
Количество и размеры сообщений. Инструменты мониторинга позволяют увидеть каждый запрос и ответ, узнать время, затраченное на каждое сообщение и его размер, что дает возможность выявить запросы, отправляемые слишком часто, большие запросы и ответы, а также запросы, которые обрабатываются слишком долго.
Применение сжатия. Просматривая запросы и ответы можно выявить запросы, отправляемые с заголовком Accept-Encoding, позволяющим применять GZip-сжатие, и узнать, возвращает ли веб-сервер ответы, сжатые соответствующим образом.
Синхронизация взаимодействий. Некоторые инструменты мониторинга HTTP-трафика способны отображать хронологию поступления и обработки запросов, благодаря чему можно узнать, имеет ли клиентское приложение возможность отправлять сразу множество запросов, или вынуждено синхронизировать их отправку из-за нехватки исходящих соединений. Например, используя этот прием можно выяснить, сколько параллельных соединений может открыть браузер с конкретным сервером, или проверить, действует ли в клиентском приложении для .NET ограничение количества соединений, устанавливаемое классом System.Net.ServicePointManager и равное по умолчанию двум.
Некоторые инструменты, такие как Fiddler, могут также экспортировать записанный трафик в формате, доступном для инструмента тестирования производительности в Visual Studio, благодаря чему полученные данные можно использовать для организации нагрузочного тестирования с целью проверки веб-приложений, которые могут вызываться из клиентских приложений и браузеров, отличных от Internet Explorer. Например, можно записать HTTP-трафик взаимодействий со службой WCF из клиентского приложения для .NET, экспортировать его и с помощью инструмента нагрузочного тестирования провести нагрузочное тестирование своей WCF-службы.
Инструменты анализа веб-взаимодействий
Для выявления проблем производительности можно также использовать инструменты анализа взаимодействий с веб-приложением, такие как Yahoo! YSlow и Google Page Speed. Инструменты анализа веб-взаимодействий не просто анализируют трафик, отыскивая заголовки, препятствующие хешированию и несжатые ответы. Они также анализируют сами HTML-страницы, выявляя проблемы, влияющие на скорость загрузки и отображения страниц, такие как:
наличие больших и сложных структур HTML, влияющих на время отображения страницы;
наличие содержимого в формате HTML, CSS и JavaScript, объем которого можно уменьшить, применяя приемы минификации (minification);
наличие больших изображений, разрешение которых можно уменьшить, чтобы уменьшить их размер и обеспечить более удачное соответствие масштабу HTML-страницы;
наличие кода на JavaScript, выполняемого после, а не во время загрузки страницы, что замедляет отображение страницы.
Все эти приемы мы рассмотрим более подробно в следующих статьях.