Comment ne pas se noyer dans la routine, ou notre expérience en comparant les décharges AWR pendant les tests de résistance

Bonjour à tous! Je m'appelle Lyudmila, je suis engagé dans les tests de charge, je veux partager comment nous avons effectué l'automatisation de l'analyse comparative du profil de régression des tests de charge du systÚme à partir de la base de données sous le SGBD Oracle avec l'un de nos clients.

Le but de l'article n'est pas de découvrir une «nouvelle» approche pour comparer les performances des bases de données, mais de décrire notre expérience et de tenter d'automatiser la comparaison des résultats obtenus et
réduire le nombre d'appels vers DBA Oracle.



En effectuant des tests de charge de n'importe quelle base de données, nous sommes principalement intéressés par:

  • Quelque chose s'est-il cassĂ© aprĂšs l'installation d'un nouvel assemblage?
  • La dynamique de la base de donnĂ©es lors du test.

La comparaison des rapports AWR ne suffit pas Ă  elle seule pour atteindre vos objectifs.
Le stockage centralisé des vidages AWR est également une bonne pratique. Les vidages AWR conservent toutes les vues historiques (dba_hist).

Cette pratique a déjà été appliquée par notre client.

AprÚs la prochaine session de test de charge, nous comparons les résultats:

  • dĂ©charge d'essai actuelle avec dĂ©charge industrielle;
  • le vidage de test en cours avec le vidage de test prĂ©cĂ©dent.

Pourquoi est-ce nécessaire?

Les objectifs sont différents:

  • Parfois, le remplissage de la base elle-mĂȘme dans un environnement de test diffĂšre de celui opĂ©rationnel, ce qui signifie qu'il y aura des diffĂ©rences qui interfĂšrent avec l'analyse («interfĂ©rence» pour rĂ©pondre Ă  la question principale, «avoir quelque chose de cassĂ©?»). Je veux identifier ces diffĂ©rences;
  • La comparaison du test actuel avec le travail de la base industrielle permet de comprendre Ă  quel point les tests de rĂ©sistance actuels sont corrects (quelque part, nous chargeons trop, mais nous avons oubliĂ© quelque chose du tout);
  • La comparaison du test actuel avec le test prĂ©cĂ©dent permet de comprendre si le comportement actuel du systĂšme est normal. Quelque chose a changĂ© dans le comportement du systĂšme par rapport au test prĂ©cĂ©dent.

Pour atteindre tous ces objectifs, nous rĂ©solvons souvent le problĂšme de la comparaison de diffĂ©rentes dĂ©charges entre elles. Les dates sont gĂ©nĂ©ralement trĂšs serrĂ©es quand elles devaient ĂȘtre introduites hier! Le temps pour vĂ©rifier complĂštement chaque test de rĂ©gression fait cruellement dĂ©faut. Et si vous exĂ©cutez le test de fiabilitĂ© pendant une journĂ©e, vous pouvez passer beaucoup de temps Ă  analyser le rĂ©sultat ...

Bien sûr, vous pouvez tout regarder en ligne dans Enterprise Manager (ou avec des demandes de vues gv $) pendant le test: ne pas fumer, manger et dormir ...



Peut-ĂȘtre avez-vous Ă©galement votre propre outil personnalisĂ©, fait pour vous? Vous pouvez partager dans les commentaires. Et nous partagerons ce que nous utilisons pour nos tĂąches.

Les rapports AWR contiennent de nombreuses informations utiles:



Il y a des informations utiles ici, par exemple: la quantitĂ© d'exĂ©cution de la requĂȘte, sql_id, le module et le texte abrĂ©gĂ©. Bien que le texte soit lĂ , il est tronquĂ© et la version complĂšte peut ĂȘtre extraite du paragraphe Liste complĂšte du texte SQL.

Quant aux inconvĂ©nients: dans le rapport AWR, il n'est pas clair quand ces demandes ont eu lieu, Ă  quel moment il y en avait plus, et Ă  quel moins ... AprĂšs tout, analyser les rĂ©sultats du test, comprendre ce qui s'est passĂ© et Ă  quel moment approximatif est important: uniformĂ©ment pour l'ensemble test ou pic / surtension comme si sur un calendrier. Nous ne verrons Ă©galement qu'un sommet limitĂ© ici. Cela peut ĂȘtre visualisĂ© plus facilement en interrogeant les tableaux historiques.



Ici, vous pouvez voir quels événements se sont déroulés pendant le test. Les données de cette section sont classées par heure DB.

Pour moi, dans cette section, les informations suivantes sont manquantes:

  1. Wait_class (oui, vous vous souvenez avec expérience à quel type d'attentes cet événement appartient).
  2. Distributions par modules (si je vois, par exemple, attendre enq: TX - conflit de verrouillage de ligne: des informations sont nécessaires, sous quel module cela s'est produit).

    Il y a des jobs dans lesquels il y a des nombres qui ne portent pas de partie sĂ©mantique, c'est-Ă -dire que vous devez grouper les mĂȘmes modules et obtenir une rĂ©ponse pour le groupe, par exemple: module_A_1, module_A_2, module_A_3 et module_B_1, module_ B_2, module_ B_3. Autrement dit, il y avait deux modules sĂ©mantiques, mais ils ont tous des noms diffĂ©rents.
  3. L'objet auquel nous nous référons (CURRENT_OBJ # - si, par exemple, l'événement enq: TX - contention d'index se produit, il serait bien de savoir quel index est à blùmer).
  4. Sql_id - qui demande le texte de cette demande a tenté de s'exécuter.
  5. Informations sur la répartition des quantités par instantané (comme décrit ci-dessus ...).

Pour comparer les deux tests, vous pouvez utiliser la comparaison des rapports AWR:



Hourra, nous avons ici wait_class affichĂ©, sinon les inconvĂ©nients sont les mĂȘmes que ceux dĂ©crits ci-dessus.

Parfois, il n'y a pas d'Enterprise Manager sur les projets et vous pouvez, par exemple, utiliser Enterprise Manager Express ou ASH Viewer. Dans Enterprise Manager, beaucoup utilisent Top Activity pour les donnĂ©es historiques, mais pour moi, beaucoup de choses sont plus faciles Ă  regarder avec les requĂȘtes elles-mĂȘmes. Tout ce qui prĂ©cĂšde doit ĂȘtre comparĂ© Ă  d'autres tests / charge de travail. Nous avions dĂ©jĂ  une comparaison personnalisĂ©e en termes d'exĂ©cution, mais nous n'avions pas de comparaison personnalisĂ©e, et nous avons vĂ©rifiĂ© manuellement les requĂȘtes sur les tables historiques.

AprĂšs chaque test de rĂ©gression, il Ă©tait nĂ©cessaire de comparer les rĂ©sultats dans les tableaux historiques avec les requĂȘtes Ă  la base de donnĂ©es, de visualiser les rapports AWR, de localiser l'attente problĂ©matique (sur quel module il se produit, Ă  quelle heure, sur quel objet il Ă©tait accrochĂ©), de sorte qu'un rĂ©sultat pourrait ĂȘtre gĂ©nĂ©rĂ© pour la bonne Ă©quipe de dĂ©veloppement.

La base de données du client a atteint 190 To, un grand nombre de demandes sont traitées dans le systÚme: le nombre de modules parallÚles est de 16237.

Et puis j'ai eu une idée de comment simplifier le processus de comparaison des décharges AWR. Avec cette idée, je suis allé voir Fred . Ensemble, nous avons créé un portail pratique.

Au début, l'énoncé du problÚme de ma part ressemblait à ceci:



Puis, nĂ©anmoins, j'ai dĂ©cidĂ© de systĂ©matiser pour commencer quelles requĂȘtes sur les tableaux historiques que j'utilise le plus souvent ... Fred a commencĂ© Ă  fixer cela au portail, puis cela a commencĂ© ...

Tout d'abord, j'Ă©tais intĂ©ressĂ© par une comparaison des Ă©vĂ©nements, car une comparaison de la vitesse d'exĂ©cution des requĂȘtes sous une certaine forme existait dĂ©jĂ . L'Ă©tape suivante, j'avais besoin d'informations dĂ©taillĂ©es sur chaque Ă©vĂ©nement: par exemple, si l'Ă©vĂ©nement est un conflit d'index, vous devez comprendre Ă  quel index nous nous accrochons.

Ensuite, je me suis intĂ©ressĂ© Ă  l'heure Ă  laquelle les moments de ces Ă©vĂ©nements Ă©taient les plus importants, car dans la mise en Ɠuvre, de nombreuses tĂąches (emplois) Ă©taient programmĂ©es et il Ă©tait nĂ©cessaire de comprendre Ă  quel moment tout se fissurait.

En général, voici ce que je voulais obtenir:

  1. comparaison quantitative des événements entre différents tests (sans squats supplémentaires);
  2. toutes les informations connexes dont j'ai besoin pour l'analyse: sql_id, texte de la requĂȘte, distribution pendant le test, qui objecte les sessions auxquelles il est fait rĂ©fĂ©rence, module;
  3. filtres pratiques pour voir ce qui a changé;
  4. GUI GUI, tout est si coloré qu'il est immédiatement visible (vous pouvez filtrer les parties intéressées du cÎté du développement)
  5. regroupement de modules: comme décrit précédemment, 16237 modules, mais, du point de vue des fonctions exercées, beaucoup moins.

Fred et moi avons créé un portail pratique pour notre utilisation pour comparer les vidages AWR des tests de charge, dont je parlerai plus en détail ci-dessous.

À propos du portail


Ainsi, les vidages AWR sont créés dans le systÚme, qui sont versés dans la base de données et comparés sur le portail.

Nous avons utilisé la pile suivante:

  1. Oracle DB - pour stocker les vidages AWR
  2. Python 2+



L'interface du portail ressemble Ă  ceci:



Sur le portail, vous pouvez choisir les types de vidages comparés, test test ou test-prom.

Chaque vidage a son propre identifiant unique - DBID.

Vous pouvez Ă©galement filtrer en fonction des paramĂštres suivants:

  1. Instance (instance) - nous avions une base de données de cluster;
  2. Demande (Sql_id);
  3. Type d'attente (Wait_Class);
  4. ÉvĂ©nement

En haut à gauche, vous sélectionnez les vidages, et à droite, vous pouvez définir les filtres nécessaires pour sélectionner immédiatement le module souhaité - cela vous permet d'identifier les problÚmes dans la fonctionnalité qui a été modifiée / améliorée afin qu'il n'y ait pas de problÚmes de dégradation dans la version précédente.

Le tableau du milieu est le rĂ©sultat de la comparaison des vidages. Les en-tĂȘtes de colonne indiquent immĂ©diatement quelles donnĂ©es sont sorties. Les deux colonnes de droite montrent les diffĂ©rences entre les deux vidages:

  • les Ă©vĂ©nements surlignĂ©s en rouge sont plus que par rapport Ă  un vidage comparatif pour l'instantanĂ©;
  • jaune - nouveaux Ă©vĂ©nements;
  • vert - Ă©vĂ©nements qui Ă©taient dĂ©jĂ  dans le vidage d'origine.

Il est immédiatement évident à quel point nous avons testé. Si l'événement s'est produit trÚs souvent, alors trÚs probablement:

  1. surchargé le systÚme;
  2. ou les conditions d'exécution des tùches d'arriÚre-plan ont changé et l'événement a commencé à jouer plus souvent. Une fois de cette façon, une erreur a été trouvée dans le code: l'événement s'est produit en permanence, et non sur la branche de condition souhaitée.

Si nous avons un nouvel événement - jaune - alors cela indique une sorte de changement dans le systÚme, et nous devons analyser ses conséquences. Ici, vous pouvez voir la distribution des événements par des instantanés et afficher des informations détaillées sur l'attente.

Une fois qu'il y avait un cas: un nouvel Ă©vĂ©nement a Ă©tĂ© dĂ©couvert, ce qui Ă©tait assez rare et n'Ă©tait pas inclus dans les Ă©vĂ©nements les plus importants, mais Ă  cause de cela, il y avait des ralentissements dans le fonctionnel, qui avait des SLA critiques. L'analyse des seules requĂȘtes principales dans le rapport AWR n'a pas pu rĂ©vĂ©ler cela.

Pour chaque demande, vous pouvez obtenir des informations plus détaillées:



Pour chaque entrée, vous pouvez également voir les informations suivantes:

  1. requĂȘte texte sql;
  2. la distribution des événements sur un instantané dans un rapport quantitatif, c'est-à-dire à quel moment il y a eu plus / moins d'événements;
  3. sur quels modules et objets l'attente "suspendue".

Les vues systÚme d'Oracle sont impliquées dans la comparaison des résultats:

DBA_HIST_ACTIVE_SESS_HISTORY, DBA_HIST_SEG_STAT, DBA_HIST_SNAPSHOT, DBA_HIST_SQLTEXT

+

V_DUMPS_LOADED - sa propre table de service (a déjà été implémentée par le client), elle contient des informations sur les vidages chargés.

Quelques requĂȘtes:

Distribution des événements sur photos:

SELECT S.SNAP_ID, COUNT(*) RCOUNT FROM DBA_HIST_ACTIVE_SESS_HISTORY S, V_DUMPS_LOADED V. WHERE V.ID = :1 AND S.DBID = V.DBID AND S.INSTANCE_NUMBER = :2 AND S.SQL_ID = :3 AND S.EVENT_ID = :4 GROUP BY S.SNAP_ID ORDER BY S.SNAP_ID ASC 

Regroupement par module (les modules qui sont un seul groupe logique y sont combinés), l'objet étant bloqué:

 SELECT MODULE, OBJECT_NAME, COUNT(*) RCOUNT (SELECT CASE (WHEN INSTR(S.MODULE, '   1')>0 THEN '  1' WHEN INSTR(S.MODULE, '   2')>0 THEN '  2' 
 ELSE S.MODULE END) MODULE, O.OBJECT_NAME FROM DBA_HIST_ACTIVE_SESS_HISTORY S, V_DUMPS_LOADED V, DBA_HIST_SEG_STAT O WHERE V.ID = :1 AND S.DBID = V.DBID AND S.INSTANCE_NUMBER = :2 AND S.SQL_ID = :3 AND S.EVENT_ID = :4 AND S.CURRENT_OBJ# = O. OBJ# (+) AND V. DBID = O.DBID ) GROUP BY MODULE, OBJECT_NAME ORDER BY RCOUNT DESC 

Qu'avez-vous obtenu Ă  la fin?


Le portail nous a permis de gagner du temps en comparant les vidages AWR. La comparaison manuelle a pris 4 à 6 heures et nous passons maintenant 2 à 3 heures. Nous avons toujours à portée de main l'opportunité de comparer rapidement les résultats de différents tests à la fois entre eux et avec une décharge industrielle, ainsi que de définir les filtres dont nous avons besoin maintenant. Autrement dit, nous pouvons facilement comparer les données historiques entre nous, et pas seulement regarder le résultat actuel en ligne.

Auparavant, aprĂšs chaque rĂ©gression, il Ă©tait nĂ©cessaire de comparer les rĂ©sultats dans les tableaux historiques avec les requĂȘtes Ă  la base de donnĂ©es, de visualiser les rapports AWR, de localiser l'attente problĂ©matique (sur quel module il se produit, Ă  quelle heure il s'est produit, sur quel objet il s'est accrochĂ©), de sorte qu'au final, cela pourrait conduire Ă  un dĂ©faut sur la bonne Ă©quipe de dĂ©veloppement. Et maintenant, sĂ©lectionnez simplement les vidages pour la comparaison, dĂ©finissez les filtres - et les rĂ©sultats de la comparaison sont immĂ©diatement prĂȘts. Vous pouvez Ă©galement envoyer aux dĂ©veloppeurs un lien vers le portail indiquant le DBID du vidage de test, et ils seront eux-mĂȘmes filtrĂ©s par leur module.

Il n'a fallu que deux semaines pour crĂ©er le portail, car une partie de celui-ci Ă©tait dĂ©jĂ  prĂȘte: le chargement des vidages dans la base de donnĂ©es. Bien sĂ»r, une telle solution de portail n'est pas nĂ©cessaire pour tout projet avec une base Oracle. Il est utile pour les produits divisĂ©s en de nombreux modules avec des noms diffĂ©rents. Pour les systĂšmes simples ou pour les systĂšmes dans lesquels ils n'ont pas attachĂ© d'importance au remplissage du module, le portail sera redondant.

Étant donnĂ© que le portail analyse les images prises une fois au cours d'une certaine pĂ©riode, le portail ne dispense pas complĂštement de la surveillance en ligne de la base de donnĂ©es, car certains Ă©vĂ©nements peuvent ne pas pouvoir pĂ©nĂ©trer dans l'image.

Il s'agit d'un outil pratique pour analyser les donnĂ©es historiques Ă  partir des rĂ©sultats des tests, mais il peut ĂȘtre utile dans d'autres situations lorsque de nombreuses images sont crĂ©Ă©es et que de gros volumes de donnĂ©es doivent ĂȘtre vĂ©rifiĂ©s. GrĂące Ă  la combinaison de filtres et de graphiques, vous pouvez immĂ©diatement voir des rafales d'Ă©vĂ©nements qui, dans les rapports AWR normaux (Ă  ne pas confondre avec les vidages), seront masquĂ©s dans les informations groupĂ©es. Il suffit de sĂ©lectionner des vidages pour la comparaison, de dĂ©finir des filtres - et les rĂ©sultats de la comparaison sont immĂ©diatement prĂȘts, ou vous pouvez envoyer un lien aux dĂ©veloppeurs sur le portail indiquant le DBID du vidage de test, ils seront eux-mĂȘmes filtrĂ©s par leur module.

Si vous décidez de développer un portail similaire pour votre projet, sélectionnez l'ensemble de filtres qui vous convient. Si vous filtrez selon des conditions différentes à chaque fois, il sera beaucoup plus facile de faire un filtre approprié pour cela.

La solution rĂ©sultante peut encore ĂȘtre finalisĂ©e, par exemple:

  1. comparer la durée de la demande;
  2. comparer les plans de requĂȘte;
  3. comparer les demandes avec le mĂȘme plan, mais avec un texte diffĂ©rent;
  4. déchargement dans les rapports de test (exécution en tant que document Word / Exel).

Ou, en général, dites au portail de se connecter à la base de données testée afin qu'il crée des images similaires en ligne en utilisant des vues en mémoire, et pas seulement des données historiques. Et enregistrez-les dans votre base de données.

Nous utilisons le portail depuis plus d'un an. Fred, merci beaucoup!

Publié par Lyudmila Matskus,
Jet Infosystems

Source: https://habr.com/ru/post/fr470726/


All Articles