Je vous invite à consulter la transcription de la présentation de Nikolaï Samokhvalov "Approche industrielle pour le tuning PostgreSQL : expériences sur les bases de données"
Shared_buffers = 25 % â est-ce beaucoup ou peu ? Ou juste ce qu'il faut ? Comment dĂ©terminer si cette recommandation â assez ancienne â est appropriĂ©e dans votre cas spĂ©cifique ?
Il est temps d'aborder la question de la sélection des paramÚtres de postgresql.conf "comme des professionnels". Pas à l'aide de "tuneurs automatiques" aveugles ou de conseils obsolÚtes provenant d'articles et de blogs, mais sur la base de :
- strictement d'expériences contrÎlées sur les bases de données, réalisées de maniÚre automatisée, en grand nombre et dans des conditions aussi proches que possible des "conditions réelles",
- d'une compréhension approfondie des spécificités de fonctionnement des SGBD et des systÚmes d'exploitation.
En utilisant Nancy CLI (), nous examinerons un cas concret â les fameux shared_buffers â dans diffĂ©rentes situations, sur diffĂ©rents projets, et nous essaierons de comprendre comment bien ajuster cette configuration pour notre infrastructure, nos bases de donnĂ©es et notre charge.

Nous parlerons d'expériences sur les bases de données. C'est une histoire qui dure depuis un peu plus de six mois.

Un peu sur moi. Une expĂ©rience avec Postgres de plus de 14 ans. J'ai fondĂ© plusieurs sociĂ©tĂ©s de rĂ©seaux sociaux. Partout, Postgres a Ă©tĂ© utilisĂ© et continue de l'ĂȘtre.
Aussi, le groupe RuPostgres sur Meetup, deuxiĂšme au monde. Nous nous approchons lentement des 2000 membres. RuPostgres.org.
Et lors de plusieurs conférences, y compris Highload, je suis responsable des bases de données, notamment de Postgres depuis sa création.

Et ces derniÚres années, j'ai redémarré ma pratique de consultance sur Postgres dans 11 fuseaux horaires différents.

Lorsque j'ai fait cela il y a quelques années, il m'a fallu une pause dans le travail manuel actif avec Postgres, probablement depuis 2010. J'ai été surpris de voir à quel point la vie quotidienne des DBA avait peu changé, combien il fallait encore faire de travail manuel. Et j'ai immédiatement pensé qu'il y avait un problÚme, qu'il fallait automatiser beaucoup plus de choses.
Et comme tout cela se passait à distance, la plupart des clients étaient dans le cloud. Et déjà beaucoup de choses étaient clairement automatisées. J'y reviendrai plus tard. C'est-à -dire que cela a conduit à l'idée qu'il devait y avoir un certain nombre d'outils, à savoir une plateforme qui automatiserait presque toutes les actions des DBA, afin de pouvoir gérer un grand nombre de bases.

Cette présentation ne contiendra pas :
- de « solutions miracles » ou d'affirmations comme â mettez 8 Go ou 25 % de shared_buffers et tout ira bien. Il n'y aura pas beaucoup Ă dire sur les shared_buffers.
- Des éléments « hardcore ».

Et qu'est-ce qui va se passer ?
- Il y aura des principes d'optimisation que nous appliquons et développons. Il y aura diverses idées qui apparaissent en cours de route et différents outils que nous créons principalement en Open Source, c'est-à -dire que nous établissons notre base en Open Source. De plus, nous avons des tickets, presque toutes les communications se font en Open Source. Vous pouvez voir ce que nous faisons actuellement, ce qui sera dans la prochaine version, etc.
- Il y aura également quelques expériences d'utilisation de ces principes et outils dans diverses entreprises : des petites start-ups aux grandes entreprises.

Comment tout cela évolue-t-il ?

Tout d'abord, la principale tùche d'un DBA en plus de garantir la création d'instances, le déploiement des sauvegardes, etc., est de trouver les goulets d'étranglement et d'optimiser la performance.

Actuellement, cela fonctionne de cette maniÚre. Nous regardons le monitoring, nous voyons quelque chose, il nous manque des détails. Nous commençons à examiner plus attentivement, habituellement à la main, et nous comprenons ce qu'il faut faire.

Il existe deux approches. Pg_stat_statements est la solution standard par dĂ©faut pour identifier les requĂȘtes lentes. Et l'analyse des journaux Postgres avec pgBadger.
Chacune de ces approches a de sérieux inconvénients. La premiÚre approche nous laisse sans tous les paramÚtres. Si nous voyons des groupes SELECT * FROM table where la colonne est égale à « ? » ou « $ » à partir de la version 10 de Postgres, nous ne savons pas si c'est un index scan ou un seq scan. Cela dépend beaucoup du paramÚtre. Si vous introduisez une valeur rarement rencontrée, ce sera un index scan. Si vous introduisez une valeur qui représente 90 % de la table, ce sera un seq scan, car Postgres connaßt les statistiques. C'est un gros inconvénient de pg_stat_statements, bien que des travaux soient en cours.
L'analyse des journaux a le principal inconvĂ©nient que vous ne pouvez gĂ©nĂ©ralement pas vous permettre de dĂ©finir « log_min_duration_statement = 0 ». Nous en discuterons Ă©galement. Par consĂ©quent, vous ne voyez pas le tableau complet. Une requĂȘte trĂšs rapide peut consommer une Ă©norme quantitĂ© de ressources, mais vous ne la verrez pas, car elle est en dessous de votre seuil.
Comment les DBA résolvent-ils les problÚmes identifiés ?

Par exemple, nous avons trouvĂ© un problĂšme. Que fait-on habituellement ? Si vous ĂȘtes dĂ©veloppeur, vous allez effectuer des actions sur une instance qui n'est pas Ă la bonne taille. Si vous ĂȘtes DBA, vous avez un environnement de staging. Et il ne peut y en avoir qu'un seul. Et il est en retard de six mois. Vous pensez que vous allez passer en production. MĂȘme les DBA expĂ©rimentĂ©s vĂ©rifient ensuite en production, sur une rĂ©plique. Il arrive qu'ils crĂ©ent un index temporaire, s'assurent qu'il aide, le suppriment et le remettent aux dĂ©veloppeurs pour qu'ils l'intĂšgrent dans les fichiers de migration. C'est ce genre d'ineptie qui se produit actuellement. Et c'est un vrai problĂšme.

- Ajuster les configurations.
- Optimiser l'ensemble des index.
- Modifier la requĂȘte SQL elle-mĂȘme (c'est le moyen le plus complexe).
- Ajouter des ressources (le moyen le plus simple dans la plupart des cas).

Il y a beaucoup de choses à considérer. Il y a de nombreux leviers dans Postgres. Il faut avoir une connaissance approfondie. Beaucoup d'index dans Postgres, grùce notamment aux organisateurs de cette conférence. Et il faut tout savoir, et c'est précisément ce qui donne à ceux qui ne sont pas DBA l'impression que les DBA pratiquent la magie noire. C'est-à -dire qu'il faut s'y consacrer pendant dix ans pour commencer à bien comprendre tout ça.
Et moi, je suis un combattant de cette magie noire. Je veux faire en sorte qu'il y ait une technologie plutÎt qu'une intuition dans tout ça.
Exemples de la vie réelle

Je l'ai constaté dans au moins deux projets, y compris le mien. Un autre article de blog nous informe que la valeur 1 000 pour default_statistic_target est bonne. TrÚs bien, essayons en production.

Et ici, nous, en utilisant notre outil deux ans plus tard grùce à des expériences sur des bases de données, dont nous parlons aujourd'hui, pouvons comparer ce qui était et ce qui est devenu.

Pour cela, nous devons créer une expérience. Elle se compose de quatre parties.
- La premiĂšre â c'est l'environnement. Nous avons besoin de matĂ©riel. Et quand je vais dans une entreprise et que je signe un contrat, je dis qu'il me faut du matĂ©riel identique Ă celui de la production. Pour chacun de vos Masters, j'ai besoin d'au moins une telle machine. Que ce soit une instance de machine virtuelle sur Amazon ou Google, ou qu'il me faille exactement le mĂȘme matĂ©riel. C'est-Ă -dire que je veux recrĂ©er l'environnement. Et dans cette notion d'environnement, nous devons inclure la version majeure de Postgres.
- La deuxiĂšme partie â c'est l'objet de nos recherches. C'est la base de donnĂ©es. Elle peut ĂȘtre créée de plusieurs maniĂšres. Je vais montrer comment.
- La troisiĂšme partie â c'est la charge. C'est le moment le plus complexe.
- La quatriÚme partie est ce que nous vérifions, c'est-à -dire ce avec quoi nous allons comparer. Par exemple, nous pouvons modifier un ou plusieurs paramÚtres dans la configuration, ou créer un index, etc.

Nous lançons une expérience. Voici pg_stat_statements. à gauche, ce qui était. à droite, ce qui est devenu.

à gauche, default_statistics_target = 100, à droite = 1 000. Nous voyons que cela nous a aidés. En général, tout s'est amélioré de 8 %.

Mais si nous faisons dĂ©filer vers le bas, nous trouverons des groupes de requĂȘtes provenant de pgBadger ou de pg_stat_statements. Il y a deux options. Nous verrons qu'une certaine requĂȘte a chutĂ© de 88 %. C'est lĂ qu'une approche d'ingĂ©nierie entre en jeu. Nous pouvons creuser plus profondĂ©ment, car il est intĂ©ressant de savoir pourquoi elle a chutĂ©. Il faut comprendre ce qui se passait avec la statistique. Pourquoi un plus grand nombre de buckets dans la statistique conduit Ă un rĂ©sultat moins bon.

Ou nous pouvons ne pas creuser, mais faire un « ALTER TABLE ⊠ALTER COLUMN » et remettre 100 buckets à la statistique de cette colonne. Ensuite, nous pouvons encore expérimenter pour nous assurer que ce correctif a aidé. Voilà , c'est cela une approche d'ingénierie qui nous aide à voir la situation et à prendre des décisions basées sur des données plutÎt que sur de l'intuition.


Voici quelques exemples d'autres domaines. Dans les tests, il existe des tests CI depuis de nombreuses années. Et aucun projet sensé ne vivra sans tests automatisés.

Dans d'autres industries : dans l'aviation, dans l'automobile, lorsque nous testons l'aérodynamique, nous avons aussi la possibilité de faire des expériences. Nous ne lançons pas quelque chose directement dans l'espace basé sur un dessin ou ne mettons pas une voiture directement sur la route. Par exemple, il existe une soufflerie aérodynamique.
Des observations d'autres industries nous permettent de tirer des conclusions.

Tout d'abord, nous avons un environnement spĂ©cial. Il est proche de la production, mais pas tout Ă fait. Sa principale caractĂ©ristique est qu'il doit ĂȘtre bon marchĂ©, rĂ©pĂ©table et aussi automatisĂ© que possible. De plus, il doit y avoir des outils spĂ©ciaux pour effectuer une analyse dĂ©taillĂ©e.
Il est probable que lorsque nous avons lancĂ© l'avion et que nous volons, nous avons moins d'opportunitĂ©s d'Ă©tudier chaque millimĂštre de la surface de l'aile que dans une soufflerie. Nous avons plus de moyens pour le diagnostic. Nous pouvons nous permettre d'accrocher plus de poids, ce que nous ne pouvons pas faire avec un avion en vol. Il en va de mĂȘme avec Postgres. Dans certains cas, nous pouvons activer la journalisation complĂšte des requĂȘtes lors des expĂ©riences. Et nous ne voulons pas faire cela en production. Nous pourrions mĂȘme l'activer avec les plans Ă l'aide de auto_explain.
Comme je l'ai dĂ©jĂ dit, un haut niveau d'automatisation signifie que nous avons appuyĂ© sur un bouton et rĂ©pĂ©tĂ©. C'est comme cela que cela doit ĂȘtre, afin d'avoir beaucoup d'expĂ©riences, pour que ce soit en continu.
Nancy CLI â la base du « laboratoire DB »

Et nous avons créé quelque chose comme ça. C'est-à -dire que j'avais parlé de ces idées en juin, il y a presque un an. Et nous avons déjà dans Open Source ce qu'on appelle Nancy CLI. C'est la fondation pour construire un laboratoire de bases de données.

â C'est en Open Source, sur GitLab. Vous pouvez le dire, vous pouvez essayer. J'ai mis un lien dans les diapositives. Vous pouvez cliquer dessus et vous trouverez pour tous les paramĂštres.
Bien sĂ»r, il y a encore beaucoup de choses en cours de dĂ©veloppement. Il y a beaucoup d'idĂ©es. Mais c'est dĂ©jĂ ce que nous appliquons pratiquement tous les jours. Et lorsque nous avons une idĂ©e â par exemple, que se passe-t-il lorsque nous supprimons 40 000 000 de lignes et que tout se bloque sur l'I/O, nous pouvons faire une expĂ©rience et regarder de plus prĂšs pour comprendre ce qui se passe et ensuite essayer de le corriger en cours de route. C'est-Ă -dire que nous faisons une expĂ©rience. Par exemple, nous ajustons quelque chose et voyons ce qui en rĂ©sulte. Et nous ne le faisons pas en production. C'est l'idĂ©e principale.

OĂč cela peut-il fonctionner ? Cela peut fonctionner localement, c'est-Ă -dire que cela peut ĂȘtre fait n'importe oĂč, mĂȘme sur un MacBook. Il faut Docker, on y va. Et c'est tout. Nous pouvons le lancer sur une instance physique, ou dans une machine virtuelle, peu importe.
Il existe Ă©galement la possibilitĂ© de lancer Ă distance sur Amazon EC2 Instance, en spots. C'est une fonctionnalitĂ© trĂšs intĂ©ressante. Par exemple, hier, nous avons rĂ©alisĂ© plus de 500 expĂ©riences sur une instance i3, en commençant par la plus petite et en terminant par l'i3-16-xlarge. Et ces 500 expĂ©riences nous ont coĂ»tĂ© 64 dollars. Chacune a durĂ© 15 minutes. GrĂące aux spots, cela devient trĂšs abordable â une remise de 70 %, tarif Ă la seconde d'Amazon. Vous pouvez faire beaucoup de choses. Vous pouvez mener une vĂ©ritable recherche.

Trois versions majeures de Postgres sont prises en charge. Ce n'est pas si compliqué d'adapter des anciennes versions et la nouvelle version 12 aussi.

Nous pouvons définir l'objet de trois maniÚres. Ce sont :
- Dump/fichier SQL.
- Le principal moyen est de cloner le répertoire PGDATA. En général, cela provient du serveur de sauvegarde. Si vous avez de bonnes sauvegardes binaires, vous pouvez en faire des clones. Si vous avez des clouds, alors la société cloud type Amazon ou Google s'en occupera pour vous. C'est la méthode principale pour cloner un environnement de production réel. Nous déployons en utilisant cette méthode.
- Et la derniÚre méthode convient pour les recherches, lorsque vous souhaitez comprendre comment quelque chose fonctionne dans Postgres. C'est pgbench. Vous pouvez générer avec pgbench. C'est juste une option "db-pgbench". Vous lui indiquez le scale. Et tout sera généré dans le cloud, comme indiqué.

Et la charge :
- Nous pouvons exécuter la charge en un seul flux SQL. C'est la méthode la plus primitive.
- Nous pouvons aussi Ă©muler la charge. Et nous pouvons l'Ă©muler principalement de la maniĂšre suivante. Nous devons collecter tous les logs. Et cela peut ĂȘtre pĂ©nible. Je vais montrer pourquoi. Et Ă l'aide de pgreplay, intĂ©grĂ© dans Nancy, nous pouvons les rejouer.
- Ou une autre option. La soi-disant charge artisanale, que nous crĂ©ons avec un certain effort. En analysant notre charge actuelle sur le systĂšme de production, nous extrayons les groupes de requĂȘtes les plus performants. Et avec pgbench, nous pouvons Ă©muler cette charge en laboratoire.

- Ou bien nous devons exĂ©cuter une requĂȘte SQL, c'est-Ă -dire vĂ©rifier une migration, crĂ©er un index, exĂ©cuter ANALYZE. Et nous observons ce qui s'est passĂ© avant et aprĂšs le vacuum. En gĂ©nĂ©ral, n'importe quelle SQL.
- Soit nous modifions un ou plusieurs paramĂštres dans la configuration. Nous pouvons demander de vĂ©rifier, par exemple, 100 valeurs sur Amazon pour notre base de donnĂ©es de un tĂ©raoctet. Et aprĂšs quelques heures, vous aurez le rĂ©sultat. En rĂšgle gĂ©nĂ©rale, une base de donnĂ©es de un tĂ©raoctet se dĂ©ploiera pendant plusieurs heures. Mais dans le dĂ©veloppement, il y a un correctif, nous avons une sĂ©rie possible, c'est-Ă -dire que vous pouvez utiliser le mĂȘme pgdata successivement sur le mĂȘme serveur et effectuer des vĂ©rifications. Postgres redĂ©marrera, les caches seront vidĂ©s. Et vous pouvez exĂ©cuter la charge.

- Une directory arrive, contenant une multitude de fichiers, allant des snapshots pgstat***. Et lĂ , le plus intĂ©ressant â c'est pg_stat_statements, pg_stat_kcache. Ce sont deux extensions qui analysent les requĂȘtes. Et pg_stat_bgwriter contient non seulement les statistiques de pgwriter, mais aussi celles relatives aux checkpoints et Ă la façon dont les backends expulsent les buffers sales. Et c'est intĂ©ressant Ă observer. Par exemple, lorsque nous configurons shared_buffers, il est trĂšs intĂ©ressant de voir combien chacune a expulsĂ©.
- Des journaux Postgres arrivent Ă©galement. Deux journaux â le journal de prĂ©paration et le journal de replay de charge.
- Une fonctionnalitĂ© relativement nouvelle â c'est les FlameGraphs.
- De plus, si vous avez utilisé pgreplay ou pgbench pour le replay de charge, leur sortie native sera présente. Et vous pourrez voir la latence et le TPS. Cela vous permettra de comprendre comment ils ont observé cela.
- Informations sur le systĂšme.
- VĂ©rifications de base du CPU et de l'IO. C'est principalement pour les instances EC2 sur Amazon, lorsque vous souhaitez lancer 100 instances identiques dans un flux et y effectuer 100 diffĂ©rents tests, vous aurez 10 000 expĂ©riences. Et vous devez vous assurer que vous n'avez pas eu une instance dĂ©fectueuse, qu'un autre utilisateur exploite dĂ©jĂ . Sur ce matĂ©riel, d'autres fonctionnent et il ne vous reste pas beaucoup de ressources. De tels rĂ©sultats doivent ĂȘtre Ă©cartĂ©s. Et c'est exactement avec l'aide de sysbench d'Alexey Kopytov que nous rĂ©alisons quelques courtes vĂ©rifications, qui arriveront et pourront ĂȘtre comparĂ©es aux autres, c'est-Ă -dire que vous comprendrez comment se comporte le CPU et comment se comporte l'IO.

Quelles sont les complexités techniques à travers différentes entreprises ?

Supposons que nous souhaitions reproduire une charge rĂ©elle Ă l'aide des journaux. Excellente idĂ©e, si cela est Ă©crit sur Open Source pgreplay. Nous l'utilisons. Mais pour qu'il fonctionne bien, vous devez activer la journalisation complĂšte des requĂȘtes avec les paramĂštres et les timings.
Il y a certaines complications concernant la durée et l'horodatage. Nous allons ignorer cette partie. La question principale est : pouvez-vous vous le permettre ou non ?

Le problĂšme, c'est que cela peut ĂȘtre inaccessible. Vous devez d'abord comprendre quel flux sera inscrit dans le journal. Si vous avez pg_stat_statements, vous pouvez utiliser cette requĂȘte (le lien sera disponible dans les diapositives) pour estimer combien de bytes seront Ă©crits par seconde.
Nous regardons la longueur de la requĂȘte. Nous ignorons le fait qu'il n'y a pas de paramĂštres, mais nous connaissons la longueur de la requĂȘte et savons combien de fois elle est exĂ©cutĂ©e par seconde. Ainsi, nous pouvons estimer combien de bytes par seconde cela reprĂ©sente. Nous pouvons nous tromper d'un facteur deux, mais nous aurons une idĂ©e du bon ordre.
Nous pouvons voir que cette requĂȘte est exĂ©cutĂ©e 802 fois par seconde. Et nous constatons qu'environ 300 kB/s seront Ă©crits. En gĂ©nĂ©ral, ce type de flux est gĂ©rable.

Mais ! Le fait est qu'il existe différents systÚmes de journalisation. Et par défaut, les gens utilisent généralement « syslog ».

Si vous avez syslog, vous pouvez vous retrouver avec ce type de rĂ©sultats. Nous allons utiliser pgbench, activer la journalisation des requĂȘtes et voir ce que cela donne.

Sans journalisation â cela correspond Ă la colonne de gauche. Nous obtenons 161 000 TPS. Avec syslog â sous Ubuntu 16.04 sur Amazon, nous avons 37 000 TPS. Si nous changeons pour deux autres mĂ©thodes de journalisation, la situation s'amĂ©liore considĂ©rablement. C'est-Ă -dire que nous nous attendions Ă une baisse, mais pas Ă ce point.

Et sous CentOS 7, oĂč journald est Ă©galement impliquĂ©, convertissant les journaux en format binaire pour une recherche plus facile, la situation est catastrophique, avec une baisse de 44 fois en TPS.

C'est ce dont les gens vivent. Et souvent, dans les entreprises, surtout les grandes, il est trÚs difficile de changer cela. Si vous pouvez vous éloigner de syslog, n'hésitez pas.

- Ăvaluez les IOPS et le flux d'Ă©criture.
- Vérifiez votre systÚme de journalisation.
- Si la charge prévue est trop élevée, envisagez l'option de l'échantillonnage.

Nous avons pg_stat_statements. Comme je l'ai dit, il doit absolument ĂȘtre prĂ©sent. Nous pouvons dĂ©crire chaque groupe de requĂȘtes d'une maniĂšre particuliĂšre dans un fichier. Ensuite, nous pouvons utiliser une fonctionnalitĂ© trĂšs pratique dans pgbench â la possibilitĂ© de soumettre plusieurs fichiers avec l'option « -f ».
Il comprend beaucoup de « -f ». Et on peut indiquer avec « @ » Ă la fin quelle part de chaque fichier doit ĂȘtre utilisĂ©e. C'est-Ă -dire, nous pouvons dire que celui-ci doit ĂȘtre exĂ©cutĂ© dans 10 % des cas, et celui-lĂ dans 20 %. Cela nous rapprochera de ce que nous voyons en production.

Et comment allons-nous savoir ce que nous avons en production ? Quelle part et quoi exactement ? Ici, nous nous éloignons un peu. Nous avons encore un autre produit. . C'est aussi une base en Open Source. Et nous sommes actuellement en train de le développer activement.
Il est nĂ© pour d'autres raisons. En raison du fait que la surveillance est insuffisante. C'est-Ă -dire, vous arrivez, regardez la base, examinez les problĂšmes. Et, en gĂ©nĂ©ral, vous faites un health_check. Si vous ĂȘtes un DBA expĂ©rimentĂ©, vous faites un health_check. Vous regardez l'utilisation des index, etc. Si vous avez OKmeter, c'est super. C'est un excellent outil de surveillance pour Postgres. OKmeter.io â n'hĂ©sitez pas Ă l'installer, tout est vraiment bien fait. C'est payant.
Si vous ne l'avez pas, en général, il y a peu de choses. La surveillance inclut normalement le CPU, l'IO et encore avec des réserves, et c'est tout. Nous avons besoin de plus. Nous devons voir comment fonctionne l'autovacuum, comment fonctionne le checkpoint, dans l'IO, il faut séparer le checkpoint du bgwriter et des backends, etc.
Le problĂšme est que lorsque vous aidez une grande entreprise, elle ne peut pas mettre quelque chose en Ćuvre rapidement. Elle ne peut pas acheter OKmeter rapidement. Peut-ĂȘtre que dans six mois, elle l'achĂštera. Elle ne peut pas installer certains packages rapidement.
Nous avons donc eu l'idĂ©e qu'il nous fallait un outil spĂ©cial qui ne nĂ©cessite aucune installation, c'est-Ă -dire que vous ne devez rien installer en production. Vous l'installez sur votre ordinateur portable ou sur un serveur d'observation Ă partir duquel vous allez l'exĂ©cuter. Et il va analyser beaucoup de choses : le systĂšme d'exploitation, le systĂšme de fichiers, et Postgres lui-mĂȘme, en effectuant quelques requĂȘtes lĂ©gĂšres qui peuvent ĂȘtre exĂ©cutĂ©es directement en production sans causer de problĂšmes.
Nous l'avons appelé Postgres-checkup. Si l'on parle de médecine, c'est un contrÎle de santé régulier. Si l'on parle d'automobiles, c'est comme un entretien. Vous faites l'entretien de votre voiture tous les six mois ou un an, selon la marque. Mais faites-vous l'entretien de votre base de données ? C'est-à -dire, faites-vous réguliÚrement une recherche approfondie ? Vous devez le faire. Si vous faites des sauvegardes, faites aussi des checkups, c'est tout aussi important.
Et nous avons un tel outil. Il a commencé à se développer activement il y a seulement trois mois. Il est encore jeune, mais il y a déjà beaucoup de choses.

Nous rassemblons les groupes de requĂȘtes les plus « influents » â rapport K003 dans Postgres-checkup
Et il y a un groupe de rapports K. Trois rapports pour le moment. Et il y a ce rapport K003. C'est le sommet de pg_stat_statements, trié par total_time.
Lorsque nous classons les groupes de requĂȘtes par total_time, nous voyons en haut un groupe qui charge notre systĂšme de maniĂšre significative, c'est-Ă -dire qui consomme le plus de ressources. Pourquoi appelons-nous cela des groupes de requĂȘtes ? Parce que nous avons Ă©liminĂ© les paramĂštres. Ce ne sont plus des requĂȘtes, mais des groupes de requĂȘtes, c'est-Ă -dire qu'ils sont abstraits.
Et si nous optimisons du haut vers le bas, nous allĂ©geons nos ressources et repoussons le moment oĂč nous devrons effectuer une mise Ă niveau. C'est un trĂšs bon moyen d'Ă©conomiser de l'argent.
Peut-ĂȘtre que ce n'est pas une trĂšs bonne approche en termes de satisfaction des utilisateurs, car nous ne voyons peut-ĂȘtre pas des cas rares mais trĂšs ennuyeux oĂč une personne attendait 15 secondes. En somme, ils sont si rares que nous ne les voyons pas, mais nous gĂ©rons les ressources.

Que s'est-il passĂ© dans ce tableau ? Nous avons fait deux snapshots. Postgres_checkup vous donnera la diffĂ©rence pour chaque mĂ©trique : par total-time, calls, rows, shared_blks_read, etc. VoilĂ , la diffĂ©rence a Ă©tĂ© calculĂ©e. Le gros problĂšme avec pg_stat_statements est qu'il ne se souvient pas quand il a Ă©tĂ© rĂ©initialisĂ©. Si pg_stat_database se souvient, pg_stat_statements ne se souvient pas. Vous voyez ce nombre 1 000 000, mais nous ne savons pas d'oĂč il a Ă©tĂ© calculĂ©.

Ici, nous savons, ici nous avons deux snapshots. Nous savons que la différence dans ce cas était de 56 secondes. Un intervalle trÚs court. Nous avons trié par total_time. Et ensuite, nous pouvons différencier, c'est-à -dire que nous divisons toutes les métriques par la durée. Si nous divisons chaque métrique par la durée, nous obtiendrons le nombre d'appels par seconde.
Ensuite, le total_time par seconde â c'est ma mĂ©trique prĂ©fĂ©rĂ©e. Elle se mesure en secondes, par seconde, c'est-Ă -dire combien de secondes notre systĂšme a mis pour exĂ©cuter ce groupe de requĂȘtes par seconde. Si vous voyez plus d'une seconde par seconde, cela signifie que vous aviez besoin de plus d'un noyau. C'est une trĂšs bonne mĂ©trique. Vous pouvez comprendre que cette entitĂ©, par exemple, a besoin d'au moins trois noyaux.
Voici notre innovation, je n'ai jamais vu ça ailleurs. Notez bien â c'est une chose trĂšs simple â seconde par seconde. Parfois, lorsque votre CPU est Ă 100 %, cela fait une demi-heure par seconde, c'est-Ă -dire que vous avez traitĂ© uniquement ces requĂȘtes pendant une demi-heure.
Ensuite, nous voyons le nombre de lignes par seconde. Nous savons combien de lignes ont été renvoyées par seconde.
Et ensuite, il y a aussi une chose intĂ©ressante. Combien de shared_buffers nous avons lus par seconde Ă partir des shared_buffers. Les hits Ă©taient dĂ©jĂ lĂ , et les lignes ont Ă©tĂ© prises Ă partir du cache du systĂšme d'exploitation ou du disque. La premiĂšre option est rapide, et la seconde peut ĂȘtre rapide, mais cela dĂ©pend de la situation.
Et la deuxiĂšme mĂ©thode de diffĂ©renciation consiste Ă diviser le nombre de requĂȘtes dans ce groupe. Dans la deuxiĂšme colonne, vous aurez toujours une requĂȘte divisĂ©e par la requĂȘte. Et ensuite, il est intĂ©ressant de voir combien de millisecondes cela a pris pour cette requĂȘte. Nous savons comment cette requĂȘte se comporte en moyenne. 101 millisecondes Ă©taient nĂ©cessaires pour chaque requĂȘte. C'est une mĂ©trique traditionnelle dont nous avons besoin pour comprendre.
Combien de lignes chaque requĂȘte a renvoyĂ©es en moyenne. Nous voyons que ce groupe en renvoie 8. Combien ont Ă©tĂ© prises et lues en moyenne depuis le cache. Nous constatons que tout est bien mis en cache. Des hits complets pour le premier groupe.
Et la quatriĂšme sous-ligne de chaque ligne indique le pourcentage du nombre total. Nous avons des appels. Disons 1 000 000. Et nous pouvons comprendre quelle contribution ce groupe apporte. Nous voyons que dans ce cas, le premier groupe apporte une contribution infĂ©rieure Ă 0,01 %. Autrement dit, il est si lent que nous ne le voyons pas dans l'ensemble du tableau. Et le deuxiĂšme groupe â 5 % des appels. Câest-Ă -dire que 5 % de tous les appels proviennent du deuxiĂšme groupe.
Concernant le total_time, c'est aussi intĂ©ressant. Pour le premier groupe de requĂȘtes, nous avons dĂ©pensĂ© 14 % de tout le temps de fonctionnement. Et pour le deuxiĂšme â 11 % et ainsi de suite.
Je ne vais pas entrer dans les dĂ©tails, mais il y a des subtilitĂ©s. Nous affichons l'erreur en haut, car lorsque nous comparons, les instantanĂ©s peuvent dĂ©river, câest-Ă -dire que certaines requĂȘtes peuvent disparaitre et ne peuvent pas ĂȘtre prĂ©sentes dans le deuxiĂšme, tandis que certaines peuvent apparaĂźtre. Et nous calculons cette erreur. Si vous voyez 0, c'est bon. Il n'y a pas d'erreurs. Si le taux d'erreur est infĂ©rieur Ă 20 %, c'est OK.

Ensuite, nous revenons à notre sujet. Nous devons créer une charge de travail. Nous prenons de haut en bas, jusqu'à atteindre 80 % ou 90 %. En général, il s'agit de 10 à 20 groupes. Et nous faisons des fichiers pour pgbench. Là , nous utilisons random. Parfois, hélas, cela ne fonctionne pas. Et dans Postgres 12, il y aura plus d'options pour utiliser cette approche.
Et ensuite, nous atteignons ainsi 80 à 90 % du total_time. Que faut-il mettre aprÚs «@» ? Nous examinons les appels, nous regardons combien de pourcentages et nous comprenons que nous devons ici avoir tant de pourcentages. à partir de ces pourcentages, nous pouvons évaluer comment équilibrer chacun des fichiers. AprÚs cela, nous utilisons pgbench et nous commençons à travailler.

Nous avons aussi K001 et K002.
K001 - c'est une grande chaĂźne avec quatre sous-chaĂźnes. C'est la caractĂ©ristique de toute notre charge. Regardez la deuxiĂšme colonne et la deuxiĂšme sous-chaĂźne. Nous voyons qu'il faut environ une seconde et demie par seconde, câest-Ă -dire que si nous avons deux cĆurs, cela ira bien. Cela correspond Ă environ 75 % d'utilisation. Et cela fonctionnera ainsi. Si nous avons 10 cĆurs, nous serons complĂštement tranquilles. Ainsi, nous pouvons Ă©valuer les ressources.
K002 - c'est ce que j'appelle des classes de requĂȘtes, câest-Ă -dire SELECT, INSERT, UPDATE, DELETE. Et sĂ©parĂ©ment SELECT FOR UPDATE, parce qu'il verrouille.
Ici, nous pouvons conclure que les SELECT ordinaires, donc de lecture â reprĂ©sentent 82 % de tous les appels, mais en mĂȘme temps â 74 % du total_time. Câest-Ă -dire qu'ils sont appelĂ©s beaucoup, mais consomment moins de ressources.

Revenons Ă la question : « Comment choisir correctement shared_buffers ? ». J'observe que la plupart des benchmarks sont construits sur l'idĂ©e - regardons quelle sera la capacitĂ© de traitement, câest-Ă -dire quelle sera le taux de transfert. Il est gĂ©nĂ©ralement mesurĂ© en TPS ou QPS.
Et nous essayons d'extraire de la machine le plus grand nombre possible de transactions par seconde Ă l'aide des paramĂštres d'optimisation. Ici, c'est justement 311 par seconde pour les select.

Mais personne ne va au travail et revient chez soi en voiture Ă pleine vitesse. Câest stupide. C'est pareil avec les bases de donnĂ©es. Nous ne devrions pas rouler Ă pleine vitesse, et personne ne le fait. Personne ne vit dans une production avec 100 % de CPU. Bien que certains puissent vivre ainsi, ce n'est pas une bonne chose.
L'idĂ©e est que nous roulons gĂ©nĂ©ralement Ă environ 20 % de notre capacitĂ©, de prĂ©fĂ©rence pas plus de 50 %. Et nous nous efforçons d'optimiser le temps de rĂ©ponse pour nos utilisateurs avant tout. Câest-Ă -dire que nous devons ajuster nos manettes pour qu'il y ait une latence minimale Ă 20 % de vitesse, de maniĂšre conditionnelle. C'est une idĂ©e que nous essayons Ă©galement d'utiliser dans nos expĂ©riences.

Et pour conclure avec les recommandations :
- Assurez-vous de créer un Database Lab.
- Si possible, faites-le Ă la demande, pour qu'il se dĂ©ploie pendant un certain temps - jouez avec et laissez tomber. Si vous avez des clouds, c'est Ă©vident, câest-Ă -dire qu'il faut avoir beaucoup de standing.
- Soyez curieux. Et si quelque chose ne va pas, faites des expĂ©riences pour voir comment cela fonctionne. Nancy peut ĂȘtre utilisĂ©e pour s'instruire et tester comment la base fonctionne.
- Visez le temps de réponse le plus court possible.
- Et n'ayez pas peur des sources de Postgres. Lorsque vous travaillez avec les sources, vous devez savoir l'anglais. Il y a beaucoup de commentaires, tout y est expliqué.
- Et vérifiez réguliÚrement la santé de la base, au moins une fois tous les trois mois manuellement ou avec Postgres-checkup.

Questions
Merci beaucoup ! C'est quelque chose de trÚs intéressant.
Deux choses.
Oui, deux choses. Je n'ai pas tout Ă fait compris. Lorsque nous travaillons avec Nancy, pouvons-nous ajuster un seul paramĂštre ou un groupe entier ?
Nous avons un paramĂštre de delta-config. Vous pouvez y ajuster autant de choses que vous le souhaitez en mĂȘme temps. Mais il faut comprendre que lorsque vous changez beaucoup de choses, vous pourriez en tirer des conclusions erronĂ©es.
Oui. Pourquoi ai-je demandé ça ? Parce qu'il est difficile de mener des expériences lorsque vous n'avez qu'un seul paramÚtre. Vous l'ajustez, regardez comment ça fonctionne. Vous le définissez. Ensuite, vous commencez avec le suivant.
Il est possible d'ajuster plusieurs paramĂštres en mĂȘme temps, mais ça dĂ©pend bien sĂ»r de la situation. Mais il est prĂ©fĂ©rable de tester une seule idĂ©e. Hier, nous avons eu une idĂ©e. Nous avions une situation trĂšs similaire. Il y avait deux configurations. Et nous ne pouvions pas comprendre pourquoi il y avait une si grande diffĂ©rence. L'idĂ©e Ă©tait d'utiliser la dichotomie pour comprendre sĂ©quentiellement et trouver la diffĂ©rence. Vous pouvez rendre simultanĂ©ment la moitiĂ© des paramĂštres identiques, puis un quart, et ainsi de suite. Tout est flexible.
J'ai encore une question. Le projet est jeune, en dĂ©veloppement. La documentation est-elle dĂ©jĂ prĂȘte, y a-t-il une description dĂ©taillĂ©e ?
J'ai mis un lien vers la description des paramĂštres lĂ -bas. Cela existe. Mais beaucoup de choses ne sont pas encore lĂ . Je cherche des personnes partageant les mĂȘmes idĂ©es. Et je les trouve lorsque je m'exprime. C'est vraiment gĂ©nial. Quelqu'un travaille dĂ©jĂ avec moi, quelqu'un a aidĂ© et a fait quelque chose lĂ -bas. Et si ce thĂšme vous intĂ©resse, faites-le moi savoir â ce qui manque.
Une fois que nous aurons Ă©tabli le laboratoire, peut-ĂȘtre qu'il y aura des retours. Nous verrons. Merci !
Bonjour ! Merci pour la présentation ! J'ai vu qu'il y avait un support pour Amazon. Est-il prévu de prendre en charge GSP ?
Bonne question. Nous avons commencĂ© Ă travailler dessus. Et nous avons mis cela en attente, car nous voulons Ă©conomiser. C'est-Ă -dire, il y a un support via run on localhost. Vous pouvez crĂ©er vous-mĂȘme une instance et travailler localement. D'ailleurs, c'est ce que nous faisons. Dans Getlab, je fais cela, il est sur GSP. Mais pour faire cette orchestration, nous ne voyons pas encore l'intĂ©rĂȘt, car Google n'a pas d'instances spot Ă bas prix. Il y a des instances ???, mais elles ont des limitations. Tout d'abord, il y a toujours seulement une remise de 70 %, et on ne peut pas jouer avec le prix. Nous augmentons le prix des spots de 5 Ă 10 % pour rĂ©duire la probabilitĂ© de se faire Ă©liminer. C'est-Ă -dire, vous Ă©conomisez sur les spots, mais ils peuvent vous ĂȘtre retirĂ©s Ă tout moment. Si vous fixez un prix un peu plus Ă©levĂ© que les autres, vous serez tuĂ©s plus tard. Google a une spĂ©cificitĂ© complĂštement diffĂ©rente. Et il y a une autre limitation trĂšs dĂ©savantageuse â elles ne vivent que 24 heures. Et parfois, nous voulons faire tourner l'expĂ©rience pendant 5 jours. Mais cela peut se faire sur des spots, parfois ils vivent des mois.
Bonjour ! Merci pour la présentation ! Vous avez mentionné le checkup. Comment calculez-vous les erreurs stat_statements ?
TrĂšs bonne question. Je peux montrer et expliquer en dĂ©tail. En rĂ©sumĂ© â nous regardons comment a fluctuĂ© le groupe de requĂȘtes : combien ont Ă©chouĂ© et combien de nouvelles sont apparues. Ensuite, nous examinons deux mĂ©triques : total_time et calls, donc il y a deux erreurs. Et nous regardons quelle est la contribution des groupes dĂ©faillants. Il y a deux sous-groupes : celui qui est parti et celui qui est arrivĂ©. Nous examinons quelle est leur contribution Ă l'ensemble.
N'avez-vous pas peur qu'elle soit analysée deux ou trois fois entre les snapshots ?
C'est-à -dire, se sont-ils réenregistrés ou comment cela se passe ?
Par exemple, cette requĂȘte a dĂ©jĂ Ă©tĂ© remplacĂ©e une fois, puis elle est revenue et a de nouveau Ă©tĂ© remplacĂ©e, puis elle est revenue encore une fois et a Ă©tĂ© remplacĂ©e. Et vous avez calculĂ© quelque chose ici, mais oĂč est tout cela ?
Bonne question, il faut regarder.
J'ai fait quelque chose de similaire. Moins compliqué, bien sûr, je l'ai fait seul. Mais j'ai dû tout réinitialiser, faire un reset stat_statements et m'orienter au moment du snapshot, en vérifiant qu'il y avait moins d'une certaine proportion pour savoir que ça n'avait pas atteint le plafond de ce que stat_statements pouvait accumuler. Et je me base sur le fait qu'il n'y a probablement rien qui ait été remplacé.
Oui-oui.
Mais je ne comprends pas comment faire autrement de maniĂšre fiable.
Malheureusement, je ne me souviens pas exactement â si nous utilisons lĂ -bas le texte de la requĂȘte ou le queryid avec pg_stat_statements en nous basant lĂ -dessus. Si nous nous basons sur le queryid, alors thĂ©oriquement, nous comparons des Ă©lĂ©ments comparables.
Non, il peut ĂȘtre Ă©vincĂ© plusieurs fois entre les instantanĂ©s et revenir Ă nouveau.
Avec ce mĂȘme ID ?
Oui.
Nous allons Ă©tudier cela. Bonne question. Il faut examiner. Mais pour lâinstant, ce que nous voyons, c'est que nous avons soit 0 Ă©crit...
C'est bien sĂ»r un cas rare, mais j'ai Ă©tĂ© choquĂ© d'apprendre que stat_statements pourrait ĂȘtre Ă©vincĂ©.
Il peut y avoir beaucoup de choses dans Pg_stat_statements. Nous avons constaté que si track_utility = on, alors vos ensembles sont également suivis.
Oui, bien sûr.
Et si vous avez Java Hibernate qui est aléatoire, alors la table de hachage commence à se bloquer. Et dÚs que vous désactivez une application trÚs chargée, vous avez environ 50 à 100 groupes. Et tout devient plus ou moins stable. Un des moyens de lutter contre cela est d'augmenter pg_stat_statements.max.
Oui, mais il faut savoir de combien. Et il faut le surveiller. C'est ce que je fais. C'est-à -dire que j'ai pg_stat_statements.max. Et je vérifie que je n'ai pas atteint 70 % au moment de l'instantané. Bien, cela signifie que nous n'avons rien perdu. Nous faisons un reset. Et nous accumulons à nouveau. Si lors du prochain instantané, c'est moins de 70, cela signifie probablement que nous n'avons de nouveau rien perdu.
Oui. Par défaut, c'est maintenant 5 000. Et beaucoup de gens s'en contentent.
En général, oui.
Vidéo :

P.S. J'ajoute que si Postgres contient des données confidentielles qui ne doivent pas se retrouver dans l'environnement de test, il est possible d'utiliser . Le schéma est à peu prÚs le suivant :

Source : habr.com
