MySQL "Too many connections" ошибка, на которую влияет количество экземпляров беспородных? - PullRequest
1 голос
/ 15 марта 2011

Недавно я начал получать ошибки MySQL «слишком много соединений» во время большого трафика. Мое приложение rails работает на кластере mongrel с двумя экземплярами на общем хосте. Некоторые недавние изменения, которые могут привести к этому:

  • Увеличился трафик на мой сайт. я в настоящее время в среднем около 4 тыс. страниц день.
  • Размер базы данных увеличился. Моя самая большая таблица имеет ~ 100К строк. Некоторые ассоциации могут вернуться несколько сотен экземпляров в наихудший случай, хотя большинство гораздо меньше.
  • Я добавил некоторые функции, которые увеличил количество и размер вызовы базы данных в некоторых действиях.

Я сделал обзор кода, чтобы уменьшить количество обращений к базе данных, оптимизировать запросы SQL, добавить недостающие индексы и использовать: include для быстрой загрузки. Однако многие из моих методов по-прежнему выполняют 5-10 отдельных вызовов SQL. У большинства моих действий время отклика составляет около 100 мс, но одно из моих наиболее распространенных действий составляет в среднем 300–400 мс, а некоторые действия случайным образом достигают максимума более 1000 мс.

Журналы мало помогают, так как ошибки кажутся случайными или, по крайней мере, шаблон не связан с вызываемыми действиями или доступом к данным.

Могу ли я устранить ошибку, добавив дополнительные экземпляры монгрел? Или соединения mySQL ограничены сервером и, следовательно, не связаны с количеством процессов, на которые я делю трафик?

Это, скорее всего, проблема с моим кодированием, или я должен нажимать на свой хост для большей емкости / меньшей нагрузки на общем сервере?

Ответы [ 3 ]

2 голосов
/ 16 марта 2011

ActiveRecord объединяет соединения с базой данных начиная с Rails 2.2, и вполне вероятно, что именно здесь возникают ваши избыточные соединения.Попробуйте уменьшить значение pool в вашем database.yml для этой среды (по умолчанию 5).

Документы можно найти здесь .

1 голос
/ 15 марта 2011

Что-то не так. Экземпляр Mongrel обрабатывает 1 запрос за раз, поэтому, если у вас есть 2 экземпляра Mongrel, вы не должны видеть более 2 активных подключений MySQL (по крайней мере от шавки)

Вы можете записать или отобразить вывод SHOW STATUS LIKE 'Threads_connected' с течением времени.

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

1 голос
/ 15 марта 2011

Вы что-нибудь кешируете?Это важная часть облегчения загрузки приложений и баз данных.В Rails Guides есть раздел о кешировании .

...