Как сравнить и оптимизировать действительно интенсивное действие с базой данных Rails? - PullRequest
1 голос
/ 30 июля 2010

В разделе администрирования сайта клиента есть действие, скажем Admin :: Analytics (которое я не создавал, но должен поддерживать), которое компилирует аналитику использования сайта, выполняя пару десятков довольно интенсивных запросов к базе данных. Эта функция всегда была узким местом для производительности приложения при компиляции аналитического отчета. Но в последнее время узкое место стало настолько серьезным, что при доступе к сайту он резко останавливается и зависает на неопределенный срок. До вчерашнего дня у меня никогда не было причин запускать команду «top» на сервере, но, поняв это, я понял, что Admin :: Analytics # index заставляет mysqld вращаться со скоростью свыше 350 +% мощности ЦП на четырехъядерный, производство VPS.

Я скачал свежие копии производственных данных и журнала производства. Однако, когда я получаю доступ к Admin :: Analytics # index локально на моем блоке разработки, используя производственные данные, он загружается примерно через 10 - 12 секунд (и использует ~ 150 +% моего двухъядерного процессора), что, к сожалению, нормально , Я предполагаю, что может быть несоответствие в настройках mysql, которое внезапно вступает в игру. Кроме того, mysqldump базы данных теперь составляет 531 МБ, тогда как это было всего 336 МБ 28 дней назад. В любом случае, у меня нет корневого доступа на VPS, поэтому настройка производительности mysqld была бы обременительной, и я бы очень хотел найти точную причину этой проблемы. Однако журналы производства не содержат информации. по запросам; они просто сообщают о длине этих запросов, которая в среднем составляет несколько минут за штуку (хотя они, похоже, приводили к тому, что mysqld зависал гораздо дольше, чем это, и побуждали меня запросить у нашего хоста перезагрузку mysqld просто для того, чтобы восстановить работу нашего сайта. в одном случае).

Полагаю, я могу попробовать повысить уровень журнала в рабочей среде, чтобы запросить информацию. на запросы к базе данных, выполняемые Admin :: Analytics # index, но в то же время я боюсь повторить это поведение в рабочей среде, потому что я не чувствую необходимости вызывать наш хост для повторного запуска mysqld! Это действие содержит один запрос к базе данных в своем контроллере и пару десятков подготовленных операторов, встроенных в его представление!

Как бы вы приступили к тестированию / диагностике и оптимизации / исправлению этого действия?!

(в сторону: очевидно, я хотел бы полностью заменить эту функцию на Google Analytics или аналогичное решение, но мне нужно исправить эту проблему, прежде чем продолжить.)

Ответы [ 2 ]

5 голосов
/ 01 августа 2010

Я бы порекомендовал взглянуть на эту статью: http://axonflux.com/building-and-scaling-a-startup

В частности, query_reviewer и newrelic были спасением для меня.

0 голосов
/ 06 августа 2010

Я ценю всю помощь в этом, но что оказалось исправлением, так это добавление нескольких индексов в таблицу Analytics для обслуживания запросов в этом действии. Простая миграция Rails для добавления индексов и действия теперь загружается менее чем за секунду как на моем компьютере разработчика, так и на prod!

...