Подтвердить что ты не робот

Необходим опыт работы с базой данных Heroku?

Мы сталкиваемся с серьезными проблемами масштабирования для нашей интеллектуальной поисковой системы/агрегатора. Наша база данных насчитывает около 200 тыс. Объектов. Из профилирования и newrelic кажется, что большинство наших проблем может исходить из базы данных. Мы используем самую маленькую выделенную базу данных Heroku (Ronin).

Мы изучали индексирование и кеширование. До сих пор нам удалось решить наши проблемы за счет сокращения запросов к базе данных и кэширования контента разумно, но теперь даже это, похоже, подходит к концу. Мы постоянно спрашиваем себя, действительно ли наш код/​​конфигурация достаточно хорош или если мы просто не используем достаточно "аппаратного обеспечения".

Мы подозреваем, что решение для базы данных, которое мы покупаем у Heroku, может выполняться недостаточно. Например, просто делать простой счет (без соединений, ничего нечего) на 200 тыс. Элементов занимает около 250 мс. Это похоже на долгое время, хотя postgres известен своей плохой производительностью по счетам?

Мы также начали использовать геолокационные поиски на основе широты/долготы. Оба столбца представляют собой индексированные поплавки. Выполнение расчета расстояния включает довольно сложную математику, но мы используем очень хорошо рекомендованный драгоценный камень geocoder, который, как предполагается, запускает очень оптимизированные запросы. Даже геокодер все еще занимает 4-10 секунд, чтобы выполнить поиск, скажем, 40 000 объектов, возвращая только предел первого ближайшего 10. Это снова звучит долгое время, и все опытные люди, с которыми мы консультируемся, говорят, что это звучит очень странно, снова намекая на производительность базы данных.

Итак, в основном мы задаемся вопросом: чего можно ожидать от базы данных? Может возникнуть проблема? И что мы можем ожидать, если решим обновить?

Дополнительный вопрос: я читаю здесь, что мы можем улучшить производительность, загрузив всю базу данных в память. Должны ли мы настраивать это сами, и если да, то как?

ОБНОВЛЕНИЕ НА ПОСЛЕДНИЙ ВОПРОС: Я получил это от полезных людей в поддержке Heroku:

"Это означает, что у вас достаточно памяти (достаточно большой базы данных) для хранения вашего горячего набора данных в памяти. Это не что-то вам нужно сделать вручную, Postgres настроен автоматически, используя все доступной памяти в наших выделенных базах данных.

Я взглянул на вашу базу данных, и похоже, что вы сейчас используя около 1,25 ГБ оперативной памяти, поэтому вы не увеличили использование памяти еще".

ОБНОВЛЕНИЕ НА НОМЕРА И ЦИФРЫ

Итак, теперь у меня было время посмотреть цифры и цифры, и я постараюсь ответить на следующие вопросы:

  • Прежде всего, db состоит из около 29 таблиц с большим количеством отношений. Но на самом деле большинство запросов выполняются на одной таблице (к ним присоединяются некоторые дополнительные ресурсы, чтобы предоставить всю необходимую информацию для представлений).
  • В таблице содержится 130 столбцов.
  • В настоящее время он содержит около 200 тыс. записей, но активен только 70 тыс., поэтому все индексы производятся как частичные индексы в этом "состоянии".
  • Все столбцы, которые мы ищем, индексируются правильно, и ни один из них не имеет текстового типа, а многие из них просто логические.

Ответы на вопросы:

  • Хм, базовая производительность, которую трудно сказать, у нас есть много разных вариантов. Время, которое требуется, варьируется обычно от 90 мс до 250 мс, выбирая ограничение в 20 строк. У нас есть много счетов в одной таблице, каждая из которых варьируется от 250 мс до 800 мс.
  • Хм, хорошо, что трудно сказать, потому что они не сделают это выстрелом.
  • У нас около 8-10 пользователей/клиентов, выполняющих запросы одновременно.
  • Загрузка нашего запроса: в новых отчетах о реликвиях он говорит об этом за последние 24 часа: throughput: 9.0 cpm, total time: 0.234 s, avg time: 25.9 ms
  • Да, мы рассмотрели планы запросов наших долговременных запросов. Запросы счетчика особенно медленны, часто более 500 мс для довольно простого подсчета на 70 тыс. Записей, сделанных на индексированных столбцах с результатом около 300
4b9b3361

Ответ 1

Я настроил несколько Rails-приложений, размещенных на Heroku, а также размещался на других платформах, и обычно проблемы попадают в несколько базовых категорий:

  • Выполнение слишком большого количества рубина, которое можно выполнить на уровне db (сортировка, фильтрация, объединение данных и т.д.).
  • Медленные запросы
  • Неэффективное использование индексов (недостаточно или слишком много)
  • Слишком сложно делать все в db (это не так часто встречается в рельсах, но это происходит)
  • Невозможно оптимизировать кэшируемые данные
  • Эффективное использование фоновой обработки

Сейчас его трудно помочь вам, потому что ваш вопрос не содержит каких-либо особенностей. Я думаю, что вы получите лучший ответ, если вы определите самую большую проблему, с которой вам нужна помощь, а затем спросите.

Некоторая информация, которая поможет нам вам помочь:

  • Каково среднее время отклика ваших действий? (из новой реликвии, анализатора запросов, журналов)
  • Каков самый медленный запрос, с которым вы хотите получить помощь?
  • Каковы запросы и код в этом запросе?
  • Является ли производительность сайта другой, когда вы запускаете ее локально против heroku?

В конце концов, я думаю, вы обнаружите, что это не проблема для Heroku, и если бы ваше приложение было развернуто на Amazon, engineyard и т.д., вы имели бы такую ​​же производительность. Хорошая новость заключается в том, что я думаю, что ваши проблемы распространены, и не следует слишком сложно исправить, как только вы сделали некоторые бенчмаркинга и профилирования.

-Джон МакКафри

Ответ 2

Мы постоянно спрашиваем...

... это кажется очень...

... что подозревается...

... Что мы можем ожидать...

Хорошие новости! Вы можете положить и положить конец кажущимся, подозревающим удивление и ожидание через волшебство измерения.

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

  • Какова базовая производительность БД, выполняющая последовательное сканирование и однострочные индексы? Вы говорите, что Heroku говорит, что ваша БД подходит в ОЗУ, поэтому вы не должны видеть проблемы ввода-вывода диска при измерении.
  • Соответствует ли эта производительность тому, что говорит Героку?
  • Сколько одновременных клиентов?
  • Что загружает ваш запрос - какие запросы и как часто?
  • Вы проверили планы запросов для любого из ваших подозрительно длительных запросов?

Как только у вас будет такая информация, может быть, кто-то может сказать что-то полезное. Поскольку это означает все, что вы читаете, это просто догадки.

Ответ 3

Во-первых: вы должны проверить свою конфигурацию postgres. (показать все из psql или другого клиента или просто посмотреть postgres.conf в каталоге данных). Параметр с наибольшим воздействием на производительность - effective_cache_size, который должен быть установлен примерно (total_physical_ram - memory_in_use_by_kernel_and_all_processes). Для 4-гигабайтной машины это часто составляет около 3 ГБ (4-1). (это очень тонкая настройка, но даст наилучшие результаты для первого шага)

Во-вторых: зачем вам все подсчеты? Лучше используйте типичный запрос: просто спросите, что нужно, а не то, что доступно. (причина: оптимизация для COUNT (*) невозможна: либо всю таблицу, либо весь индекс нужно отсканировать)

В-третьих: начните сбор и анализ некоторых запросов (для типичных запросов, которые плохо работают). Вы можете получить план запроса, поставив EXPLAIN ANALYZE перед фактическим запросом. (другой способ - увеличить уровень ведения журнала и получить их из файла журнала). Плохой queryplan может указывать на отсутствие статистики или индексов или даже при плохом моделировании данных.

Ответ 4

Мониторинг Newrelic может быть включен в качестве дополнения для heroku (http://devcenter.heroku.com/articles/newrelic). По крайней мере, это должно дать вам много информации о том, что происходит за кулисами, и может помочь вам определить некоторые проблемы.