Сколько соединений можно ожидать между PHP и MySQL на отдельном сервере? - PullRequest
2 голосов
/ 29 мая 2009

Попытка разделить мое приложение LAMP на два сервера, один для php и один для mysql. Пока приложение подключается локально через файловый сокет и работает нормально.

Я беспокоюсь о количестве подключений, которые я могу установить, если это через сеть. Я тестировал tcp-соединения в unix для целей тестирования, и я знаю , что вы не можете превысить определенное количество соединений в секунду, в противном случае он останавливается из-за нехватки ресурсов (будь то сокеты, дескрипторы файлов или что-то еще) ). Я также понимаю, что php не реализует пул соединений, поэтому для каждой загрузки страницы необходимо устанавливать новое соединение по сети. Я также посмотрел в pconnect для php, и это, кажется, приносит больше проблем.

Я знаю, что это очень распространенная установка (php + mysql). Может ли кто-нибудь предоставить информацию о типичном использовании и статистике, которую они получают со своих серверов? Спасибо!


Проблема не связана с нехваткой соединений, разрешенных моим MySQL. Основная проблема в том, что unix не может очень быстро создавать и разрывать TCP-соединения. Сокеты заканчиваются в TIME_WAIT, и вам нужно подождать некоторое время, прежде чем освободить больше сокетов для повторного подключения. Эти два скриншота ясно показывают эту картину. MySQL работает до определенного момента, а затем делает паузу, потому что на веб-сервере закончились сокеты. По прошествии определенного времени веб-сервер смог установить новые соединения.

альтернативный текст http://img35.imageshack.us/img35/3809/picture4k.png

альтернативный текст http://img35.imageshack.us/img35/4580/picture2uyw.png

Ответы [ 2 ]

2 голосов
/ 29 мая 2009

Я думаю, что предел составляет 65535. Таким образом, вам нужно одновременно иметь 65535 подключений, чтобы достичь этого предела, поскольку обычное подключение mysql закрывается автоматически.

mysql_connect ()

Примечание: ссылка на сервер будет закрыта, как только закончится выполнение скрипта, если только он не был закрыт ранее явным вызовом mysql_close ().

Но если вы используете постоянное соединение mysql , то вы можете столкнуться с проблемой.

Использование постоянных соединений может потребовать небольшой настройки ваших конфигураций Apache и MySQL, чтобы гарантировать, что вы не превысите количество соединений, разрешенных MySQL.

1 голос
/ 29 мая 2009

Каждое соединение MySQL фактически использует несколько мегабайт оперативной памяти для различных буферов и требует времени для настройки, поэтому MySQL ограничен 100 одновременными открытыми соединениями по умолчанию. Вы можете увеличить этот лимит, но лучше тратить свое время на попытки ограничить количество одновременных подключений различными способами.

Остерегайтесь слишком большого поднятия лимита соединения, так как вы можете исчерпать память (которая, я считаю, приводит к сбою mysql), или вы можете вытолкнуть важные вещи из памяти. например Производительность MySQL сильно зависит от того, как ОС автоматически кэширует данные, которые он читает с диска в памяти; если вы установите слишком высокий лимит подключений, вы будете бороться за память с кешем.

Если вы не увеличите лимит подключений, у вас закончатся соединения задолго до того, как вы исчерпаете сокеты / обработчики файлов / и т.д. Если вы увеличите лимит подключений, у вас закончится ОЗУ задолго до того, как у вас закончатся сокеты / файловые дескрипторы / и т. Д.

Относительно ограничения одновременных подключений:

  1. Используйте решение для пула соединений. Вы правы, в PHP нет ни одного встроенного, но есть множество автономных на выбор. Это экономит дорогостоящее время установки / разрыва соединения.
  2. Открывать соединения с базой данных только тогда, когда они вам абсолютно необходимы. В моем текущем проекте мы автоматически открываем соединение с базой данных при первом запросе, а не мгновение назад; мы также освобождаем соединение после того, как выполнили всю работу с нашей базой данных, но до того, как HTML страницы действительно будет сгенерирован Чем короче период времени, в течение которого вы держите соединения открытыми, тем меньше соединений будет открыто одновременно.
  3. Кэшируйте все, что вы можете в более легком решении, таком как memcached. Мой текущий проект временно кэширует страницы, отображаемые анонимным пользователям (поскольку каждый анонимный пользователь получает один и тот же HTML, в конце концов - зачем беспокоиться о повторном выполнении запросов к одной и той же базе данных через несколько скудных миллисекунд?), То есть соединение с базой данных не требуется в все. Это особенно полезно для всплесков анонимного трафика, например, на первой странице digg.
...