Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?

в 2:10, , рубрики: active record, plugins, redmine, ruby, ruby on rails, производительность, управление проектами, метки: , , , , ,

Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?
Конечно, статья не совсем верно названа. В чистом Redmine особо больших проблем с производительностью нет. Но мы, в процессе разработки большого количества плагинов, эти проблемы с легкостью вносили.

Поэтому, статья расскажет о том, как разобраться в чем причина медленной работы той или иной функции плагина Redmine и какие инструменты могут помочь в этом. Многие советы, естественно, могут касаться не только самого Redmine, но и Rails-приложений в целом.

Симптом у проблем с производительностью всегда один – это разгневанный пользователь, кричащий, клянущий твое ПО и возможно тебя лично.

Rack Mini Profiler

Чаще всего проблемы с долгим открытием какой-нибудь странички связаны с SQL-запросами. Это могут быть просто долго исполняющиеся SQL-запросы или циклические запросы вызванные особенностями механизма Active Record в ROR. В любом случае, Rack Mini Profiler – это мегополезная вещь для анализа проблем производительности в Redmine.

Rack Mini Profiler – это маленький gem, который устанавливается в пару команд и в режиме почти реального времени показывает, какие запросы выполнялись в процессе загрузки странички, и сколько ушло времени на каждый запрос. Для анализа проблем производительности, эта штука просто незаменимая.

На ранних стадиях программирования на Rails у меня было стойкое ощущение того, что Ruby on Rails настолько продуманный фреймфорк, что, пользуясь Active record, я просто выбирал нужные мне данные, думая, что обо всем остальном позаботились разработчики фреймворка.

В результате? я наплодил большую кучку циклических SQL-запросов. С ростом количества пользователей, некоторые странички стали открываться очень долго.

Rack Mini Profiler позволяет очень быстро найти причину долгого открытия странички у конкретного пользователя. Вот как, например, это может выглядеть, если не добавить «includes» в «active record» — конструкцию.

Общее количество SQL-запросов само по себе наводит на подозрение:

Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?

Если посмотреть более подробную статистику, то можно понять, что при открытие странички генерируются циклические SQL-запросы и эту проблему нужно устранить.

Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?

Даже после того, когда пришло более глубокое понимание Active record в Rails, периодически, циклические запросы пролазили на рабочий сервер. Поэтому мы решили, что тестировщик, проверяя задачу, в обязательном порядке должен анализировать информацию из Rack Mini Profiler на наличие долгих и циклических запросов.

Плагин для Redmine — «RmPlus DevTools»

Rack Mini Profiler по умолчанию включен в development-среде и выключен в production. Но часто бывает нужно проанализировать ситуацию с производительностью именно в production-среде и у конкретного пользователя, поэтому мы написали небольшой плагин для Redmine, который подключает Rack Mini Profiler в production-среду Redmine и позволяет подключать профилирование только для конкретного пользователя – Redmine Dev Tools.

Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?

Также, этот плагин подключает джем Oink (про него расскажу немного позже) и дает возможность вести более удобную разработку плагинов для Redmine в development-среде: нет необходимости перезагружать web-сервер для того, что бы изменения в JS-файлах применялись на странице.

«OINK»

Oink это еще один суперполезный джем для анализа проблем с производительностью. Он очень помог, когда у нас на рабочем сервере стала утекать память. Один из процессов Rails по непонятным причинам выедал больше гигабайта оперативной памяти и вешал весь Remine.

Как следствие: кучка звонков на телефон, мурашки по коже и легкое ощущение бессилия.

Oink позволяет проанализировать, какие контроллеры и экшены Rails съедают память, задав пороговое значение. Эта статистика проливает свет на источник проблемы, после чего устранение источника проблемы становится более тривиальным.

oink --threshold 50 /usr/share/srv-redmine/redmine-2.5/log/oink.log

Как мы боролись с проблемами производительности в «Redmine». Кто виноват и как помочь?

Как-то вот так! Надеюсь, моя статья будет полезной. Мне она бы очень пригодилась в свое время.

Автор: tdvsdv

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js