Agrupación de conexiones (versión 1.2.0-1.2.12 *solamente*)

Nota:

Esta sección ya no tiene relevancia a partir de la versión 1.3.0 del controlador y únicamente sirve como información histórica de cómo solía funcionar la agrupación.

Las últimas versiones del controlador ya no posee el concepto de agrupación, por lo que solamente mantendrá una conexión por proceso, para cada tipo de conexión (ReplicaSet/standalone/mongos), para cada combinación de credenciales.

La creación de conexiones es uno de las cosas más pesada que el driver realiza. Puede tomar miles de milisegundos establecer una conexión correcta, incluso en una red rápida. Por lo tanto, el driver intentará reducir el número de nuevas conexiones creadas mediante la reutilización del pool de conexiones.

Cuando un usuario crea una nueva instancia de MongoClient, todas las conexiones necesarias serán tomadas por el pool (un conjunto de replicas de conexiones pueden requerir conexiones múltiples). Cuando la instancia de MongoClient se sale del ámbito, las conexiones se retornarán al pool. Cuando el proceso en PHP termine, todas las conexiones en el pools serán cerrados.

"¿Por qué tengo tantas conexiones abiertas?"

Las conexiones en el pool pueden generar un gran número de estas. Esto es normal y, con un poco de aritmética, es posible averiguar la cantidad de conexiones que se crearán. Hay tres factores que determinan el número total de conexiones:

  • connections_per_pool

    Cada pool creará, por omisión, un número ilimitado de conexiones. Uno puede suponer que este es un problema: si puede crear un número ilimitado de conexiones, no se podría crear miles y el servidor se quedaría sin descriptores de ficheros. En la práctica, es poco probable, ya que las conexiones no utilizadas son devueltas al pool para usarlos luego, Así las futuras conexiones van a utilizar la misma conexión en lugar de crear uno nuevo. A menos que cree miles de conexiones a la vez sin que ninguna este fuera del ámbito, el número de conexiones abiertas deben permanecer en un número razonable.

    Puede verse cuantas conexiones se tiene en el pool utilizando la función MongoPool::info(). Agregue los campos "in use" y "in pool" de un servidor determinado. Ese será el número total de conexiones de ese pool.

  • pools_per_process

    Cada dirección del servidor MongoDB al cual se va a conectar contiene su propio pool de conexiones. Por ejemplo, si el hostname local es "example.net", connectarse a "example.net:27017", "localhost:27017", y "/tmp/mongodb-27017.sock" creará tres grupos pools de conexiones. Puede ver como muchos grupos pools de conexiones tienes abiertas usando MongoPool::info().

  • processes

    Cada proceso PHP tiene un conjunto independiente de pools. PHP-FPM y Apache generalmente crean entre 6 y un par de docenas de PHP worker children. Compruebe su configuración y vea cuál es el máximo número de procesos de PHP que se pueden procesar.

    Si está usando PHP-FPM, la estimación del número de conexiones puede ser difícil porque este puede procesar más workers de PHP-FPM y así volver pesado la carga. Para estar en lado de la seguro, mire en parámetro max_children o sume spare_servers + start_servers (elegir el número más alto). Esto indicará cuántos procesos de PHP (es decir, conjuntos de agrpuaciones) se deberían planificar.

Las tres variables de arriba se pueen multiplicar juntas para obtener el número máximo de conexiones esperadas: connections_per_pool * pools_per_process * processes. Observe que connections_per_pool puede ser diferente para diferentes agrupaciones, por lo que connections_per_pool debería ser el máximo.

Por ejemplo, supongamos que se recibe 30 conexiones por pool, 10 pools por procesos en PHP, y 128 procesos PHP. Entonces podemos esperar 38400 conexiones desde esta máquina. Por lo tanto, debemos establecer el límite del descriptor del fichero para ser lo suficientemente alto para manejar todas las conexiones o pueda ejecutarse los ficheros de descriptores.

See MongoPool para obtener más información sobre la conexión pooling.