2015-05-29 2 views
0

Во-первых, установка сервера:непоследовательно медленные запросы в производстве (RDS)

  • Nginx во внешнем интерфейсе к миру
  • gunicorn работает приложение колба с GEvent рабочих
  • Postgres базы данных, соединение объединенных в приложении , работает с Amazon RDS, связанных с psycopg2 исправлен для работы с GEvent

проблема Я сталкиваюсь необъяснимо медленные запросы, которые иногда работает порядка 100 мс или около того (ид eal), но которые часто растут до 10 или более. Хотя время является параметром в запросе, разница между быстрым и медленным запросом происходит гораздо чаще, чем изменение набора результатов. Это не похоже на какой-либо значимый всплеск использования ЦП, использования памяти, ввода/вывода чтения/записи, частоты запросов и т. Д. Это кажется произвольным.

Я пробовал:

  • Оптимизация запроса - безусловно, правильный, но она работает очень хорошо на местном уровне, а также в любое время я попробовал его непосредственно на сервере через PSQL.
  • Выполняется на большом/улучшенном экземпляре RDS - В настоящее время я работаю над экземпляром m3.medium с PIOPS и не приближаюсь к этой скорости чтения, поэтому я не думаю, что это проблема.
  • Тонкая настройка рабочих-пулеметчиков - Я думал, что это может быть проблемой, если драйвер psycopg2 слишком сильно переключается на контекстный переключатель, но это не повлияло.
  • Подробнее - Я работал на достойное количество времени, так что это были всего лишь две вещи, которые я пробовал.

Есть ли у кого-нибудь идеи по отладке этой проблемы?

+0

Похоже, что это может быть взрывная деятельность контрольной точки; включите 'log_checkpoints' и установите подходящее' log_min_duration_statement', чтобы просмотреть интересующие запросы и/или использовать 'auto_explain'. –

+0

Возможно ли это, если в то время не было записей? База данных в основном доступна только для чтения (с заметным исключением, но это не работает в данный момент). Я понимаю, что контрольные точки предназначены для записи, а не для чтения. –

+0

Контрольные точки все еще выполняются, когда нет активности записи на уровне пользователя, но в целом они не заметны. Так что нет, я бы не сказал, что все. –

ответ

0

Вы можете попробовать это изнутри psql, чтобы получить более подробную информацию о времени запроса. EXPLAIN sql_statement Также включите больше регистрации базы данных. mysql имеет медленный анализ запросов, возможно, PostgreSQL имеет эквивалент.

+0

'auto_explain' в частности, да и' pg_stat_statements'. –

1

Это то, что разделяет аренда, дает вам непредсказуемые результаты.

Каков размер набора данных, на котором запущены запросы? Хотя Крейг говорит, что это звучит как активность контрольно-пропускного пункта, это не имеет смысла, потому что это RDS. Это больше похоже на выпадение кеша, например; ваши отношения падают из кеша.

Вы говорите, что используете piops, но m3.medium не является оптимизированным экземпляром EBS.

Вам нужно по крайней мере:

  1. Высокий уровень экземпляра. Убедитесь, что ваша память больше, чем активный набор данных.

  2. EBS Оптимизированные экземпляры, смотрите здесь: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html

  3. Много памяти.

  4. PIOPS

К тому времени у вас есть все, что вы понимаете, что вы сэкономите кучу денег толкающего PostgreSQL (или любую базу данных), чтобы обнажить металл и оставляя АМС к тому, что это хорошо , Память и процессор (не IO).

+0

Полный набор данных в настоящее время составляет около 65 ГБ, однако данные разбиваются на таблицы, поэтому имеется гораздо меньший набор функциональных данных (за один раз запрашивается только один набор таблиц). Тем не менее, некоторые из таблиц находятся в нескольких миллионах рядов. Я не думаю, что мы сможем иметь память выше, чем размер набора данных, а не обанкротить нас. –

+0

Возможно также выделенный экземпляр, например. http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/dedicated-instance.html. Честно говоря, я считаю, что гораздо практичнее использовать реальное оборудование или VPS с реальным локальным выделенным хранилищем. –

+0

@ MatthewFitzGerald-Chamberlain Учитывая, что это звучит как довольно типичная проблема с кэшированием и отсутствием проблемы с поиском. Иногда возникают медленные запросы, когда вы получаете холодные данные. Трудно сказать точно без подробностей, желательно «объяснять (буферизировать, анализировать)» как из медленных, так и быстрых случаев. Посмотрите на модуль 'auto_explain'. –