Ускорение приложений для Ruby on Rails - PullRequest
4 голосов
/ 03 февраля 2012

У меня есть действие контроллера, выполнение которого занимает 10 секунд. Большую часть времени проводят в виде большого файла (более 1500 строк). Как мне отладить проблему скорости?

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

Юо может попробовать NewRelic , например.Я использовал бесплатную версию несколько лет назад, и вы можете видеть общую производительность и особенно медленные вызовы довольно хорошо.
Насколько я помню, вам нужно только установить гем, настроить некоторые вещи, и это хорошо.

2 голосов
/ 03 февраля 2012

NewRelic - лучший способ анализа приложения.

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

  • Проблема запроса N + 1
  • Тестирование N + 1
  • Вложенная активная загрузка
  • Непрямая активная загрузка
  • Группировка рельсов и агрегатные вычисления
2 голосов
/ 03 февраля 2012

Ruby и Rails имеют базовые инструменты профилирования, которые могут вам помочь.Взгляните на это руководство по Rails: Тестирование производительности приложений Rails .

На этой странице описывается, как вы можете написать тестовые случаи, предназначенные для тестирования производительности, чтобы предотвратить снижение производительности и как вы можете выполнить профилирование, котороеможет быть так просто:

rails profiler 'Ruby.code.to.run'

Если это не сработает, подумайте об использовании New Relic .Но я бы также взглянул на Rack-Bug (кстати, у него есть ветвь Rails 3 для Rails 3).Rack-Bug - это панель инструментов для отладки, которая дает вам множество замечательных метрик о том, сколько времени было потрачено на запрос, и делает это прямо в браузере, наряду с обычным ответом, так что это наименее болезненно.

Теперь, то, что вы делаете неправильно:

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

Поэтому рассмотрите возможность перемещения этой обработки в очередь заданий. Delayed_job довольно надежен, правильно поддерживается и работает с Rails 3.

Таким образом, ваш взгляд зарегистрирует новую работу и вернется.И когда работа будет завершена, вы установите где-нибудь флаг, что она будет выполнена.Затем с помощью специального вызова API вы можете проверять его полноту из клиентского Javascript раз в несколько секунд.И после завершения вы можете показать результаты, перенаправить или начать загрузку или что-то еще, снова из Javascript.

И если вышеупомянутое не вариант (возможно, это страница, которая показывает отчет, который должен быть мгновенным)первое узкое место, которое вы должны рассмотреть, это выполнение SQL-запросов, поэтому ознакомьтесь с командой MySQL DESCRIBE (или EXPLAIN PostgreSQL).Таким способом легко увидеть, где вам нужны индексы.

0 голосов
/ 03 февраля 2012

Я бы предложил обернуть несколько маленьких частей вашего вида в блоки benchmark и посмотреть в log / development.log, где находятся медленные части.

<% benchmark "Showing users" do %>
  <!-- ... -->
<% end %>

<% benchmark "Performing some calculations" do %>
  <!-- ... -->
<% end %>

В лучшем случае вы найдете несколько мест, где тратится 90% времени. Затем вы можете работать над ними, чтобы значительно улучшить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...