Пул соединений (*только* версии 1.2.0-1.2.12)
Замечание:
Этот раздел больше не относится к версии 1.3.0 драйвера и служит только исторической справкой о том, как пулы работали.
В последних версиях драйвера больше нет концепции объединения в пул, и для каждого типа подключения (ReplicaSet / standalone / mongos) для каждой комбинации учетных данных будет поддерживаться только одно подключение.
Создание соединений - одна из самых тяжелых вещей, которую делает драйвер. Для правильной настройки соединения может потребоваться сотни миллисекунд, даже в быстрой сети. Таким образом, драйвер пытается минимизировать количество новых соединений, созданных путем повторного использования соединений из пула.
Когда пользователь создает новый экземпляр MongoClient, все необходимые соединения будут взяты из их пулов (для наборов реплик может потребоваться несколько соединений, по одному для каждого члена набора). Когда экземпляр MongoClient выходит из области видимости, соединения будут возвращены в пул. Когда процесс PHP завершится, все соединения в пулах будут закрыты.
"Почему у меня так много открытых соединений?"
Пулы соединений могут генерировать большое количество соединений. Это ожидается, и, используя небольшую арифметику, вы можете выяснить, сколько соединений будет создано. Существует три фактора, определяющих общее количество соединений:
-
connections_per_pool
Каждый пул соединений создает по умолчанию неограниченное количество соединений. Можно предположить, что это проблема: если он может создавать неограниченное количество соединений, не может ли он создать тысячи, и на сервере не хватит файловых дескрипторов? На практике это маловероятно, поскольку неиспользуемые соединения возвращаются в пул для последующего использования, поэтому будущие соединения будут использовать то же соединение, а не создавать новое. Если вы не создадите тысячи соединений одновременно, не выходя за рамки, количество открытых соединений должно оставаться на разумном количестве.
Вы можете увидеть, сколько подключений у вас в пуле, используя функцию MongoPool::info(). Добавьте поля "in use" и "in pool" для данного сервера. Это общее количество соединений для этого пула.
-
pools_per_process
Каждый адрес сервера MongoDB, к которому вы подключаетесь, получает свой пул подключений. Например, если вашим локальным именем хоста является "example.net", при подключении к "example.net:27017", "localhost: 27017" и "/tmp/mongodb-27017.sock" будут созданы три пула соединений. Вы можете увидеть, сколько пулов соединений вы открыли, используя MongoPool::info().
-
processes
Каждый процесс PHP имеет отдельный набор пулов. PHP-FPM и Apache обычно создают от 6 до пары десятков рабочих PHP-процессов. Проверьте свои настройки, чтобы увидеть, какое максимальное количество PHP-процессов может быть запущено.
Если вы используете PHP-FPM, подсчет количества соединений может быть сложным, потому что это вызовет больше процессов PHP-FPM под большой нагрузкой. Чтобы быть в безопасности, посмотрите на параметр
max_children
или добавьтеspare_servers
+start_servers
(выберите любое большее число). Это будет указывать, сколько PHP-процессов (т.е. наборов пулов) необходимо планировать.
Три вышеупомянутые переменные можно перемножить,
чтобы получить максимальное число ожидаемых соединений:
connections_per_pool
* pools_per_process
* processes
.
Обратите внимание, что connections_per_pool
может быть разным для разных пулов,
так что connections_per_pool
должен быть максимальным.
Например, предположим, что мы получаем 30 подключений на пул, 10 пулов на процесс PHP и 128 процессов PHP. Тогда мы можем ожидать 38400 подключений с этой машины. Таким образом, мы должны установить лимит файловых дескрипторов этой машины достаточно высоким, чтобы обрабатывать все эти соединения, или он может исчерпать файловые дескрипторы.
Для получения дополнительной информации о пуле соединений смотрите MongoPool.