Как протестировать и оптимизировать действие Rails, действительно интенсивно использующее базу данных?

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

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

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

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

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


person David Rivers    schedule 30.07.2010    source источник
comment
Какой механизм хранения вы используете InnoDB или MyISAM? InnoDB использует блокировку таблицы на уровне строк, которая должна позволять другим вашим запросам работать, пока выполняются ваши большие запросы. MyISAM использует блокировку на уровне таблицы, которая, по-видимому, происходит с вашими запросами. Вы делаете большой запрос к этой таблице статистики, в которой есть вставки со всех остальных страниц, пока этот большой запрос выполняется, остальная часть сайта будет заблокирована до тех пор, пока запрос не будет выполнен, если вы находитесь на MyISAM.   -  person Jonathan Park    schedule 31.07.2010
comment
Джонатан, отличная зацепка. Я не уверен, но запускаю шоу-движки; в mysql показывает, что MyISAM, по-видимому, установлен как ПО УМОЛЧАНИЮ, в то время как InnoDB (и 3 других движка), по-видимому, поддерживаются. Вы знаете, как это определить наверняка? Пока гугление мало помогает...   -  person David Rivers    schedule 31.07.2010
comment
Посмотрите на операторы SQL, сгенерированные приложением. Это может быть поучительным опытом. Некоторые запросы, сгенерированные ActiveRecord, могут быть неверными. Вы можете определить некоторые вещи, которые требуют ручного sql.   -  person seand    schedule 31.07.2010


Ответы (2)


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

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

person Ryan    schedule 01.08.2010

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

person David Rivers    schedule 06.08.2010
comment
Я бы по-прежнему рекомендовал предложенную мной статью о построении/масштабировании. плагин query_reviewer отлично помогает найти отсутствующие индексы и правильно их реализовать. Я знаю, что ваша проблема решена, но я хотел бы добавить это сюда для всех, кто может искать помощи. - person Ryan; 31.08.2010