2015-12-02 2 views
2

Я использую apache и puma для развертывания приложения. Я использую PostgreSQL. Code on github. Мои приложения работают медленно. когда я генерирую несколько тысяч строк в одной таблице, производительность начинает ухудшаться, но все же приемлема. Я все еще могу обрабатывать 5 запросов в секунду. Когда я добавил миллион строк в одну таблицу, один запрос выполняется за 8 секунд, и представления, похоже, генерируются навсегда. Я добавил индексы и написал необработанные SQL-запросы несколько раз, но производительность все еще очень медленная.Как масштабировать приложения Rails

Где я могу начать оптимизацию применения рельсов? Как я могу получить не менее 50 запросов в секунду?

+3

Прежде всего, необходимо определить корень причина. Являются ли запросы базы данных медленными - что делать, если вы запускаете эти запросы непосредственно в базе данных без Rails? Слишком много запросов (N + 1 запросов)? Вы загружаете слишком много объектов в память? – spickermann

+3

Я спрашиваю об этом, так как вы упоминаете, что это проекты курса: вы измеряете в производственной среде? Потому что среда разработки по умолчанию не предназначена для масштабирования, а для облегчения разработки. – Martijn

+0

все, перед тем как оставить комментарий, я также могу добавить его, вы можете использовать bullet для n + 1 http://railscasts.com/episodes/372-bullet?view=asciicast прочитать это также для кеша-счетчика и для увеличения размера буфера maxclient для одновременной работы pg –

ответ

4

Я рекомендую настроить Mini Profiler, чтобы попытаться определить ваши узкие места. В частности, обратите внимание на N+1 problem (рассмотрите возможность использования Bullet, если это - проблема).

Избегайте зацикливание на все ваши ряды и инстанцировании модель для каждого, тем самым поглощая память:

User.all.each do # Bad 
User.find_each do # Better 

Использование пагинация (проверить Kaminari или WillPaginate), чтобы избежать рендеринга страниц со слишком большим количеством строк.

0

Перед оптимизацией - собирайте статистику (например, используйте зонд-запрос-лог-анализатор) и определите, какие запросы занимают больше всего в средней медлительности.

Например, у вас может быть 8-секундный запрос, который выполняется один раз в неделю, и 0,5 секунды, который запускается каждую секунду, чтобы ускорить работу приложения, сначала оптимизировав последнее.

Для медленных запросов - просто загляните в их журналы и сузите узкие места - db/views/etc.

Далее следует общий совет - «код не работает быстрее, чем никакой код», прежде чем идти в исходные SQL-запросы, писать C-расширения и т. Д. Сначала рассмотрите сложность ваших алгоритмов, плохо написанная O (n) будет работать быстрее, чем -оптимизированный O (n^2), O (1) быстрее, чем O (n)

Более конкретно для веб-программирования - каждый запрос на что-либо внешнее (db/webservices/memcache/etc.) требует времени, данные также подсчитываются, избегайте отдельного запроса каждого элемента в коллекции, если вы можете получить их все сразу или за меньшее количество запросов (по этой причине рельсы имеют активную загрузку для ассоциаций)

Сначала я бы посмотрел на избыток db запрос, удаление е ненужные запросы и смотреть на планы выполнения (ака explain ..) для тех, кто остается

Третья вещь мусора, но я не думаю, что это узкое место для вас в данный момент

Смежные вопросы