Dépannage et Débogage de MongoDB
Quelles sont les premières étapes que vous entreprenez lorsqu'une application MongoDB est lente ?
Réponse :
Je vérifierais d'abord les journaux de MongoDB pour détecter les erreurs ou les requêtes lentes. Ensuite, j'utiliserais mongostat et mongotop pour surveiller les métriques de performance en temps réel et identifier les opérations actives ou les collections qui consomment des ressources. Enfin, j'analyserais db.currentOp() pour voir les opérations en cours.
Réponse :
J'utilise la commande db.setProfilingLevel(1, { slowms: 100 }) pour activer le profilage de la base de données, qui enregistre les requêtes dépassant un seuil spécifié. Alternativement, je peux utiliser db.system.profile.find() pour interroger directement la collection de profilage pour les opérations lentes. Le plan explain() est également crucial pour comprendre l'exécution des requêtes.
Une requête est constamment lente. Quels outils et techniques utiliseriez-vous pour l'optimiser ?
Réponse :
J'utiliserais explain('executionStats') pour analyser le plan de requête, identifier les index manquants ou les étapes inefficaces. Sur la base de la sortie de explain, je créerais les index appropriés. Si l'indexation n'est pas suffisante, j'envisagerais une refonte du schéma ou une restructuration de la requête.
Réponse :
Un CPU élevé indique souvent des requêtes inefficaces, des index manquants ou des opérations d'écriture excessives. Je vérifierais mongostat pour les opérations actives, db.currentOp() pour les processus de longue durée et le profileur pour les requêtes lentes. Les outils au niveau du système d'exploitation comme top ou htop peuvent également identifier l'utilisation du CPU par le processus mongod.
Réponse :
Une utilisation élevée de la mémoire peut être due à de grands ensembles de travail (working sets), des requêtes inefficaces qui chargent trop de données en RAM, ou des pipelines d'agrégation non optimisés. Je vérifierais db.serverStatus().wiredTiger.cache pour l'utilisation du cache et m'assurerais d'une indexation appropriée pour réduire les données scannées. Une augmentation de la RAM ou le sharding pourraient être nécessaires.
Réponse :
Je commencerais par vérifier rs.status() sur tous les membres pour identifier l'état et la santé de chaque nœud. Ensuite, j'examinerais les journaux de MongoDB sur chaque membre pour les erreurs liées à la réplication, les problèmes réseau ou les échecs d'application de l'oplog. La connectivité réseau entre les membres est également un coupable fréquent.
Réponse :
Le profileur MongoDB capture des informations détaillées sur les opérations de base de données, y compris les temps d'exécution des requêtes, les verrous et les opérations d'E/S. Il aide à identifier les requêtes et les opérations lentes. Vous l'activez en utilisant db.setProfilingLevel(level, { slowms: threshold }), où level peut être 0 (désactivé), 1 (opérations lentes) ou 2 (toutes les opérations).
Réponse :
Tout d'abord, j'identifierais ce qui consomme de l'espace en utilisant db.stats() et db.collection.stats(). Ensuite, je rechercherais les fichiers journaux volumineux ou les anciennes sauvegardes à supprimer. Si la croissance des données est le problème, j'envisagerais d'ajouter plus d'espace disque, de mettre en œuvre le sharding, ou d'archiver les anciennes données pour réduire l'ensemble de travail.
Réponse :
MongoDB utilise un contrôle de concurrence optimiste, donc les vrais deadlocks sont rares. Cependant, les opérations de longue durée qui détiennent des verrous peuvent en bloquer d'autres. J'utiliserais db.currentOp() pour identifier les opérations avec le statut waitingForLock et voir quelle opération détient le verrou. Je pourrais alors terminer l'opération bloquante si nécessaire.
Réponse :
Les métriques clés incluent opcounters (lectures, écritures, commandes), connections (actuelles, disponibles), network (octets entrants/sortants), memory (résidente, virtuelle, mappée), wiredTiger.cache (octets sales, pages lues/écrites) et locks (global, base de données, collection). Celles-ci fournissent des informations sur la charge de travail et l'utilisation des ressources.