Как мы боролись с проблемами производительности в «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-запросов само по себе наводит на подозрение:
Если посмотреть более подробную статистику, то можно понять, что при открытие странички генерируются циклические SQL-запросы и эту проблему нужно устранить.
Даже после того, когда пришло более глубокое понимание Active record в Rails, периодически, циклические запросы пролазили на рабочий сервер. Поэтому мы решили, что тестировщик, проверяя задачу, в обязательном порядке должен анализировать информацию из Rack Mini Profiler на наличие долгих и циклических запросов.
Плагин для Redmine — «RmPlus DevTools»
Rack Mini Profiler по умолчанию включен в development-среде и выключен в production. Но часто бывает нужно проанализировать ситуацию с производительностью именно в production-среде и у конкретного пользователя, поэтому мы написали небольшой плагин для Redmine, который подключает Rack Mini Profiler в production-среду Redmine и позволяет подключать профилирование только для конкретного пользователя – Redmine Dev Tools.
Также, этот плагин подключает джем Oink (про него расскажу немного позже) и дает возможность вести более удобную разработку плагинов для Redmine в development-среде: нет необходимости перезагружать web-сервер для того, что бы изменения в JS-файлах применялись на странице.
«OINK»
Oink это еще один суперполезный джем для анализа проблем с производительностью. Он очень помог, когда у нас на рабочем сервере стала утекать память. Один из процессов Rails по непонятным причинам выедал больше гигабайта оперативной памяти и вешал весь Remine.
Как следствие: кучка звонков на телефон, мурашки по коже и легкое ощущение бессилия.
Oink позволяет проанализировать, какие контроллеры и экшены Rails съедают память, задав пороговое значение. Эта статистика проливает свет на источник проблемы, после чего устранение источника проблемы становится более тривиальным.
oink --threshold 50 /usr/share/srv-redmine/redmine-2.5/log/oink.log
Как-то вот так! Надеюсь, моя статья будет полезной. Мне она бы очень пригодилась в свое время.
Автор: tdvsdv