Як ми боролися з проблемами продуктивності в «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

 
 
 
Якось ось так! Сподіваюся, моя стаття буде корисною. Мені вона б дуже знадобилася в свій час.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.