{"id":78742,"date":"2020-04-21T19:42:46","date_gmt":"2020-04-21T17:42:46","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov"},"modified":"2020-04-21T19:42:46","modified_gmt":"2020-04-21T17:42:46","slug":"promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Une approche industrielle pour l'optimisation de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es. Nicolas Samokhalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Je vous invite \u00e0 d\u00e9couvrir la transcription de l'expos\u00e9 de Nikolay Samokhvalov intitul\u00e9 \u00ab Approche industrielle du tuning de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es \u00bb<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25 % \u2013 est-ce beaucoup ou peu ? Ou juste ce qu'il faut ? Comment d\u00e9terminer si cette recommandation \u2013 assez ancienne \u2013 est appropri\u00e9e dans votre cas sp\u00e9cifique ?<\/p>\n<p><\/p>\n<p>Il est temps d'aborder la question de la s\u00e9lection des param\u00e8tres postgresql.conf de mani\u00e8re \u00ab professionnelle \u00bb. Pas avec des \u00ab autotuners \u00bb aveugles ou des conseils d\u00e9pass\u00e9s provenant d'articles et de blogs, mais sur la base de :<\/p>\n<p><\/p>\n<ol>\n<li>tests rigoureusement men\u00e9s sur des bases de donn\u00e9es, r\u00e9alis\u00e9s de mani\u00e8re automatis\u00e9e, en grande quantit\u00e9 et dans des conditions aussi proches que possible des conditions \u00ab r\u00e9elles \u00bb.<\/li>\n<li>d'une compr\u00e9hension approfondie des sp\u00e9cificit\u00e9s de fonctionnement des SGBD et des syst\u00e8mes d'exploitation.<\/li>\n<\/ol>\n<p><\/p>\n<p>En utilisant Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), nous examinerons un cas concret \u2013 les fameux shared_buffers \u2013 dans diff\u00e9rentes situations, sur diff\u00e9rents projets, et nous essaierons de comprendre comment bien ajuster cette configuration pour notre infrastructure, nos bases de donn\u00e9es et notre charge.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a15b93734b6563abaec4a713c975732a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Nous parlerons d'exp\u00e9riences sur les bases de donn\u00e9es. C'est une histoire qui dure depuis un peu plus de six mois. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un peu sur moi. Une exp\u00e9rience avec Postgres de plus de 14 ans. J'ai fond\u00e9 plusieurs soci\u00e9t\u00e9s de r\u00e9seaux sociaux. Partout, Postgres a \u00e9t\u00e9 utilis\u00e9 et continue de l'\u00eatre.<\/p>\n<p><\/p>\n<p>Aussi, le groupe RuPostgres sur Meetup, deuxi\u00e8me au monde. Nous nous approchons lentement des 2000 membres. RuPostgres.org.<\/p>\n<p><\/p>\n<p>Et lors de plusieurs conf\u00e9rences, y compris Highload, je suis responsable des bases de donn\u00e9es, notamment de Postgres depuis sa cr\u00e9ation.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ces derni\u00e8res ann\u00e9es, j'ai red\u00e9marr\u00e9 ma pratique de consultance sur Postgres dans 11 fuseaux horaires diff\u00e9rents.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lorsque j'ai fait cela il y a quelques ann\u00e9es, il m'a fallu une pause dans le travail manuel actif avec Postgres, probablement depuis 2010. J'ai \u00e9t\u00e9 surpris de voir \u00e0 quel point la vie quotidienne des DBA avait peu chang\u00e9, combien il fallait encore faire de travail manuel. Et j'ai imm\u00e9diatement pens\u00e9 qu'il y avait un probl\u00e8me, qu'il fallait automatiser beaucoup plus de choses.<\/p>\n<p><\/p>\n<p>Et comme tout cela se passait \u00e0 distance, la plupart des clients \u00e9taient dans le cloud. Et d\u00e9j\u00e0 beaucoup de choses \u00e9taient clairement automatis\u00e9es. J'y reviendrai plus tard. C'est-\u00e0-dire que cela a conduit \u00e0 l'id\u00e9e qu'il devait y avoir un certain nombre d'outils, \u00e0 savoir une plateforme qui automatiserait presque toutes les actions des DBA, afin de pouvoir g\u00e9rer un grand nombre de bases.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cette pr\u00e9sentation ne contiendra pas :<\/p>\n<p><\/p>\n<ul>\n<li>de \u00ab solutions miracles \u00bb ou d'affirmations comme \u2013 mettez 8 Go ou 25 % de shared_buffers et tout ira bien. Il n'y aura pas beaucoup \u00e0 dire sur les shared_buffers. <\/li>\n<li>Des \u00e9l\u00e9ments \u00ab hardcore \u00bb. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et qu'est-ce qui va se passer ?<\/p>\n<p><\/p>\n<ul>\n<li>Il y aura des principes d'optimisation que nous appliquons et d\u00e9veloppons. Il y aura diverses id\u00e9es qui apparaissent en cours de route et diff\u00e9rents outils que nous cr\u00e9ons principalement en Open Source, c'est-\u00e0-dire que nous \u00e9tablissons 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. <\/li>\n<li>Il y aura \u00e9galement quelques exp\u00e9riences d'utilisation de ces principes et outils dans diverses entreprises : des petites start-ups aux grandes entreprises. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comment tout cela \u00e9volue-t-il ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tout d'abord, la principale t\u00e2che d'un DBA en plus de garantir la cr\u00e9ation d'instances, le d\u00e9ploiement des sauvegardes, etc., est de trouver les goulets d'\u00e9tranglement et d'optimiser la performance.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Actuellement, cela fonctionne de cette mani\u00e8re. Nous regardons le monitoring, nous voyons quelque chose, il nous manque des d\u00e9tails. Nous commen\u00e7ons \u00e0 examiner plus attentivement, habituellement \u00e0 la main, et nous comprenons ce qu'il faut faire.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il existe deux approches. Pg_stat_statements est la solution standard par d\u00e9faut pour identifier les requ\u00eates lentes. Et l'analyse des journaux Postgres avec pgBadger.<\/p>\n<p><\/p>\n<p>Chacune de ces approches a de s\u00e9rieux inconv\u00e9nients. La premi\u00e8re approche nous laisse sans tous les param\u00e8tres. Si nous voyons des groupes SELECT * FROM table where la colonne est \u00e9gale \u00e0 \u00ab ? \u00bb ou \u00ab $ \u00bb \u00e0 partir de la version 10 de Postgres, nous ne savons pas si c'est un index scan ou un seq scan. Cela d\u00e9pend beaucoup du param\u00e8tre. Si vous introduisez une valeur rarement rencontr\u00e9e, ce sera un index scan. Si vous introduisez une valeur qui repr\u00e9sente 90 % de la table, ce sera un seq scan, car Postgres conna\u00eet les statistiques. C'est un gros inconv\u00e9nient de pg_stat_statements, bien que des travaux soient en cours.<\/p>\n<p><\/p>\n<p>L'analyse des journaux a le principal inconv\u00e9nient que vous ne pouvez g\u00e9n\u00e9ralement pas vous permettre de d\u00e9finir \u00ab log_min_duration_statement = 0 \u00bb. Nous en discuterons \u00e9galement. Par cons\u00e9quent, vous ne voyez pas le tableau complet. Une requ\u00eate tr\u00e8s rapide peut consommer une \u00e9norme quantit\u00e9 de ressources, mais vous ne la verrez pas, car elle est en dessous de votre seuil.<\/p>\n<p><\/p>\n<p><strong>Comment les DBA r\u00e9solvent-ils les probl\u00e8mes identifi\u00e9s ?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Par exemple, nous avons trouv\u00e9 un probl\u00e8me. Que fait-on habituellement ? Si vous \u00eates d\u00e9veloppeur, vous allez effectuer des actions sur une instance qui n'est pas \u00e0 la bonne taille. Si vous \u00eates 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\u00eame les DBA exp\u00e9riment\u00e9s v\u00e9rifient ensuite en production, sur une r\u00e9plique. Il arrive qu'ils cr\u00e9ent un index temporaire, s'assurent qu'il aide, le suppriment et le remettent aux d\u00e9veloppeurs pour qu'ils l'int\u00e8grent dans les fichiers de migration. C'est ce genre d'ineptie qui se produit actuellement. Et c'est un vrai probl\u00e8me.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/402e80c7e5fbca6a054c0c9ec61e5fe3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Ajuster les configurations.<\/li>\n<li>Optimiser l'ensemble des index. <\/li>\n<li>Modifier la requ\u00eate SQL elle-m\u00eame (c'est le moyen le plus complexe).<\/li>\n<li>Ajouter des ressources (le moyen le plus simple dans la plupart des cas).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il y a beaucoup de choses \u00e0 consid\u00e9rer. Il y a de nombreux leviers dans Postgres. Il faut avoir une connaissance approfondie. Beaucoup d'index dans Postgres, gr\u00e2ce notamment aux organisateurs de cette conf\u00e9rence. Et il faut tout savoir, et c'est pr\u00e9cis\u00e9ment ce qui donne \u00e0 ceux qui ne sont pas DBA l'impression que les DBA pratiquent la magie noire. C'est-\u00e0-dire qu'il faut s'y consacrer pendant dix ans pour commencer \u00e0 bien comprendre tout \u00e7a.<\/p>\n<p><\/p>\n<p>Et moi, je suis un combattant de cette magie noire. Je veux faire en sorte qu'il y ait une technologie plut\u00f4t qu'une intuition dans tout \u00e7a.<\/p>\n<p><\/p>\n<p><strong>Exemples de la vie r\u00e9elle<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je l'ai constat\u00e9 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\u00e8s bien, essayons en production.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et ici, nous, en utilisant notre outil deux ans plus tard gr\u00e2ce \u00e0 des exp\u00e9riences sur des bases de donn\u00e9es, dont nous parlons aujourd'hui, pouvons comparer ce qui \u00e9tait et ce qui est devenu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour cela, nous devons cr\u00e9er une exp\u00e9rience. Elle se compose de quatre parties. <\/p>\n<p><\/p>\n<ul>\n<li>La premi\u00e8re \u2013 c'est l'environnement. Nous avons besoin de mat\u00e9riel. Et quand je vais dans une entreprise et que je signe un contrat, je dis qu'il me faut du mat\u00e9riel identique \u00e0 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\u00eame mat\u00e9riel. C'est-\u00e0-dire que je veux recr\u00e9er l'environnement. Et dans cette notion d'environnement, nous devons inclure la version majeure de Postgres. <\/li>\n<li>La deuxi\u00e8me partie \u2013 c'est l'objet de nos recherches. C'est la base de donn\u00e9es. Elle peut \u00eatre cr\u00e9\u00e9e de plusieurs mani\u00e8res. Je vais montrer comment. <\/li>\n<li>La troisi\u00e8me partie \u2013 c'est la charge. C'est le moment le plus complexe. <\/li>\n<li>La quatri\u00e8me partie est ce que nous v\u00e9rifions, c'est-\u00e0-dire ce avec quoi nous allons comparer. Par exemple, nous pouvons modifier un ou plusieurs param\u00e8tres dans la configuration, ou cr\u00e9er un index, etc. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous lan\u00e7ons une exp\u00e9rience. Voici pg_stat_statements. \u00c0 gauche, ce qui \u00e9tait. \u00c0 droite, ce qui est devenu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c0 gauche, default_statistics_target = 100, \u00e0 droite = 1 000. Nous voyons que cela nous a aid\u00e9s. En g\u00e9n\u00e9ral, tout s'est am\u00e9lior\u00e9 de 8 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais si nous faisons d\u00e9filer vers le bas, nous trouverons des groupes de requ\u00eates provenant de pgBadger ou de pg_stat_statements. Il y a deux options. Nous verrons qu'une certaine requ\u00eate a chut\u00e9 de 88 %. C'est l\u00e0 qu'une approche d'ing\u00e9nierie entre en jeu. Nous pouvons creuser plus profond\u00e9ment, car il est int\u00e9ressant de savoir pourquoi elle a chut\u00e9. Il faut comprendre ce qui se passait avec la statistique. Pourquoi un plus grand nombre de buckets dans la statistique conduit \u00e0 un r\u00e9sultat moins bon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ou nous pouvons ne pas creuser, mais faire un \u00ab ALTER TABLE \u2026 ALTER COLUMN \u00bb et remettre 100 buckets \u00e0 la statistique de cette colonne. Ensuite, nous pouvons encore exp\u00e9rimenter pour nous assurer que ce correctif a aid\u00e9. Voil\u00e0, c'est cela une approche d'ing\u00e9nierie qui nous aide \u00e0 voir la situation et \u00e0 prendre des d\u00e9cisions bas\u00e9es sur des donn\u00e9es plut\u00f4t que sur de l'intuition.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c87df172b994a4523478beebaf4a0275.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Voici quelques exemples d'autres domaines. Dans les tests, il existe des tests CI depuis de nombreuses ann\u00e9es. Et aucun projet sens\u00e9 ne vivra sans tests automatis\u00e9s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dans d'autres industries : dans l'aviation, dans l'automobile, lorsque nous testons l'a\u00e9rodynamique, nous avons aussi la possibilit\u00e9 de faire des exp\u00e9riences. Nous ne lan\u00e7ons pas quelque chose directement dans l'espace bas\u00e9 sur un dessin ou ne mettons pas une voiture directement sur la route. Par exemple, il existe une soufflerie a\u00e9rodynamique. <\/p>\n<p><\/p>\n<p>Des observations d'autres industries nous permettent de tirer des conclusions. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tout d'abord, nous avons un environnement sp\u00e9cial. Il est proche de la production, mais pas tout \u00e0 fait. Sa principale caract\u00e9ristique est qu'il doit \u00eatre bon march\u00e9, r\u00e9p\u00e9table et aussi automatis\u00e9 que possible. De plus, il doit y avoir des outils sp\u00e9ciaux pour effectuer une analyse d\u00e9taill\u00e9e.<\/p>\n<p><\/p>\n<p>Il est probable que lorsque nous avons lanc\u00e9 l'avion et que nous volons, nous avons moins d'opportunit\u00e9s d'\u00e9tudier chaque millim\u00e8tre 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\u00eame avec Postgres. Dans certains cas, nous pouvons activer la journalisation compl\u00e8te des requ\u00eates lors des exp\u00e9riences. Et nous ne voulons pas faire cela en production. Nous pourrions m\u00eame l'activer avec les plans \u00e0 l'aide de auto_explain.<\/p>\n<p><\/p>\n<p>Comme je l'ai d\u00e9j\u00e0 dit, un haut niveau d'automatisation signifie que nous avons appuy\u00e9 sur un bouton et r\u00e9p\u00e9t\u00e9. C'est comme cela que cela doit \u00eatre, afin d'avoir beaucoup d'exp\u00e9riences, pour que ce soit en continu.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 la base du \u00ab laboratoire DB \u00bb<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et nous avons cr\u00e9\u00e9 quelque chose comme \u00e7a. C'est-\u00e0-dire que j'avais parl\u00e9 de ces id\u00e9es en juin, il y a presque un an. Et nous avons d\u00e9j\u00e0 dans Open Source ce qu'on appelle Nancy CLI. C'est la fondation pour construire un laboratoire de bases de donn\u00e9es.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0ed3c72461123745be4fa9e58455baa0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\">Nancy<\/a><\/noindex> \u2013 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 <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> pour tous les param\u00e8tres.<\/p>\n<p><\/p>\n<p>Bien s\u00fbr, il y a encore beaucoup de choses en cours de d\u00e9veloppement. Il y a beaucoup d'id\u00e9es. Mais c'est d\u00e9j\u00e0 ce que nous appliquons pratiquement tous les jours. Et lorsque nous avons une id\u00e9e \u2013 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\u00e9rience et regarder de plus pr\u00e8s pour comprendre ce qui se passe et ensuite essayer de le corriger en cours de route. C'est-\u00e0-dire que nous faisons une exp\u00e9rience. Par exemple, nous ajustons quelque chose et voyons ce qui en r\u00e9sulte. Et nous ne le faisons pas en production. C'est l'id\u00e9e principale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O\u00f9 cela peut-il fonctionner ? Cela peut fonctionner localement, c'est-\u00e0-dire que cela peut \u00eatre fait n'importe o\u00f9, m\u00eame 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.<\/p>\n<p><\/p>\n<p>Il existe \u00e9galement la possibilit\u00e9 de lancer \u00e0 distance sur Amazon EC2 Instance, en spots. C'est une fonctionnalit\u00e9 tr\u00e8s int\u00e9ressante. Par exemple, hier, nous avons r\u00e9alis\u00e9 plus de 500 exp\u00e9riences sur une instance i3, en commen\u00e7ant par la plus petite et en terminant par l'i3-16-xlarge. Et ces 500 exp\u00e9riences nous ont co\u00fbt\u00e9 64 dollars. Chacune a dur\u00e9 15 minutes. Gr\u00e2ce aux spots, cela devient tr\u00e8s abordable \u2013 une remise de 70 %, tarif \u00e0 la seconde d'Amazon. Vous pouvez faire beaucoup de choses. Vous pouvez mener une v\u00e9ritable recherche.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Trois versions majeures de Postgres sont prises en charge. Ce n'est pas si compliqu\u00e9 d'adapter des anciennes versions et la nouvelle version 12 aussi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous pouvons d\u00e9finir l'objet de trois mani\u00e8res. Ce sont :<\/p>\n<p><\/p>\n<ul>\n<li>Dump\/fichier SQL. <\/li>\n<li>Le principal moyen est de cloner le r\u00e9pertoire PGDATA. En g\u00e9n\u00e9ral, 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\u00e9t\u00e9 cloud type Amazon ou Google s'en occupera pour vous. C'est la m\u00e9thode principale pour cloner un environnement de production r\u00e9el. Nous d\u00e9ployons en utilisant cette m\u00e9thode. <\/li>\n<li>Et la derni\u00e8re m\u00e9thode convient pour les recherches, lorsque vous souhaitez comprendre comment quelque chose fonctionne dans Postgres. C'est pgbench. Vous pouvez g\u00e9n\u00e9rer avec pgbench. C'est juste une option \"db-pgbench\". Vous lui indiquez le scale. Et tout sera g\u00e9n\u00e9r\u00e9 dans le cloud, comme indiqu\u00e9.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et la charge :<\/p>\n<p><\/p>\n<ul>\n<li>Nous pouvons ex\u00e9cuter la charge en un seul flux SQL. C'est la m\u00e9thode la plus primitive. <\/li>\n<li>Nous pouvons aussi \u00e9muler la charge. Et nous pouvons l'\u00e9muler principalement de la mani\u00e8re suivante. Nous devons collecter tous les logs. Et cela peut \u00eatre p\u00e9nible. Je vais montrer pourquoi. Et \u00e0 l'aide de pgreplay, int\u00e9gr\u00e9 dans Nancy, nous pouvons les rejouer. <\/li>\n<li>Ou une autre option. La soi-disant charge artisanale, que nous cr\u00e9ons avec un certain effort. En analysant notre charge actuelle sur le syst\u00e8me de production, nous extrayons les groupes de requ\u00eates les plus performants. Et avec pgbench, nous pouvons \u00e9muler cette charge en laboratoire. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4adba12881faf9ad9d4f9e9f42c0f5c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Ou bien nous devons ex\u00e9cuter une requ\u00eate SQL, c'est-\u00e0-dire v\u00e9rifier une migration, cr\u00e9er un index, ex\u00e9cuter ANALYZE. Et nous observons ce qui s'est pass\u00e9 avant et apr\u00e8s le vacuum. En g\u00e9n\u00e9ral, n'importe quelle SQL.<\/li>\n<li>Soit nous modifions un ou plusieurs param\u00e8tres dans la configuration. Nous pouvons demander de v\u00e9rifier, par exemple, 100 valeurs sur Amazon pour notre base de donn\u00e9es de un t\u00e9raoctet. Et apr\u00e8s quelques heures, vous aurez le r\u00e9sultat. En r\u00e8gle g\u00e9n\u00e9rale, une base de donn\u00e9es de un t\u00e9raoctet se d\u00e9ploiera pendant plusieurs heures. Mais dans le d\u00e9veloppement, il y a un correctif, nous avons une s\u00e9rie possible, c'est-\u00e0-dire que vous pouvez utiliser le m\u00eame pgdata successivement sur le m\u00eame serveur et effectuer des v\u00e9rifications. Postgres red\u00e9marrera, les caches seront vid\u00e9s. Et vous pouvez ex\u00e9cuter la charge. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/02985b47bf0ab62e8f1c4cc3ea003f26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Une directory arrive, contenant une multitude de fichiers, allant des snapshots pg<em>stat<\/em>***. Et l\u00e0, le plus int\u00e9ressant \u2013 c'est pg_stat_statements, pg_stat_kcache. Ce sont deux extensions qui analysent les requ\u00eates. Et pg_stat_bgwriter contient non seulement les statistiques de pgwriter, mais aussi celles relatives aux checkpoints et \u00e0 la fa\u00e7on dont les backends expulsent les buffers sales. Et c'est int\u00e9ressant \u00e0 observer. Par exemple, lorsque nous configurons shared_buffers, il est tr\u00e8s int\u00e9ressant de voir combien chacune a expuls\u00e9.<\/li>\n<li>Des journaux Postgres arrivent \u00e9galement. Deux journaux \u2013 le journal de pr\u00e9paration et le journal de replay de charge. <\/li>\n<li>Une fonctionnalit\u00e9 relativement nouvelle \u2013 c'est les FlameGraphs.<\/li>\n<li>De plus, si vous avez utilis\u00e9 pgreplay ou pgbench pour le replay de charge, leur sortie native sera pr\u00e9sente. Et vous pourrez voir la latence et le TPS. Cela vous permettra de comprendre comment ils ont observ\u00e9 cela. <\/li>\n<li>Informations sur le syst\u00e8me. <\/li>\n<li>V\u00e9rifications 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\u00e9rents tests, vous aurez 10 000 exp\u00e9riences. Et vous devez vous assurer que vous n'avez pas eu une instance d\u00e9fectueuse, qu'un autre utilisateur exploite d\u00e9j\u00e0. Sur ce mat\u00e9riel, d'autres fonctionnent et il ne vous reste pas beaucoup de ressources. De tels r\u00e9sultats doivent \u00eatre \u00e9cart\u00e9s. Et c'est exactement avec l'aide de sysbench d'Alexey Kopytov que nous r\u00e9alisons quelques courtes v\u00e9rifications, qui arriveront et pourront \u00eatre compar\u00e9es aux autres, c'est-\u00e0-dire que vous comprendrez comment se comporte le CPU et comment se comporte l'IO. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quelles sont les complexit\u00e9s techniques \u00e0 travers diff\u00e9rentes entreprises ?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supposons que nous souhaitions reproduire une charge r\u00e9elle \u00e0 l'aide des journaux. Excellente id\u00e9e, si cela est \u00e9crit sur Open Source pgreplay. Nous l'utilisons. Mais pour qu'il fonctionne bien, vous devez activer la journalisation compl\u00e8te des requ\u00eates avec les param\u00e8tres et les timings.<\/p>\n<p><\/p>\n<p>Il y a certaines complications concernant la dur\u00e9e et l'horodatage. Nous allons ignorer cette partie. La question principale est : pouvez-vous vous le permettre ou non ? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5d08fadbaf67b8a137212302b6adf48a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408\">https:\/\/gist.github.com\/NikolayS\/08d9b7b4845371d03e195a8d8df43408<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Le probl\u00e8me, c'est que cela peut \u00eatre inaccessible. Vous devez d'abord comprendre quel flux sera inscrit dans le journal. Si vous avez pg_stat_statements, vous pouvez utiliser cette requ\u00eate (le lien sera disponible dans les diapositives) pour estimer combien de bytes seront \u00e9crits par seconde.<\/p>\n<p><\/p>\n<p>Nous regardons la longueur de la requ\u00eate. Nous ignorons le fait qu'il n'y a pas de param\u00e8tres, mais nous connaissons la longueur de la requ\u00eate et savons combien de fois elle est ex\u00e9cut\u00e9e par seconde. Ainsi, nous pouvons estimer combien de bytes par seconde cela repr\u00e9sente. Nous pouvons nous tromper d'un facteur deux, mais nous aurons une id\u00e9e du bon ordre.<\/p>\n<p><\/p>\n<p>Nous pouvons voir que cette requ\u00eate est ex\u00e9cut\u00e9e 802 fois par seconde. Et nous constatons qu'environ 300 kB\/s seront \u00e9crits. En g\u00e9n\u00e9ral, ce type de flux est g\u00e9rable. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais ! Le fait est qu'il existe diff\u00e9rents syst\u00e8mes de journalisation. Et par d\u00e9faut, les gens utilisent g\u00e9n\u00e9ralement \u00ab syslog \u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si vous avez syslog, vous pouvez vous retrouver avec ce type de r\u00e9sultats. Nous allons utiliser pgbench, activer la journalisation des requ\u00eates et voir ce que cela donne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sans journalisation \u2013 cela correspond \u00e0 la colonne de gauche. Nous obtenons 161 000 TPS. Avec syslog \u2013 sous Ubuntu 16.04 sur Amazon, nous avons 37 000 TPS. Si nous changeons pour deux autres m\u00e9thodes de journalisation, la situation s'am\u00e9liore consid\u00e9rablement. C'est-\u00e0-dire que nous nous attendions \u00e0 une baisse, mais pas \u00e0 ce point.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et sous CentOS 7, o\u00f9 journald est \u00e9galement impliqu\u00e9, convertissant les journaux en format binaire pour une recherche plus facile, la situation est catastrophique, avec une baisse de 44 fois en TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est ce dont les gens vivent. Et souvent, dans les entreprises, surtout les grandes, il est tr\u00e8s difficile de changer cela. Si vous pouvez vous \u00e9loigner de syslog, n'h\u00e9sitez pas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>\u00c9valuez les IOPS et le flux d'\u00e9criture. <\/li>\n<li>V\u00e9rifiez votre syst\u00e8me de journalisation. <\/li>\n<li>Si la charge pr\u00e9vue est trop \u00e9lev\u00e9e, envisagez l'option de l'\u00e9chantillonnage. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons pg_stat_statements. Comme je l'ai dit, il doit absolument \u00eatre pr\u00e9sent. Nous pouvons d\u00e9crire chaque groupe de requ\u00eates d'une mani\u00e8re particuli\u00e8re dans un fichier. Ensuite, nous pouvons utiliser une fonctionnalit\u00e9 tr\u00e8s pratique dans pgbench \u2013 la possibilit\u00e9 de soumettre plusieurs fichiers avec l'option \u00ab -f \u00bb.<\/p>\n<p><\/p>\n<p>Il comprend beaucoup de \u00ab -f \u00bb. Et on peut indiquer avec \u00ab @ \u00bb \u00e0 la fin quelle part de chaque fichier doit \u00eatre utilis\u00e9e. C'est-\u00e0-dire, nous pouvons dire que celui-ci doit \u00eatre ex\u00e9cut\u00e9 dans 10 % des cas, et celui-l\u00e0 dans 20 %. Cela nous rapprochera de ce que nous voyons en production.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et comment allons-nous savoir ce que nous avons en production ? Quelle part et quoi exactement ? Ici, nous nous \u00e9loignons un peu. Nous avons encore un autre produit. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. C'est aussi une base en Open Source. Et nous sommes actuellement en train de le d\u00e9velopper activement.<\/p>\n<p><\/p>\n<p>Il est n\u00e9 pour d'autres raisons. En raison du fait que la surveillance est insuffisante. C'est-\u00e0-dire, vous arrivez, regardez la base, examinez les probl\u00e8mes. Et, en g\u00e9n\u00e9ral, vous faites un health_check. Si vous \u00eates un DBA exp\u00e9riment\u00e9, 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 \u2013 n'h\u00e9sitez pas \u00e0 l'installer, tout est vraiment bien fait. C'est payant.<\/p>\n<p><\/p>\n<p>Si vous ne l'avez pas, en g\u00e9n\u00e9ral, il y a peu de choses. La surveillance inclut normalement le CPU, l'IO et encore avec des r\u00e9serves, 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\u00e9parer le checkpoint du bgwriter et des backends, etc.<\/p>\n<p><\/p>\n<p>Le probl\u00e8me est que lorsque vous aidez une grande entreprise, elle ne peut pas mettre quelque chose en \u0153uvre rapidement. Elle ne peut pas acheter OKmeter rapidement. Peut-\u00eatre que dans six mois, elle l'ach\u00e8tera. Elle ne peut pas installer certains packages rapidement. <\/p>\n<p><\/p>\n<p>Nous avons donc eu l'id\u00e9e qu'il nous fallait un outil sp\u00e9cial qui ne n\u00e9cessite aucune installation, c'est-\u00e0-dire que vous ne devez rien installer en production. Vous l'installez sur votre ordinateur portable ou sur un serveur d'observation \u00e0 partir duquel vous allez l'ex\u00e9cuter. Et il va analyser beaucoup de choses : le syst\u00e8me d'exploitation, le syst\u00e8me de fichiers, et Postgres lui-m\u00eame, en effectuant quelques requ\u00eates l\u00e9g\u00e8res qui peuvent \u00eatre ex\u00e9cut\u00e9es directement en production sans causer de probl\u00e8mes.<\/p>\n<p><\/p>\n<p>Nous l'avons appel\u00e9 Postgres-checkup. Si l'on parle de m\u00e9decine, c'est un contr\u00f4le de sant\u00e9 r\u00e9gulier. 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\u00e9es ? C'est-\u00e0-dire, faites-vous r\u00e9guli\u00e8rement une recherche approfondie ? Vous devez le faire. Si vous faites des sauvegardes, faites aussi des checkups, c'est tout aussi important.<\/p>\n<p><\/p>\n<p>Et nous avons un tel outil. Il a commenc\u00e9 \u00e0 se d\u00e9velopper activement il y a seulement trois mois. Il est encore jeune, mais il y a d\u00e9j\u00e0 beaucoup de choses.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous rassemblons les groupes de requ\u00eates les plus \u00ab influents \u00bb \u2013 rapport K003 dans Postgres-checkup<\/p>\n<p><\/p>\n<p>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\u00e9 par total_time.<\/p>\n<p><\/p>\n<p>Lorsque nous classons les groupes de requ\u00eates par total_time, nous voyons en haut un groupe qui charge notre syst\u00e8me de mani\u00e8re significative, c'est-\u00e0-dire qui consomme le plus de ressources. Pourquoi appelons-nous cela des groupes de requ\u00eates ? Parce que nous avons \u00e9limin\u00e9 les param\u00e8tres. Ce ne sont plus des requ\u00eates, mais des groupes de requ\u00eates, c'est-\u00e0-dire qu'ils sont abstraits.<\/p>\n<p><\/p>\n<p>Et si nous optimisons du haut vers le bas, nous all\u00e9geons nos ressources et repoussons le moment o\u00f9 nous devrons effectuer une mise \u00e0 niveau. C'est un tr\u00e8s bon moyen d'\u00e9conomiser de l'argent.<\/p>\n<p><\/p>\n<p>Peut-\u00eatre que ce n'est pas une tr\u00e8s bonne approche en termes de satisfaction des utilisateurs, car nous ne voyons peut-\u00eatre pas des cas rares mais tr\u00e8s ennuyeux o\u00f9 une personne attendait 15 secondes. En somme, ils sont si rares que nous ne les voyons pas, mais nous g\u00e9rons les ressources.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Que s'est-il pass\u00e9 dans ce tableau ? Nous avons fait deux snapshots. Postgres_checkup vous donnera la diff\u00e9rence pour chaque m\u00e9trique : par total-time, calls, rows, shared_blks_read, etc. Voil\u00e0, la diff\u00e9rence a \u00e9t\u00e9 calcul\u00e9e. Le gros probl\u00e8me avec pg_stat_statements est qu'il ne se souvient pas quand il a \u00e9t\u00e9 r\u00e9initialis\u00e9. 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\u00f9 il a \u00e9t\u00e9 calcul\u00e9.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ici, nous savons, ici nous avons deux snapshots. Nous savons que la diff\u00e9rence dans ce cas \u00e9tait de 56 secondes. Un intervalle tr\u00e8s court. Nous avons tri\u00e9 par total_time. Et ensuite, nous pouvons diff\u00e9rencier, c'est-\u00e0-dire que nous divisons toutes les m\u00e9triques par la dur\u00e9e. Si nous divisons chaque m\u00e9trique par la dur\u00e9e, nous obtiendrons le nombre d'appels par seconde.<\/p>\n<p><\/p>\n<p>Ensuite, le total_time par seconde \u2013 c'est ma m\u00e9trique pr\u00e9f\u00e9r\u00e9e. Elle se mesure en secondes, par seconde, c'est-\u00e0-dire combien de secondes notre syst\u00e8me a mis pour ex\u00e9cuter ce groupe de requ\u00eates 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\u00e8s bonne m\u00e9trique. Vous pouvez comprendre que cette entit\u00e9, par exemple, a besoin d'au moins trois noyaux.<\/p>\n<p><\/p>\n<p>Voici notre innovation, je n'ai jamais vu \u00e7a ailleurs. Notez bien \u2013 c'est une chose tr\u00e8s simple \u2013 seconde par seconde. Parfois, lorsque votre CPU est \u00e0 100 %, cela fait une demi-heure par seconde, c'est-\u00e0-dire que vous avez trait\u00e9 uniquement ces requ\u00eates pendant une demi-heure. <\/p>\n<p><\/p>\n<p>Ensuite, nous voyons le nombre de lignes par seconde. Nous savons combien de lignes ont \u00e9t\u00e9 renvoy\u00e9es par seconde.<\/p>\n<p><\/p>\n<p>Et ensuite, il y a aussi une chose int\u00e9ressante. Combien de shared_buffers nous avons lus par seconde \u00e0 partir des shared_buffers. Les hits \u00e9taient d\u00e9j\u00e0 l\u00e0, et les lignes ont \u00e9t\u00e9 prises \u00e0 partir du cache du syst\u00e8me d'exploitation ou du disque. La premi\u00e8re option est rapide, et la seconde peut \u00eatre rapide, mais cela d\u00e9pend de la situation. <\/p>\n<p><\/p>\n<p>Et la deuxi\u00e8me m\u00e9thode de diff\u00e9renciation consiste \u00e0 diviser le nombre de requ\u00eates dans ce groupe. Dans la deuxi\u00e8me colonne, vous aurez toujours une requ\u00eate divis\u00e9e par la requ\u00eate. Et ensuite, il est int\u00e9ressant de voir combien de millisecondes cela a pris pour cette requ\u00eate. Nous savons comment cette requ\u00eate se comporte en moyenne. 101 millisecondes \u00e9taient n\u00e9cessaires pour chaque requ\u00eate. C'est une m\u00e9trique traditionnelle dont nous avons besoin pour comprendre.<\/p>\n<p><\/p>\n<p>Combien de lignes chaque requ\u00eate a renvoy\u00e9es en moyenne. Nous voyons que ce groupe en renvoie 8. Combien ont \u00e9t\u00e9 prises et lues en moyenne depuis le cache. Nous constatons que tout est bien mis en cache. Des hits complets pour le premier groupe. <\/p>\n<p><\/p>\n<p>Et la quatri\u00e8me 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\u00e9rieure \u00e0 0,01 %. Autrement dit, il est si lent que nous ne le voyons pas dans l'ensemble du tableau. Et le deuxi\u00e8me groupe \u2013 5 % des appels. C\u2019est-\u00e0-dire que 5 % de tous les appels proviennent du deuxi\u00e8me groupe. <\/p>\n<p><\/p>\n<p>Concernant le total_time, c'est aussi int\u00e9ressant. Pour le premier groupe de requ\u00eates, nous avons d\u00e9pens\u00e9 14 % de tout le temps de fonctionnement. Et pour le deuxi\u00e8me \u2013 11 % et ainsi de suite. <\/p>\n<p><\/p>\n<p>Je ne vais pas entrer dans les d\u00e9tails, mais il y a des subtilit\u00e9s. Nous affichons l'erreur en haut, car lorsque nous comparons, les instantan\u00e9s peuvent d\u00e9river, c\u2019est-\u00e0-dire que certaines requ\u00eates peuvent disparaitre et ne peuvent pas \u00eatre pr\u00e9sentes dans le deuxi\u00e8me, tandis que certaines peuvent appara\u00eetre. 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\u00e9rieur \u00e0 20 %, c'est OK. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ensuite, nous revenons \u00e0 notre sujet. Nous devons cr\u00e9er une charge de travail. Nous prenons de haut en bas, jusqu'\u00e0 atteindre 80 % ou 90 %. En g\u00e9n\u00e9ral, il s'agit de 10 \u00e0 20 groupes. Et nous faisons des fichiers pour pgbench. L\u00e0, nous utilisons random. Parfois, h\u00e9las, cela ne fonctionne pas. Et dans Postgres 12, il y aura plus d'options pour utiliser cette approche. <\/p>\n<p><\/p>\n<p>Et ensuite, nous atteignons ainsi 80 \u00e0 90 % du total_time. Que faut-il mettre apr\u00e8s \u00ab@\u00bb ? Nous examinons les appels, nous regardons combien de pourcentages et nous comprenons que nous devons ici avoir tant de pourcentages. \u00c0 partir de ces pourcentages, nous pouvons \u00e9valuer comment \u00e9quilibrer chacun des fichiers. Apr\u00e8s cela, nous utilisons pgbench et nous commen\u00e7ons \u00e0 travailler. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nous avons aussi K001 et K002. <\/p>\n<p><\/p>\n<p>K001 - c'est une grande cha\u00eene avec quatre sous-cha\u00eenes. C'est la caract\u00e9ristique de toute notre charge. Regardez la deuxi\u00e8me colonne et la deuxi\u00e8me sous-cha\u00eene. Nous voyons qu'il faut environ une seconde et demie par seconde, c\u2019est-\u00e0-dire que si nous avons deux c\u0153urs, cela ira bien. Cela correspond \u00e0 environ 75 % d'utilisation. Et cela fonctionnera ainsi. Si nous avons 10 c\u0153urs, nous serons compl\u00e8tement tranquilles. Ainsi, nous pouvons \u00e9valuer les ressources.<\/p>\n<p><\/p>\n<p>K002 - c'est ce que j'appelle des classes de requ\u00eates, c\u2019est-\u00e0-dire SELECT, INSERT, UPDATE, DELETE. Et s\u00e9par\u00e9ment SELECT FOR UPDATE, parce qu'il verrouille. <\/p>\n<p><\/p>\n<p>Ici, nous pouvons conclure que les SELECT ordinaires, donc de lecture \u2013 repr\u00e9sentent 82 % de tous les appels, mais en m\u00eame temps \u2013 74 % du total_time. C\u2019est-\u00e0-dire qu'ils sont appel\u00e9s beaucoup, mais consomment moins de ressources. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Revenons \u00e0 la question : \u00ab Comment choisir correctement shared_buffers ? \u00bb. J'observe que la plupart des benchmarks sont construits sur l'id\u00e9e - regardons quelle sera la capacit\u00e9 de traitement, c\u2019est-\u00e0-dire quelle sera le taux de transfert. Il est g\u00e9n\u00e9ralement mesur\u00e9 en TPS ou QPS.<\/p>\n<p><\/p>\n<p>Et nous essayons d'extraire de la machine le plus grand nombre possible de transactions par seconde \u00e0 l'aide des param\u00e8tres d'optimisation. Ici, c'est justement 311 par seconde pour les select.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais personne ne va au travail et revient chez soi en voiture \u00e0 pleine vitesse. C\u2019est stupide. C'est pareil avec les bases de donn\u00e9es. Nous ne devrions pas rouler \u00e0 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. <\/p>\n<p><\/p>\n<p>L'id\u00e9e est que nous roulons g\u00e9n\u00e9ralement \u00e0 environ 20 % de notre capacit\u00e9, de pr\u00e9f\u00e9rence pas plus de 50 %. Et nous nous effor\u00e7ons d'optimiser le temps de r\u00e9ponse pour nos utilisateurs avant tout. C\u2019est-\u00e0-dire que nous devons ajuster nos manettes pour qu'il y ait une latence minimale \u00e0 20 % de vitesse, de mani\u00e8re conditionnelle. C'est une id\u00e9e que nous essayons \u00e9galement d'utiliser dans nos exp\u00e9riences.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Et pour conclure avec les recommandations : <\/p>\n<p><\/p>\n<ul>\n<li>Assurez-vous de cr\u00e9er un Database Lab.<\/li>\n<li>Si possible, faites-le \u00e0 la demande, pour qu'il se d\u00e9ploie pendant un certain temps - jouez avec et laissez tomber. Si vous avez des clouds, c'est \u00e9vident, c\u2019est-\u00e0-dire qu'il faut avoir beaucoup de standing. <\/li>\n<li>Soyez curieux. Et si quelque chose ne va pas, faites des exp\u00e9riences pour voir comment cela fonctionne. Nancy peut \u00eatre utilis\u00e9e pour s'instruire et tester comment la base fonctionne.<\/li>\n<li>Visez le temps de r\u00e9ponse le plus court possible. <\/li>\n<li>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\u00e9. <\/li>\n<li>Et v\u00e9rifiez r\u00e9guli\u00e8rement la sant\u00e9 de la base, au moins une fois tous les trois mois manuellement ou avec Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questions<\/p>\n<p><\/p>\n<p><em>Merci beaucoup ! C'est quelque chose de tr\u00e8s int\u00e9ressant.<\/em> <\/p>\n<p><\/p>\n<p>Deux choses.<\/p>\n<p><\/p>\n<p><em>Oui, deux choses. Je n'ai pas tout \u00e0 fait compris. Lorsque nous travaillons avec Nancy, pouvons-nous ajuster un seul param\u00e8tre ou un groupe entier ?<\/em><\/p>\n<p><\/p>\n<p>Nous avons un param\u00e8tre de delta-config. Vous pouvez y ajuster autant de choses que vous le souhaitez en m\u00eame temps. Mais il faut comprendre que lorsque vous changez beaucoup de choses, vous pourriez en tirer des conclusions erron\u00e9es. <\/p>\n<p><\/p>\n<p><em>Oui. Pourquoi ai-je demand\u00e9 \u00e7a ? Parce qu'il est difficile de mener des exp\u00e9riences lorsque vous n'avez qu'un seul param\u00e8tre. Vous l'ajustez, regardez comment \u00e7a fonctionne. Vous le d\u00e9finissez. Ensuite, vous commencez avec le suivant.<\/em><\/p>\n<p><\/p>\n<p>Il est possible d'ajuster plusieurs param\u00e8tres en m\u00eame temps, mais \u00e7a d\u00e9pend bien s\u00fbr de la situation. Mais il est pr\u00e9f\u00e9rable de tester une seule id\u00e9e. Hier, nous avons eu une id\u00e9e. Nous avions une situation tr\u00e8s similaire. Il y avait deux configurations. Et nous ne pouvions pas comprendre pourquoi il y avait une si grande diff\u00e9rence. L'id\u00e9e \u00e9tait d'utiliser la dichotomie pour comprendre s\u00e9quentiellement et trouver la diff\u00e9rence. Vous pouvez rendre simultan\u00e9ment la moiti\u00e9 des param\u00e8tres identiques, puis un quart, et ainsi de suite. Tout est flexible.<\/p>\n<p><\/p>\n<p><em>J'ai encore une question. Le projet est jeune, en d\u00e9veloppement. La documentation est-elle d\u00e9j\u00e0 pr\u00eate, y a-t-il une description d\u00e9taill\u00e9e ?<\/em><\/p>\n<p><\/p>\n<p>J'ai mis un lien vers la description des param\u00e8tres l\u00e0-bas. Cela existe. Mais beaucoup de choses ne sont pas encore l\u00e0. Je cherche des personnes partageant les m\u00eames id\u00e9es. Et je les trouve lorsque je m'exprime. C'est vraiment g\u00e9nial. Quelqu'un travaille d\u00e9j\u00e0 avec moi, quelqu'un a aid\u00e9 et a fait quelque chose l\u00e0-bas. Et si ce th\u00e8me vous int\u00e9resse, faites-le moi savoir \u2013 ce qui manque. <\/p>\n<p><\/p>\n<p><em>Une fois que nous aurons \u00e9tabli le laboratoire, peut-\u00eatre qu'il y aura des retours. Nous verrons. Merci !<\/em><\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! J'ai vu qu'il y avait un support pour Amazon. Est-il pr\u00e9vu de prendre en charge GSP ?<\/em><\/p>\n<p><\/p>\n<p>Bonne question. Nous avons commenc\u00e9 \u00e0 travailler dessus. Et nous avons mis cela en attente, car nous voulons \u00e9conomiser. C'est-\u00e0-dire, il y a un support via run on localhost. Vous pouvez cr\u00e9er vous-m\u00eame 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\u00e9r\u00eat, car Google n'a pas d'instances spot \u00e0 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 \u00e0 10 % pour r\u00e9duire la probabilit\u00e9 de se faire \u00e9liminer. C'est-\u00e0-dire, vous \u00e9conomisez sur les spots, mais ils peuvent vous \u00eatre retir\u00e9s \u00e0 tout moment. Si vous fixez un prix un peu plus \u00e9lev\u00e9 que les autres, vous serez tu\u00e9s plus tard. Google a une sp\u00e9cificit\u00e9 compl\u00e8tement diff\u00e9rente. Et il y a une autre limitation tr\u00e8s d\u00e9savantageuse \u2013 elles ne vivent que 24 heures. Et parfois, nous voulons faire tourner l'exp\u00e9rience pendant 5 jours. Mais cela peut se faire sur des spots, parfois ils vivent des mois. <\/p>\n<p><\/p>\n<p><em>Bonjour ! Merci pour la pr\u00e9sentation ! Vous avez mentionn\u00e9 le checkup. Comment calculez-vous les erreurs stat_statements ?<\/em><\/p>\n<p><\/p>\n<p>Tr\u00e8s bonne question. Je peux montrer et expliquer en d\u00e9tail. En r\u00e9sum\u00e9 \u2013 nous regardons comment a fluctu\u00e9 le groupe de requ\u00eates : combien ont \u00e9chou\u00e9 et combien de nouvelles sont apparues. Ensuite, nous examinons deux m\u00e9triques : total_time et calls, donc il y a deux erreurs. Et nous regardons quelle est la contribution des groupes d\u00e9faillants. Il y a deux sous-groupes : celui qui est parti et celui qui est arriv\u00e9. Nous examinons quelle est leur contribution \u00e0 l'ensemble. <\/p>\n<p><\/p>\n<p><em>N'avez-vous pas peur qu'elle soit analys\u00e9e deux ou trois fois entre les snapshots ?<\/em><\/p>\n<p><\/p>\n<p>C'est-\u00e0-dire, se sont-ils r\u00e9enregistr\u00e9s ou comment cela se passe ?<\/p>\n<p><\/p>\n<p><em>Par exemple, cette requ\u00eate a d\u00e9j\u00e0 \u00e9t\u00e9 remplac\u00e9e une fois, puis elle est revenue et a de nouveau \u00e9t\u00e9 remplac\u00e9e, puis elle est revenue encore une fois et a \u00e9t\u00e9 remplac\u00e9e. Et vous avez calcul\u00e9 quelque chose ici, mais o\u00f9 est tout cela ?<\/em><\/p>\n<p><\/p>\n<p>Bonne question, il faut regarder. <\/p>\n<p><\/p>\n<p><em>J'ai fait quelque chose de similaire. Moins compliqu\u00e9, bien s\u00fbr, je l'ai fait seul. Mais j'ai d\u00fb tout r\u00e9initialiser, faire un reset stat_statements et m'orienter au moment du snapshot, en v\u00e9rifiant qu'il y avait moins d'une certaine proportion pour savoir que \u00e7a 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 \u00e9t\u00e9 remplac\u00e9.<\/em> <\/p>\n<p><\/p>\n<p>Oui-oui. <\/p>\n<p><\/p>\n<p><em>Mais je ne comprends pas comment faire autrement de mani\u00e8re fiable.<\/em><\/p>\n<p><\/p>\n<p>Malheureusement, je ne me souviens pas exactement \u2013 si nous utilisons l\u00e0-bas le texte de la requ\u00eate ou le queryid avec pg_stat_statements en nous basant l\u00e0-dessus. Si nous nous basons sur le queryid, alors th\u00e9oriquement, nous comparons des \u00e9l\u00e9ments comparables. <\/p>\n<p><\/p>\n<p><em>Non, il peut \u00eatre \u00e9vinc\u00e9 plusieurs fois entre les instantan\u00e9s et revenir \u00e0 nouveau.<\/em><\/p>\n<p><\/p>\n<p>Avec ce m\u00eame ID ?<\/p>\n<p><\/p>\n<p><em>Oui.<\/em> <\/p>\n<p><\/p>\n<p>Nous allons \u00e9tudier cela. Bonne question. Il faut examiner. Mais pour l\u2019instant, ce que nous voyons, c'est que nous avons soit 0 \u00e9crit...<\/p>\n<p><\/p>\n<p><em>C'est bien s\u00fbr un cas rare, mais j'ai \u00e9t\u00e9 choqu\u00e9 d'apprendre que stat_statements pourrait \u00eatre \u00e9vinc\u00e9.<\/em> <\/p>\n<p><\/p>\n<p>Il peut y avoir beaucoup de choses dans Pg_stat_statements. Nous avons constat\u00e9 que si track_utility = on, alors vos ensembles sont \u00e9galement suivis. <\/p>\n<p><\/p>\n<p><em>Oui, bien s\u00fbr.<\/em><\/p>\n<p><\/p>\n<p>Et si vous avez Java Hibernate qui est al\u00e9atoire, alors la table de hachage commence \u00e0 se bloquer. Et d\u00e8s que vous d\u00e9sactivez une application tr\u00e8s charg\u00e9e, vous avez environ 50 \u00e0 100 groupes. Et tout devient plus ou moins stable. Un des moyens de lutter contre cela est d'augmenter pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>Oui, mais il faut savoir de combien. Et il faut le surveiller. C'est ce que je fais. C'est-\u00e0-dire que j'ai pg_stat_statements.max. Et je v\u00e9rifie que je n'ai pas atteint 70 % au moment de l'instantan\u00e9. Bien, cela signifie que nous n'avons rien perdu. Nous faisons un reset. Et nous accumulons \u00e0 nouveau. Si lors du prochain instantan\u00e9, c'est moins de 70, cela signifie probablement que nous n'avons de nouveau rien perdu.<\/em><\/p>\n<p><\/p>\n<p>Oui. Par d\u00e9faut, c'est maintenant 5 000. Et beaucoup de gens s'en contentent. <\/p>\n<p><\/p>\n<p><em>En g\u00e9n\u00e9ral, oui.<\/em> <\/p>\n<p><\/p>\n<p>Vid\u00e9o :<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"yvO1jjG-tDI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/yvO1jjG-tDI\/hqdefault.jpg\" alt=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>P.S. J'ajoute que si Postgres contient des donn\u00e9es confidentielles qui ne doivent pas se retrouver dans l'environnement de test, il est possible d'utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">Anonymiseur PostgreSQL<\/a><\/noindex>. Le sch\u00e9ma est \u00e0 peu pr\u00e8s le suivant :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es.&quot; Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/498060\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e? \u0418\u043b\u0438 \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437? \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u044d\u0442\u0430 \u2013 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u2013 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 postgresql.conf &quot;\u043f\u043e-\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u043c\u0443&quot;. \u041d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u043f\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":78743,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-78742","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-21T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-21T17:42:46+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es\u00bb. Nikolai Samokhvalov | ProHoster","description":"Je vous propose de consulter le d\u00e9cryptage de la pr\u00e9sentation de Nikolai Samokhvalov \"Approche industrielle pour le r\u00e9glage de PostgreSQL : exp\u00e9riences sur des bases de donn\u00e9es\" Shared_buffers = 25 % \u2013 est-ce beaucoup ou peu ?","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u041d\u0438\u043a\u043e\u043b\u0430\u044f \u0421\u0430\u043c\u043e\u0445\u0432\u0430\u043b\u043e\u0432\u0430 &quot;\u041f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0442\u044e\u043d\u0438\u043d\u0433\u0443 PostgreSQL: \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u0434 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445&quot; Shared_buffers = 25% \u2013 \u044d\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u043b\u043e?","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-21T17:42:46+00:00","article:modified_time":"2020-04-21T17:42:46+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"78742","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:51:38","updated":"2022-09-28 02:51:26","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}