Perfomance testing

Однажды я заметил, что godesigner.ru стал тормозить. Открываю страницу, а она не загружается. Правда, через несколько секунд страница отобразилась нормально. Потом через десять минут эта проблема снова повторилась. И ещё раз. Тут я понял, что есть проблема, посмотрел графики New Relic и ужаснулся — значение средней загрузки за двадцать минут возросло до 40 (должно быть не больше единицы)

Я увидел, что проблема началась ещё раньше, но это не сказывалось на быстродействии страниц. По повторяющимся спайкам графика я понял, что излишняя загрузка возникает при работе фоновых задач, которые запускаются по крону. Вскоре виновник был найден — это скрипт, который наполняет содержимым ленту новостей, а точнее строчка 3 в коде:

С каждым вызовом этого скрипта происходил вызов этого метода, внутри которого из базы данных собирались ВСЕ записи новостей без всяких ограничений. Этот список постоянно рост, скрипт работал медленнее и медленнее, вплоть до того, что один вызов скрипта не успевал отработать до следующего вызова по расписанию. Настоящая катастрофа из-за дурацкой ошибки.

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

Проблема в том, что такой код пройдёт юнит-тесты на малых объемах данных. При этом на больших объемах тесты будут исполняться долго, что мешает процессу TDD. Получается, что нам нужны отдельные тесты на быстродействие, которые будут проверять наш код на взаимодействие с большим количеством данных. Кроме времени исполнения надо отслеживать и другие вещи, например потребление памяти. Однако результаты могут отличаться в зависимости от среды — на продакшн сервере среда может сильно отличаться от тестового сервера, а тесты в браузере могут вести себя не так, как у пользователя на компьютере.

Я до конца не уверен, как правильно создавать и производить тестирование кода на производительность. Вот парочка ссылок, которые я нашёл по теме, когда искал информацию в интернете:
https://testitquickly.com/2008/12/08/essential-about-performance-testing/
https://msdn.microsoft.com/en-us/library/bb924357.aspx

Ещё я нашёл пару книг, которые прочитаю:
https://www.amazon.com/Art-Application-Performance-Testing-Programmers/dp/0596520662
https://www.amazon.com/Performance-Testing-Guidance-Web-Applications/dp/0735625700

Думаю, что после прочтения у меня будет понятие о тестировании производительности.


Also published on Medium.

Добавить комментарий