УДК 004.051
Е. Н. Боженкова 1 2, Д. В. Иртегов 1, Я. С. Колбин 1
1 Новосибирский государственный университет ул. Пирогова, 2, Новосибирск, 630090, Россия
2 Институт систем информатики им. А. П. Ершова СО РАН пр. Акад. Лаврентьева, 6, Новосибирск, 630090, Россия
[email protected], [email protected], [email protected]
ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ВЕБ-ИНТЕРФЕЙСА ПРИЛОЖЕНИЯ NSUTS СРЕДСТВАМИ ДИНАМИЧЕСКОГО HTML
Статья посвящена применению технологий AJAX/AJAJ для оптимизации производительности автоматизированной системы тестирования навыков программирования NSUts. Приводятся сравнительные данные (пропускная способность, среднее время отклика и др.) нагрузочного тестирования веб-приложения традиционной архитектуры и функционально аналогичного приложения на основе AJAX/AJAJ.
Ключевые слова: AJAX, AJAJ, динамический HTML, производительность веб-приложения.
Введение
За последние годы Интернет стал важной платформой для получения данных и запуска приложений, такие приложения легкодоступны и не зависят от места, где его собираются использовать. Поэтому пользователи начали отдавать предпочтение веб-приложениям по сравнению с традиционными настольными приложениями. Быстрый рост сети, в качестве платформы приложений, повысил и уровень приложений. Они имеют насыщенные и динамичные пользовательские интерфейсы, где работа в режиме реального времени стала нормой [1].
К сожалению, архитектуры существующих веб-серверов, веб-браузеров и протоколов HTTP ориентированы на другую модель взаимодействия пользователей с сервером, которая плохо совместима с взаимодействием в реальном времени. Механизмы кэширования, заложенные в действующих стандартах HTTP 1, неявно предполагают, что большинство веб-ресурсов представляют собой редко меняющееся содержимое.
Использование таких страниц для организации взаимодействия большого количества пользователей в реальном времени выявляет неожиданные узкие места в используемых стеках программного обеспечения. В частности, параметром, ограничивающим реальную производительность приложения, может оказаться количество нитей веб-сервера [2] 2.
Одним из путей обхода таких узких мест является переход к клиент-серверной архитектуре на основе динамического HTML, так называемой архитектуре AJAX/AJAJ (Asynchronous
1 Hypertext Transfer Protocol - HTTP/1.1. URL: http://www.w3.org/Protocols/rfc2616/rfc2616.html (дата обращения 11.12.2014).
2 Configuring Apache for Maximum Performance. URL: http://www.howtoforge.com/configuring_apache_ for_maximum_performance (дата обращения 11.12.2014).
Боженкова Е. Н, Иртегов Д. В., Колбин Я. С. Оптимизация производительности веб-интерфейса приложения NSUts средствами динамического HTML // Вестн. Новосиб. гос. ун-та. Серия: Информационные технологии. 2015. Т. 13, вып. 2. С. 13-21.
ISSN 1818-7900. Вестник НГУ. Серия: Информационные технологии. 2015. Том 13, выпуск 2 © Е. Н. Боженкова, Д. В. Иртегов, Я. С. Колбин, 2015
JavaScript and XML/JSON) [3]. Это позволяет уменьшить объем данных, передаваемых сервером при каждом запросе, улучшить время реакции приложения и повысить его пропускную способность под высокими нагрузками.
В статье рассматривается применение технологии AJAJ для оптимизации производительности веб-приложения, рассчитанного на взаимодействие большого количества пользователей в реальном времени. Сначала описывается приложение для автоматизированного контроля навыков программирования NSUts и проблемы с производительностью под большими нагрузками. Далее приводятся соображения, по которым технология AJAX/AJAJ могла бы решить обнаруженные проблемы. Затем описывается прототип NSUts 2.0, в котором AJAJ используется для реализации функций, создающих больше всего проблем с точки зрения производительности. В заключение приводятся данные нагрузочного тестирования оригинального приложения и прототипа NSUts 2.0.
Система NSUts и ее производительность
Рассмотрим приложение NSUts (автоматизированная система тестирования, [4]). Во время некоторых мероприятий, например при проведении интернет-тура Открытой Всесибирской олимпиады им. И. В. Поттосина или школьных олимпиад, в системе регистрируется несколько сотен участников. Кроме того, во время таких мероприятий к системе подключаются сотни болельщиков. Многие из этих пользователей подключены по медленным каналам с большими задержками: ADSL или даже модем 56K в удаленных населенных пунктах, GPRS.
Поскольку и болельщики, и участники, и жюри хотят видеть картину событий (рейтинг, очередь тестирования) в режиме, близком к реальному времени, они очень часто перезагружают страницы приложения. В худшем случае может получаться, что каждый из пользователей генерирует несколько запросов на перезагрузку в секунду.
При нормальной работе механизмов кэширования HTTP это не приводило бы к перекачке страницы при каждой перезагрузке, потому что в большинстве случаев изменений на странице нет. При запросе на перезагрузку браузер отправляет на сервер запрос HEAD, сравнивает временной штамп локальной копии страницы со временем модификации страницы на сервере и не перекачивает страницу, если эти штампы совпадают 3. Кроме того, между браузером и сервером можно добавить дополнительные кэширующие прокси, так называемые веб-ускорители, которые позволят избежать запуска скриптов на основном веб-сервере при каждом обращении.
В случае приложения NSUts эти механизмы так работать не могут. Во-первых, все интересные пользователю страницы генерируются серверными скриптами, т. е. в соответствии со стандартом HTML они должны снабжаться полями HTTP-заголовка Pragma: no-cache или Cache-Control: no-cache, т. е. браузер, в соответствии со стандартом, не имеет права их кэши-ровать.
Эту проблему можно было бы решить путем установки и соответствующей настройки кэша (NGINX, Varnish и / или memcached) на стороне сервера. Но в системе NSUts каждый авторизованный пользователь видит свой набор данных: свою очередь тестирования, ответы на свои вопросы, разные версии рейтинга при замораживании [4; 5], поэтому кэширование на стороне сервера оказалось малоэффективным [2].
Типичная страница веб-интерфейса NSUts (рис. 1) после упаковки имеет размер от 2 до 6 килобайт, что, казалось бы, немного. Но почти каждая перезагрузка страницы пользователем приводит к полноценной перегенерации этой страницы с запуском скриптов, обращениями к базе данных и т. д. Сотни пользователей, перезагружающих страницы несколько раз в секунду, обеспечивают загрузку, измеряемую тысячами обращений в секунду, что переводит приложение в разряд высоконагруженных.
3 Hypertext Transfer Protocol - HTTP/1.1.
Рис. 1. Список участников олимпиады в системе NSUts 1.3
Наблюдение за поведением веб-сервера под такой нагрузкой позволило выявить проблему, с которой часто сталкиваются высоконагруженные веб-приложения [6; 7]. Когда пользователи осуществляют доступ через локальную сеть или широкополосной Интернет, передача генерируемых скриптом данных происходит быстрее, чем их генерация, т. е. производительность сервера в целом оказывается ограничена мощностью его процессора и производительностью его дисковой подсистемы.
Но когда часть пользователей работают через медленные каналы с большими задержками, узким местом оказывается передача данных. При этом нить Apache с интерпретатором Perl оказывается занята на гораздо большее время, чем нужно для исполнения скрипта, и настоящим узким местом оказывается количество нитей сервера.
Серверные скрипты приложения работают в однопоточном режиме. Для работы каждого экземпляра интерпретатора Perl создается отдельная нить сервера Apache 4. При этом каждая нить сервера с интерпретатором требует около 10-15 мегабайт, так что увеличение количества нитей приводит к резкому росту потребления ОЗУ 5.
Проблема усугубляется тем, что используемая в NSUts библиотека для работы с MySQL Apache::DBI имеет известные проблемы при работе в многопоточной версии Apache2 и требует создания не нити, а процесса на каждый экземпляр сервера 6. Кроме того, каждая нить занимает соединение с базой данных и требует соответствующего увеличения лимитов сервера СУБД.
Для проведения Всесибирской олимпиады были эмпирически подобраны параметры сервера Apache, которые позволяли бы обработать ожидаемое количество пользователей и при которых достигалось бы приемлемое время загрузки страниц. Увеличением максимального количества серверных процессов до 150 (по сравнению с 20 по умолчанию) удалось избежать неконтролируемого роста задержки при обработке пользовательских запросов, но даже в таких условиях время обработки запросов 1 000 пользователей может достигать нескольких секунд [2]. Потребление оперативной памяти при нагрузочном тестировании с такими настройками могло достигать 7 гигабайт (указано общее потребление физического ОЗУ для серверов Apache и MySQL).
4 mod_perl: Performance Considerations Under Different MPMs. http://perl.apache.Org/docs/2.0/user/performance/ mpm.html (дата обращения 11.12.2014).
5 Configuring Apache for Maximum Performance.
6 mod_perl: Performance Considerations Under Different MPMs.
Стандартными решениями для данной проблемы являются либо повышение эффективности кэширования, либо уменьшение объема передаваемых данных в каждой клиентской сессии [6; 7]. Как было показано, резервы для улучшения эффективности кэширования в рамках существующей архитектуры NSUts очень ограниченны. Это ставит вопрос о пересмотре архитектуры.
Технологии AJAX/AJAJ
В веб-приложениях нового поколения, таких как Gmail или Facebook, широко используются технологии снижения объема передаваемых данных, основанные на динамическом HTML.
Идея состоит в том, что клиент использует приложение на JavaScript, которое запрашивает с сервера только данные (в случае страницы просмотра очереди NSUts - содержимое очереди), а затем форматирует эти данные в соответствии с заложенными в код приложения стилями и форматами. Таким образом, информация о формате передается в составе кода приложения или в виде отдельных статических веб-ресурсов. Поскольку ни код, ни эти ресурсы не изменяются во время работы приложения, они могут эффективно кэшироваться как на клиенте, так и на промежуточных прокси-серверах. Сами данные могут быть представлены в компактном формате, и их размер может быть уменьшен на порядок по сравнению с форматированной HTML-страницей.
Естественным развитием данного подхода может быть передача не всех данных, а только изменений с момента последнего обновления страницы. Так, вместо передачи всего состояния очереди тестирования можно передавать только последние изменения, которые, как правило, затрагивают только последнюю отправленную на тестирование задачу. Это могло бы уменьшить объем передаваемых данных еще на порядок.
В первых поколениях приложений такого типа для представления данных использовался XML, откуда происходит одно из названий данной технологии - AJAX (Asynchronous JavaScript and XML) [8]. В последние годы для передачи данных чаще используется формат JSON (JavaScript Object Notation) 7, поскольку он компактнее XML и его проще разбирать и генерировать. Для обозначения приложений, использующих JSON, иногда используется аббревиатура AJAJ (Asynchronous JavaScript And JSON), но часто их также описывают как AJAX, ведь общий подход к построению приложения в обоих вариантах подхода одинаков.
Таким образом, вместо приложения, в котором вся работа, как по выборке данных, так и по их отображению и форматированию, происходит на сервере, получаем компонентное приложение, в котором клиент выполняет значительную часть работы. Принципы хорошей разработки таких приложений формулируются следующим образом:
1) состояние приложения должно сохраняться на стороне клиента;
2) клиентское приложение использует серверную часть только как поставщика данных;
3) серверное приложение предоставляет внешний интерфейс (API) и не должно делать никаких предположений относительно клиентов, использующих его [7; 8].
Применение этих принципов приводит к разделению приложения на две автономные части: RESTful веб-сервис [9] и одностраничное веб-приложение с JavaScript, которое использует этот сервис.
В результате клиентская часть приложения загружается один раз и в ходе использования только дозапрашивает данные от серверной части приложения, без полной перезагрузки всего содержимого после каждого действия. Это улучшает поведение приложения под большими нагрузками и, как будет показано позже, может резко снизить потребление вычислительных ресурсов сервером. Так как серверная часть не хранит сессию пользователя, появляется возможность горизонтально масштабировать серверную часть, увеличивая количество серверов. Поскольку серверная часть только передает данные в простом формате, это облегчает адаптацию приложения для поддержки разных браузеров и открывает возможность под-
7 The JavaScript Object Notation (JSON) Data Interchange Format. URL: http://www.rfc-editor.org/rfc/rfc7159.txt (дата обращения 11.12.2014).
держки клиентов, вообще не являющихся браузерами, например, приложений для мобильных устройств.
Описание прототипа NSUts 2.0
Для исследования целесообразности переработки NSUts под описанную выше архитектуру был разработан прототип NSUts 2.0. Поэтому перед принятием такого решения необходимо его обосновать, NSUts разрабатывалась много лет и имеет достаточно сложную функциональность, переписывание ее полностью с нуля несет достаточно большие риски.
Прототип использует ту же СУБД MySQL 5 и ту же модель данных, что и эксплуатируемая версия NSUts 1.3. Сохранение модели данных позволяет обеспечить чистоту сравнения с NSUts 2.0, а также использовать для нагрузочных тестов снимки состояния СУБД эксплуатируемой версии системы с большими объемами реальных данных.
Серверная часть приложения была переписана на PHP с применением фреймворка Laravel, что позволило обойти упомянутые выше проблемы взаимодействия Apache::DBI с многопоточной конфигурацией Apache.
В прототипе разработаны только версии страниц, перезагрузка которых создает наибольшую часть нагрузки во время крупных соревнований, а именно страницы очереди тестирования, списка участников (рис. 2) и рейтинга. Поскольку новая и существующая версия системы используют одну и ту же СУБД, возможна поэтапная миграция приложения на новую архитектуру, когда часть функциональности реализуется старыми скриптами на Perl, а часть - новыми страницами на основе динамического HTML.
Новости
Команда
Сдать задачу
Результаты
Рейтинг
Вопросы
Участники
Помощь
Печать
Олимпиада
Тур
Список участников
Название команды
Jury
Jury Jury Jury All Tor One НГТУ1
Novosibirsk STU 1
Zulcom
Debuggers
hronos
Danya
Novosibirsk STU 2
Город
Новосибирск
Новосибирск
Новосибирск
Новосибирск
Новосибирск
Новосибирск
Волгоград
Ставрополь
Санкт-Петербург
Новосибирск
Университет/ школа
НГУ
ИГУ
ИГУ
НГТУ
НГТУ
ШКОЛА 12
ВолгГТУ
Цод Поиск
СПбГПУ
НГТУ
10 25 50 100
Рис. 2. Список участников олимпиады в системе NSUts 2.0
Использование существующей модели данных ограничило возможности оптимизации архитектуры приложения. Так, в этой модели данных не предусмотрено временных штампов для некоторых типов изменений. Поэтому во многих случаях сервер не может определить, какие данные были изменены с момента последнего пользовательского запроса, и вынужден каждый раз пересылать все данные (например, все состояние очереди). Тем не менее, как покажут результаты сравнения производительности, даже такая архитектура дает значительный выигрыш по сравнению с используемой версией N8^8 1.3.
Сравнение производительности систем
Для нагрузочного тестирования использовалась следующая аппаратная конфигурация сервера: Intel Xeon X566G, 12GB RAM, 4GGB RAID5 storage, HP Smart Array G6 1GB.
Измерения проводились для трех программных конфигураций сервера.
1. NSUts 1.3: веб-сервер Apache 2.2.22, модуль для взаимодействия Apache с Perl mod-perl 2.G.7, язык выполнения серверных сценариев Perl 5.14.2, СУБД MySQL 5.5.4G.
2. NSUts 2.G: веб-сервер Apache 2.2.22, модуль для взаимодействия Apache с PHP modphp 5.4.35, язык выполнения серверных сценариев PHP 5.4.35, СУБД MySQL 5.5.4G.
3. NSUts 2.G-fpm: веб-сервер Nginx 1.2.1, FastCGI менеджер процессов PHP-FPM 5.4.35, СУБД MySQL 5.5.4G.
Результаты были получены с использованием приложения для нагрузочного тестирования Apache JMeter S. Данный инструмент написан на языке Java и работает на всех платформах, для которых есть реализация JVM. Он позволяет генерировать большое количество запросов с различных компьютеров и контролировать процесс с одного из них, использовать механизмы авторизации и поддержки сессий виртуальных пользователей, проводить тестирование не только по HTTP-протоколу.
Для тестирования использовалась страница со списком участников олимпиады, где их общее количество менялось от теста к тесту. Для выборки данных при тестировании не использовался постраничный вывод данных, поддерживаемый только в NSUts 2.G. В обеих версиях системы в каждом тесте передавался полный список участников.
Количество виртуальных пользователей, генерируемых инструментом для нагрузочного тестирования JMeter, было зафиксировано на значении 15G, время каждого теста составляя-ло SG секунд. Под пропускной способностью подразумевается отношение общего количества запросов к времени теста, а среднее время отклика - это среднее арифметическое времени отклика для каждого запроса.
На рис. 3, 4 представлены результаты нагрузочного тестирования вышеописанных конфигураций NSUts, где показана зависимость пропускной способности и времени отклика от количества участников в олимпиаде.
Пропускная способность и среднее время отклика для NSUts 2.G существенно превосходят соответствующие значения для NSUts 1.3, показатели улучшились вплоть до 1G раз. Результаты NSUts 2.G и NSUts 2.G-fpm отличаются несущественно, но использование FastCGI-менеджера процессов позволило уменьшить потребление памяти до 5 раз (см. таблицу) при тех же показателях производительности.
Объем потребляемой памяти для различных версий систем
Версия системы Максимальный объем потребляемой памяти, Мб
NSUts 1.3 7 GSS
NSUts 2.G 3 61G
NSUts 2.G-fpm 759
S Apache JMeter™. URL: http://jmeter.apache.org/ (дата обращения 11.12.2G14).
Рис. 3. Сравнение пропускной способности
Рис. 4. Сравнение среднего времени отклика
Рис. 5. Сравнение среднего объема передаваемых данных
Использование более простой структуры в формате JSON позволило существенно сократить объем передаваемых данных за счет отсутствия HTML-форматирования страницы (рис. 5).
Заключение
В статье рассмотрены проблемы производительности веб-интерфейса автоматизированной системы тестирования навыков программирования NSUts.
Для увеличения количества обслуживаемых пользователей и уменьшения времени ожидания на запросы была оценена целесообразность перехода к клиент-серверной архитектуре на основе динамического HTML. В экспериментальном прототипе были разработаны версии страниц, время перезагрузки которых наиболее критично в период крупных соревнований, а именно страницы очереди тестирования, списка участников и рейтинга.
Приведенные в статье данные нагрузочного тестирования веб-приложения традиционной архитектуры по сравнению с AJAX показывают, что переход к AJAX может повысить производительность и снизить потребление ресурсов сервером в разы и даже на порядки.
Список литературы
1. Kuuskeri J. Experiences on a Design Approach for Interactive Web Applications // Proceedings of the 2nd USENIX conference on Web application development. 2011. Р. 87.
2. Колбин Я. С. Нагрузочное тестирование автоматической системы проверки навыков программирования NSUTS // Материалы 51-й Междунар. науч. студ. конф. «Студент и научно-технический прогресс». Информационные технологии. 2013. С. 178.
3. Ботыгин И. А., Каликин К. А. Исследование методов увеличения производительности Web-приложений // Изв. Том. политехн. ун-та. 2008. Т. 312, № 5. С. 109-114.
4. Боженкова Е. Н., Иртегов Д. В., Киров А. В., Нестеренко Т. В., Чурина Т. Г. Автоматизированная система тестирования NSUts: Требования и разработка прототипа // Вестн. Ново-сиб. гос. ун-та. Серия: Информационные технологии. 2010. Т. 8, вып. 4. С. 46-53.
5. Черненок С. А. Обеспечение безопасности системы автоматизированного тестирования программных приложений // Материалы 50-й юбилейной Междунар. науч. студ. конф. «Студент и научно-технический прогресс». Информационные технологии. 2012. C. 63.
6. Souders S. High performance web sites. 1st ed. O'Reilly Media, 2007.
7. Souders S. Even Faster Web Sites: Performance Best Practices for Web Developers. 1st ed. O'Reilly Media, 2009.
8. МаклафлинБ. Изучаем Ajax. СПб.: Питер, 2008.
9. Fielding R. Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine, 2000.
Материал поступил в редколлегию 30.12.2014
E. N. Bozhenkova 1 2, D. V. Irtegov \ Ya. S. Kolbin 1
1 Novosibirsk State University, 2 Pirogov Str., Novosibirsk, 630090, Russian Federation
2 A. P. Ershov Institute of Informatics Systems SB RAN, 6Acad. Lavrentjev Ave., Novosibirsk, 630090, Russian Federation
[email protected], [email protected], [email protected]
PERFORMANCE OPTIMIZATION OF NSUTS WEB APPLICATION INTERFACE
BY USING DYNAMIC HTML
The paper is devoted to using of AJAX/AJAJ for performance optimization of automated testing system NSUts. Results of load testing (channel capacity, response time and others) the traditional web application versus its analogue with using AJAX/AJAJ are given.
Keywords: AJAX, AJAJ, dynamic HTML, web application performance.
References
1. Kuuskeri J. Experiences on a Design Approach for Interactive Web Applications. Proceedings of the 2nd USENIX conference on Web application development, 2011, p. 87.
2. Kolbin Ya. S. Load testing of automatic testing system for checking programming skills NSUTS. Proceedings of the 51st international students scientific conference «Students and progress in science and technology». Information technologies, 2013, p. 178. (In Russ.)
3. Botygin I. A., Kalikin K. A. Investigation of methods to increase Web-applications performance. Bulletin of the Tomsk Polytechnic University, 2008, vol. 312, no. 5, p. 109-114. (In Russ.)
4. Bozhenkova E. N., Irtegov D. V., Kirov A. V., Nesterenko T. V., Churina T. G. Automated testing system NSUts: requirements and the development of prototype. Vestnik of Novosibirsk State University. Series: Information Technologies, 2010, vol. 8, no. 4, p. 46-53. (In Russ.)
5. Chernenok S. A. Securing automatic testing system of software applications. Proceedings of the 50th international students scientific conference «Students and progress in science and technology». Information technologies, 2012, p. 63. (In Russ.)
6. Souders S. High performance web sites. 1st edition. O'Reilly Media, 2007.
7. Souders S. Even Faster Web Sites: Performance Best Practices for Web Developers. 1st edition. O'Reilly Media, 2009.
8. McLaughlin B. Head Rush Ajax. 1st edition. O'Reilly Media, 2006.
9. Fielding R. Architectural Styles and the Design of Network-based Software Architectures. Doctoral dissertation, University of California, Irvine, 2000.