
Introduction philosophique
Comme on le sait, il existe seulement deux méthodes pour résoudre des problÚmes :
- La méthode d'analyse ou méthode déductive, ou de l général au particulier.
- La méthode de synthÚse ou méthode inductive, ou du particulier au général.
Pour résoudre le problÚme "améliorer la performance de la base de données", cela peut ressembler à ceci.
Analyse â nous dĂ©composons le problĂšme en parties distinctes et en les rĂ©solvant, nous essayons finalement d'amĂ©liorer la performance globale de la base de donnĂ©es.
En pratique, l'analyse ressemble Ă ceci :
- Un problĂšme survient (incident de performance)
- Nous collectons des informations statistiques sur l'état de la base de données
- Nous cherchons les goulets d'étranglement
- Nous résolvons les problÚmes des goulets d'étranglement
Goulets d'Ă©tranglement de la base de donnĂ©es â infrastructure (CPU, MĂ©moire, Disques, RĂ©seau, OS), configurations (postgresql.conf), requĂȘtes :
Infrastructure: les possibilités d'influence et de changement pour l'ingénieur sont presque nulles.
Configurations de la base de données: les possibilités de changements sont légÚrement supérieures au cas précédent, mais généralement toujours assez difficiles, surtout dans le cloud.
RequĂȘtes Ă la base de donnĂ©es : le seul domaine de manĆuvre.
SynthĂšse â nous amĂ©liorons la performance des parties individuelles, en espĂ©rant qu'en consĂ©quence, la performance de la base de donnĂ©es s'amĂ©liorera.
Introduction lyrique ou pourquoi tout cela est nécessaire
Comment se déroule le processus de résolution d'incidents de performance, si la performance de la base de données n'est pas surveillée :
Client - "nous avons tout mauvais, lent, faites-nous bien"
Ingénieur - "mauvais, c'est quoi ?"
Client - "voici comment c'est actuellement (il y a une heure, hier, la derniÚre fois c'était), lent"
Ingénieur - "et quand c'était bien ?"
Client - "il y a une semaine (deux semaines), c'était pas mal." (C'est de la chance)
Client - "je ne me souviens pas quand c'était bon, mais maintenant c'est mauvais" (Réponse habituelle)
Le résultat donne un tableau classique :

Qui est responsable et que faire ?
Pour la premiÚre partie de la question, il est plus facile de répondre - c'est toujours la faute de l'ingénieur DBA.
Pour la deuxiÚme partie, ce n'est pas trop difficile non plus - il faut mettre en place un systÚme de surveillance des performances de la base de données.
La premiĂšre question se pose - que surveiller ?
Chemin 1. Nous allons surveiller TOUT

La charge CPU, le nombre d'opérations de lecture/écriture sur le disque, la taille de la mémoire allouée, et encore une méga-tonne de différents compteurs que tout systÚme de surveillance fonctionnel peut fournir.
Le rĂ©sultat est une multitude de graphiques, de tableaux rĂ©capitulatifs et des alertes constantes par e-mail, ainsi qu'une occupation Ă 100 % de l'ingĂ©nieur Ă traiter une multitude de tickets identiques, qui se formulent gĂ©nĂ©ralement de maniĂšre standard â « ProblĂšme temporaire. Aucune action requise ». Mais au moins, tout le monde est occupĂ©, et il y a toujours quelque chose Ă montrer au client â le travail est en cours.
Voie 2. Surveiller uniquement ce qui est nécessaire, et ne pas surveiller ce qui n'est pas nécessaire.
On peut surveiller, un peu différemment : uniquement les entités et les événements :
- Sur lesquels l'ingénieur DBA peut agir.
- Pour lesquels il existe un algorithme d'actions en cas d'événement ou de changement d'entité.
Ă partir de cette hypothĂšse et en se souvenant de «Introduction philosophique», afin d'Ă©viter la rĂ©pĂ©tition rĂ©guliĂšre de «Introduction lyrique ou pourquoi tout cela est nĂ©cessaire», il serait judicieux de surveiller la performance des requĂȘtes spĂ©cifiques, pour optimiser et analyser, ce qui devrait finalement mener Ă une amĂ©lioration des performances de l'ensemble de la base de donnĂ©es.
Mais pour amĂ©liorer une requĂȘte lourde qui affecte la performance gĂ©nĂ©rale de la base de donnĂ©es, il faut d'abord la trouver.
Ainsi, deux questions interdépendantes se posent :
- quelle requĂȘte est considĂ©rĂ©e comme lourde
- comment trouver les requĂȘtes lourdes.
Ăvidemment, une requĂȘte lourde est celle qui utilise beaucoup de ressources systĂšme pour obtenir un rĂ©sultat.
Passons Ă la deuxiĂšme question â comment chercher et ensuite surveiller les requĂȘtes lourdes ?
Quelles options de surveillance des requĂȘtes existent dans PostgreSQL ?
ComparĂ© Ă Oracle, les options sont un peu limitĂ©es, mais quelques actions peuvent tout de mĂȘme ĂȘtre entreprises.

PG_STAT_STATEMENTS
Pour trouver et surveiller les requĂȘtes lourdes dans PostgreSQL, l'extension standard pg_stat_statements est utilisĂ©e.
AprĂšs l'installation de l'extension, une vue du mĂȘme nom apparaĂźt dans la base de donnĂ©es cible, qui doit ĂȘtre utilisĂ©e Ă des fins de surveillance.
Colonnes cibles de pg_stat_statements pour construire un systĂšme de surveillance :
- queryid Code de hachage interne, calculé à partir de l'arbre d'analyse de l'instruction.
- max_time Temps maximum consacré à l'instruction, en millisecondes.
En accumulant et en utilisant des statistiques sur ces deux colonnes, on peut construire un systĂšme de surveillance.
Comment pg_stat_statements est utilisé pour surveiller les performances de PostgreSQL

Pour surveiller les performances des requĂȘtes, on utilise :
Du cĂŽtĂ© de la base de donnĂ©es cible â la vue pg_stat_statements
Du cĂŽtĂ© de serveurs et de la base de donnĂ©es de surveillance â un ensemble de scripts bash et de tables de service.
Ătape 1 - collecte de donnĂ©es statistiques
Sur l'hÎte de surveillance, un script est exécuté réguliÚrement par cron, qui copie le contenu de la vue pg_stat_statements de la base de données cible dans la table pg_stat_history de la base de données de surveillance.
Ainsi, l'historique de l'exĂ©cution des requĂȘtes individuelles est constituĂ©, ce qui peut ĂȘtre utilisĂ© pour gĂ©nĂ©rer des rapports de performance et configurer des mĂ©triques.
Ătape 2 - configuration des mĂ©triques de performance
Sur la base des donnĂ©es collectĂ©es, nous choisissons les requĂȘtes dont l'exĂ©cution est la plus critique/essentielle pour le client (l'application). En accord avec le client, nous Ă©tablissons les valeurs des mĂ©triques de performance en utilisant les champs queryid et max_time.
Résultat - début de la surveillance des performances
- Lors de son lancement, le script de surveillance vérifie les métriques de performance configurées, en comparant la valeur max_time de la métrique avec la valeur de la vue pg_stat_statements dans la base de données cible.
- Si la valeur dans la base de données cible dépasse la valeur de la métrique, un avertissement est généré (incident dans le systÚme de tickets)
Fonctionnalité supplémentaire 1
Historique des plans d'exĂ©cution des requĂȘtes
Pour une rĂ©solution ultĂ©rieure des incidents de performance, il est trĂšs utile d'avoir un historique des modifications des plans d'exĂ©cution des requĂȘtes.
Pour stocker l'historique, une table de service log_query est utilisĂ©e. La table est remplie lors de l'analyse du fichier journal chargĂ© de PostgreSQL. Ătant donnĂ© que le fichier journal, contrairement Ă la vue pg_stat_statements, contient le texte complet avec les valeurs des paramĂštres d'exĂ©cution, et non le texte normalisĂ©, il est possible de conserver non seulement le temps et la durĂ©e des requĂȘtes, mais aussi d'enregistrer les plans d'exĂ©cution Ă un moment donnĂ©.
Fonctionnalité supplémentaire 2
Processus d'amélioration continue des performances
La surveillance des requĂȘtes individuelles n'est gĂ©nĂ©ralement pas destinĂ©e Ă rĂ©soudre le problĂšme de l'amĂ©lioration continue des performances de la base de donnĂ©es dans son ensemble, car elle ne gĂšre que les problĂšmes de performance pour des requĂȘtes spĂ©cifiques. Cependant, il est possible d'Ă©largir la mĂ©thode et de configurer la surveillance des requĂȘtes pour toutes les bases de donnĂ©es.
Pour cela, il faut introduire des métriques de performance supplémentaires :
- Ces derniers jours
- Pour une période de base
Le script sĂ©lectionne les requĂȘtes de la vue pg_stat_statements de la base de donnĂ©es cible et compare la valeur max_time Ă la moyenne max_time, dans le premier cas sur les jours rĂ©cents ou sur une pĂ©riode de temps choisie (baseline), dans le second cas.
Ainsi, en cas de dĂ©gradation des performances pour toute requĂȘte, un avertissement sera gĂ©nĂ©rĂ© automatiquement, sans analyse manuelle des rapports.
Et quel est le rapport avec la synthĂšse ?
Dans l'approche décrite, comme le suppose la méthode de synthÚse - en améliorant des parties individuelles du systÚme, nous améliorons le systÚme dans son ensemble.
- RequĂȘte exĂ©cutĂ©e par la base de donnĂ©es - thĂšse
- RequĂȘte modifiĂ©e - antithĂšse
- Changement d'état du systÚme - synthÚse

Développement du systÚme
- Extension des statistiques collectées en ajoutant l'historique à la vue systÚme pg_stat_activity
- Extension des statistiques collectĂ©es en ajoutant l'historique pour les statistiques des tables individuelles participant aux requĂȘtes
- Intégration avec le systÚme de surveillance dans le cloud AWS
- Et encore, on peut imaginer quelque choseâŠ
Source : habr.com
