File d'attente de connexion (version 1.2.0-1.2.12 *seulement*)
Note:
Cette section n'est plus pertinente depuis la version 1.3.0 du driver, et n'est plus présente que dans un but d'historisation de l'information sur la façon dont la mise en file d'attente fonctionne.
The latest versions of the driver have no concept of pooling anymore and will maintain only one connection per process, for each connection type (ReplicaSet/standalone/mongos), for each credentials combination.
La création de connexions est une des actions les plus lourdes réalisées par le driver. Cela peut prendre plusieurs millisecondes pour définir correctement une connexion, y compris sur un réseau rapide. Aussi, le driver tente de minimiser le nombre de nouvelles connexions créées en réutilisant les connexions depuis la file d'attente.
Lorsqu'un utilisateur crée une nouvelle instance de la clase MongoClient, toutes les connexions nécessaires seront prises depuis leurs files d'attente (les connexions pour le jeu de réplication peuvent nécessiter plusieurs connexions, une pour chaque membre du jeu). Lorsque l'instance de la classe MongoClient sort du scope, les connexions seront remises dans la file d'attente. Lorsque le processus PHP existe, toutes les connexions de la file d'attente seront fermées.
"Pourquoi dois-je avoir autant de connexions ouvertes ?"
La file d'attente de connexions peut générer un nombre important de connexions. Ceci est voulu, et, en utilisant un peu d'arithmétique, vous pouvez trouver le nombre de connexions qui sera créée. Il y a 3 facteurs qui affectent le nombre de connexions :
-
connections_per_pool
Chaque file d'attente de connexions, créera, par défaut, un nombre illimité de connexions. Cela peut poser quelques soucis : si la file peut créer un nombre illimité de connexions, peut-elle en créer des centaines et ainsi, dépasser les descripteurs de fichiers du serveur ? En pratique, ceci est peu probable, sachant que chaque connexion inutilisée est replacée dans la file d'attente pour une réutilisation ultérieure, aussi, les futures connexions utiliseront la même connexion au lieu d'en créer une nouvelle. Sauf si vous créez volontairement des milliers de connexions à la fois sans les laisser sortir du scope, le nombre de connexions ouvertes devrait rester à un niveau raisonnable.
Vous pouvez voir le nombre de connexions présentes dans la file d'attente en utilisant la méthode MongoPool::info(). Ajouter les champs "in use" et "in pool" pour un serveur donné. Ce sera le nombre total de connexions pour cette file d'attente.
-
pools_per_process
Chaque adresse de serveur MongoDB sur lequel vous vous connectez utilise sa propre file d'attente de connexions. Par exemple, si votre nom d'hôte local est "example.net", une connexion à "example.net:27017", "localhost:27017", et "/tmp/mongodb-27017.sock" créera 3 files d'attente de connexions. Vous pouvez voir le nombre de files d'attentes de connexions ouvertes en utilisant la méthode MongoPool::info().
-
processes
Chaque processus PHP a un jeu de files d'attente séparées. PHP-FPM et Apache créent généralement entre 6 et une douzaine de fils. Vérifiez votre configuration pour voir le nombre maximal de processus PHP pouvant être engendrés.
Si vous utilisez PHP-FPM, le fait d'estimer le nombre de connexions peut être délicat car le processus va engendrer encore plus de fils à forte charge. Pour rester dans un contexte sécurisé, regardez le paramètre max_children et ajoutez-y spare_servers + start_servers (choisissez le nombre le plus important). Le résultat sera le nombre de processus PHP (et donc, le nombre de jeux de files d'attente) dont vous pourrez vous attendre.
Les trois variables ci-dessus peuvent être multipliés ensemble pour fournir le nombre maximal de connexions attendues : connections_per_pool * pools_per_process * processes. Notez que connections_per_pool peut être différent suivant les files d'attente, aussi, connections_per_pool devrait être le maximal.
Par exemple, supposez que vous avez 30 connexions par files d'attentes, 10 files d'attente par processus PHP, et 128 processus PHP. Alors, vous pouvez vous attendre à 38400 connexions depuis cette machine. Aussi, vous devriez définir la limite des descripteurs de fichiers de cette machine à une valeur suffisante pour gérer toutes ces connexions, ou alors les descripteurs de fichiers ne seront pas suffisants.
Voir la méthode MongoPool pour plus d'informations sur les files d'attente de connexions.