{"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\/de\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken.\" Nikolai Samokhalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ich lade Sie ein, die Zusammenfassung des Berichts von Nikolai Samokhvalov \"Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken\" zu lesen.<\/strong><\/p>\n<p><\/p>\n<p>Shared_buffers = 25 % \u2013 ist das viel oder wenig? Oder genau richtig? Wie erkennt man, ob diese \u2013 ziemlich veraltete \u2013 Empfehlung f\u00fcr Ihren speziellen Fall geeignet ist?<\/p>\n<p><\/p>\n<p>Es ist an der Zeit, die Auswahl der Parameter in postgresql.conf \"erwachsen\" anzugehen. Nicht mit blinden \"Autotunern\" oder veralteten Ratschl\u00e4gen aus Artikeln und Blogs, sondern basierend auf:<\/p>\n<p><\/p>\n<ol>\n<li>strengen, automatisierten Experimenten mit Datenbanken, die in gro\u00dfen Mengen und unter Bedingungen durchgef\u00fchrt werden, die den \"Kampfbedingungen\" m\u00f6glichst nahekommen,<\/li>\n<li>einem tiefen Verst\u00e4ndnis der Besonderheiten von DBMS und Betriebssystemen.<\/li>\n<\/ol>\n<p><\/p>\n<p>Mit Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), werden wir ein konkretes Beispiel \u2013 die ber\u00fcchtigten shared_buffers \u2013 in verschiedenen Situationen und Projekten betrachten und versuchen herauszufinden, wie man die optimale Einstellung f\u00fcr unsere Infrastruktur, Datenbank und Last findet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Es wird um Experimente mit Datenbanken gehen. Diese Geschichte dauert etwas mehr als ein halbes Jahr. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein wenig \u00fcber mich. Ich habe \u00fcber 14 Jahre Erfahrung mit Postgres. Ich habe mehrere sozialnetzwerkorientierte Unternehmen gegr\u00fcndet. \u00dcberall wurde Postgres eingesetzt und wird weiterhin verwendet.<\/p>\n<p><\/p>\n<p>Au\u00dferdem die Gruppe RuPostgres auf Meetup, Platz 2 weltweit. Wir n\u00e4hern uns langsam 2.000 Mitgliedern. RuPostgres.org.<\/p>\n<p><\/p>\n<p>Und auf verschiedenen Konferenzen, einschlie\u00dflich Highload, bin ich seit der Gr\u00fcndung f\u00fcr die Datenbanken, insbesondere Postgres, verantwortlich.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In den letzten Jahren habe ich meine Praxis im Postgres-Consulting in 11 Zeitzonen von hier aus neu gestartet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Als ich das vor einigen Jahren tat, hatte ich eine gewisse Pause bei der aktiven manuellen Arbeit mit Postgres, wahrscheinlich seit 2010. Ich war \u00fcberrascht, wie wenig sich der Arbeitsalltag von DBAs ver\u00e4ndert hatte und wie viel man immer noch manuelle Arbeit einsetzen musste. Und ich dachte sofort, dass hier etwas nicht stimmt, es muss mehr automatisiert werden.<\/p>\n<p><\/p>\n<p>Da dies alles remote stattfand, waren die meisten Kunden in der Cloud. Und vieles war bereits offensichtlich automatisiert. Dar\u00fcber sp\u00e4ter mehr. Das hei\u00dft, es kam zur Idee, dass es eine Reihe von Werkzeugen geben sollte, also eine Art Plattform, die nahezu alle DBA-Aktivit\u00e4ten automatisiert, um eine gro\u00dfe Anzahl von Datenbanken verwalten zu k\u00f6nnen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In diesem Bericht wird es nicht geben:<\/p>\n<p><\/p>\n<ul>\n<li>\u201eSilberne Kugeln\u201c und Aussagen wie \u2013 setzen Sie 8 GB oder 25 % shared_buffers ein und alles wird gut. Es wird nicht so viel \u00fcber shared_buffers gesprochen. <\/li>\n<li>Hardcore \u201eInnereien\u201c. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was wird passieren?<\/p>\n<p><\/p>\n<ul>\n<li>Es wird Optimierungsprinzipien geben, die wir anwenden und weiterentwickeln. Es werden verschiedene Ideen entstehen, die uns auf unserem Weg kommen, sowie verschiedene Werkzeuge, die wir gr\u00f6\u00dftenteils in Open Source erstellen, d.h. das Grundger\u00fcst erstellen wir in Open Source. Dar\u00fcber hinaus haben wir Tickets, die gesamte Kommunikation findet praktisch in Open Source statt. Sie k\u00f6nnen sehen, was wir gerade tun, was im n\u00e4chsten Release kommen wird, usw. <\/li>\n<li>Es wird auch einige Erfahrungen mit der Anwendung dieser Prinzipien und Werkzeuge in mehreren Unternehmen geben: von kleinen Startups bis hin zu gro\u00dfen Firmen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie entwickelt sich das alles?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zun\u00e4chst einmal ist die Hauptaufgabe eines DBAs neben der Sicherstellung der Erstellung von Instanzen, der Bereitstellung von Backups usw. die Identifizierung von Engp\u00e4ssen und die Optimierung der Leistung.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aktuell erfolgt das folgenderma\u00dfen. Wir schauen uns das Monitoring an, sehen etwas und es fehlen uns einige Details. Wir fangen an, genauer nachzuforschen, normalerweise h\u00e4ndisch, und verstehen, was wir damit machen k\u00f6nnen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Es gibt zwei Ans\u00e4tze. Pg_stat_statements \u2013 eine standardm\u00e4\u00dfige L\u00f6sung zur Identifizierung langsamer Abfragen. Und die Analyse der Postgres-Logs mit Hilfe von pgBadger.<\/p>\n<p><\/p>\n<p>Jeder der Ans\u00e4tze hat erhebliche Nachteile. Im ersten Ansatz werden alle Parameter ignoriert. Wenn wir Gruppen von SELECT * FROM table where column gleich \u201e?\u201c oder \u201e$\u201c ab Version Postgres 10 sehen, wissen wir nicht, ob es sich um einen Index-Scan oder einen Seq-Scan handelt. Es h\u00e4ngt sehr vom Parameter ab. Wenn man einen seltenen Wert einf\u00fcgt, wird es ein Index-Scan. Wenn man einen Wert einf\u00fcgt, der 90 % der Tabelle ausmacht, wird es offensichtlich ein Seq-Scan, da Postgres die Statistiken kennt. Und das ist ein gro\u00dfes Manko von pg_stat_statements, obwohl hier an einigen Verbesserungen gearbeitet wird.<\/p>\n<p><\/p>\n<p>Die gr\u00f6\u00dfte Schw\u00e4che bei der Log-Analyse ist, dass man sich in der Regel \u201elog_min_duration_statement = 0\u201c nicht leisten kann. Dar\u00fcber werden wir ebenfalls sprechen. Folglich sieht man nicht das ganze Bild. Eine sehr schnelle Abfrage kann enorm viele Ressourcen verbrauchen, aber man wird sie nicht sehen, weil sie unterhalb des Schwellenwerts liegt.<\/p>\n<p><\/p>\n<p><strong>Wie l\u00f6sen DBAs die gefundenen Probleme?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zum Beispiel haben wir ein Problem gefunden. Was wird normalerweise getan? Wenn Sie Entwickler sind, werden Sie etwas auf einem bestimmten Instance tun, der nicht so gro\u00df ist. Wenn Sie DBA sind, haben Sie eine Staging-Umgebung. Und es kann nur eine sein. Und diese ist seit einem halben Jahr veraltet. Und Sie denken, dass Sie in die Produktion gehen werden. Und sogar erfahrene DBAs \u00fcberpr\u00fcfen sp\u00e4ter in der Produktion, auf der Replik. Manchmal erstellen sie einen tempor\u00e4ren Index, stellen sicher, dass er hilft, l\u00f6schen ihn und geben ihn an die Entwickler zur\u00fcck, damit sie ihn in die Migrationsdateien einf\u00fcgen. So ein Unsinn passiert gerade. Und das ist ein Problem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Konfigurationen optimieren.<\/li>\n<li>Den Index-Satz optimieren. <\/li>\n<li>Den SQL-Befehl selbst \u00e4ndern (das ist der komplizierteste Weg).<\/li>\n<li>Kapazit\u00e4ten hinzuf\u00fcgen (der einfachste Weg in den meisten F\u00e4llen).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mit diesen Dingen gibt es sehr viel. Es gibt viele M\u00f6glichkeiten in Postgres. Man muss viel wissen. Viele Indizes in Postgres, auch dank der Organisatoren dieser Konferenz. Und all das muss man wissen, und genau das l\u00e4sst bei Nicht-DBAs den Eindruck entstehen, dass DBAs mit schwarzer Magie arbeiten. Das hei\u00dft, man muss etwa 10 Jahre damit verbringen, um alles richtig zu verstehen.<\/p>\n<p><\/p>\n<p>Und ich bin der K\u00e4mpfer gegen diese schwarze Magie. Ich m\u00f6chte alles so gestalten, dass es Technologie gibt und keine Intuition dabei.<\/p>\n<p><\/p>\n<p><strong>Beispiele aus dem Leben<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Das habe ich mindestens in zwei Projekten beobachtet, einschlie\u00dflich meinem eigenen. Ein weiterer Blog-Beitrag informiert uns, dass der Wert von 1.000 f\u00fcr default_statistic_target gut ist. Gut, lassen Sie es uns in der Produktion versuchen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und hier k\u00f6nnen wir, zwei Jahre sp\u00e4ter mit unserem Tool und through experimentation with the databases that we are talking about today, vergleichen, was war und was geworden ist. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und daf\u00fcr m\u00fcssen wir ein Experiment erstellen. Es besteht aus vier Teilen. <\/p>\n<p><\/p>\n<ul>\n<li>Der erste Teil ist die Umgebung. Wir ben\u00f6tigen Hardware. Und wenn ich in ein Unternehmen komme und einen Vertrag abschlie\u00dfe, sage ich, dass ich die gleiche Hardware wie in der Produktion haben m\u00f6chte. F\u00fcr jeden Ihrer Master brauche ich mindestens eine Hardware, die dieselbe ist. Entweder ist es eine virtuelle Maschine in Amazon oder Google oder ich brauche genau die gleiche Hardware. Das hei\u00dft, ich m\u00f6chte die Umgebung nachbilden. Und unter Umfeld verstehen wir die Hauptversion von Postgres. <\/li>\n<li>Der zweite Teil ist das Objekt unserer Forschung. Das ist die Datenbank. Sie kann auf verschiedene Arten erstellt werden. Ich werde Ihnen zeigen, wie. <\/li>\n<li>Der dritte Teil ist die Last. Das ist der komplizierteste Moment. <\/li>\n<li>Und der vierte Teil ist das, was wir \u00fcberpr\u00fcfen, d. h. womit wir vergleichen werden. Angenommen, wir k\u00f6nnen in der Konfiguration einen oder mehrere Parameter \u00e4ndern oder wir k\u00f6nnen einen Index erstellen usw. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir starten das Experiment. Hier ist pg_stat_statements. Links \u2013 was war. Rechts \u2013 was geworden ist.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Links steht default_statistics_target = 100, rechts = 1 000. Wir sehen, dass uns das geholfen hat. Insgesamt hat es um 8 % verbessert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn wir jedoch nach unten scrollen, sehen wir Gruppen von Anfragen aus pgBadger oder pg_stat_statements. Hier gibt es zwei M\u00f6glichkeiten. Wir werden sehen, dass eine bestimmte Anfrage um 88 % gefallen ist. Und hier ist der technische Ansatz. Wir k\u00f6nnen weiter in die Tiefe gehen, weil es interessant ist, warum sie gefallen ist. Man muss verstehen, was in den Statistiken war. Warum f\u00fchren mehr Buckets in der Statistik zu einem schlechteren Ergebnis.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oder wir m\u00fcssen nicht weiter forschen, sondern k\u00f6nnen \u201eALTER TABLE \u2026 ALTER COLUMN\u201c durchf\u00fchren und die 100 Buckets zur\u00fcck in die Statistik dieser Spalte geben. Und dann k\u00f6nnen wir durch ein weiteres Experiment \u00fcberpr\u00fcfen, dass dieser Patch geholfen hat. Das ist es. Das ist der technische Ansatz, der uns hilft, das Ganze zu sehen und Entscheidungen auf Basis von Daten und nicht auf Basis von Intuition zu treffen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ein paar Beispiele aus anderen Bereichen. In den Tests gibt es seit vielen Jahren CI-Tests. Und kein Projekt in gesundem Verstand w\u00fcrde ohne automatisierte Tests leben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In anderen Branchen: in der Luftfahrt, im Automobilbau, wenn wir die Aerodynamik testen, haben wir ebenfalls die M\u00f6glichkeit, Experimente durchzuf\u00fchren. Wir werden nicht sofort etwas nach einem Plan ins All schicken oder ein Auto sofort auf die Stra\u00dfe bringen. Zum Beispiel gibt es einen Windkanal. <\/p>\n<p><\/p>\n<p>Aus Beobachtungen in anderen Branchen k\u00f6nnen wir Schlussfolgerungen ziehen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Erstens haben wir eine spezielle Umgebung. Sie ist nah am Produktionsbetrieb, aber nicht zu nah. Ihr Hauptmerkmal ist, dass sie kosteng\u00fcnstig, reproduzierbar und maximal automatisiert sein sollte. Zudem sollten spezielle Mittel f\u00fcr die Durchf\u00fchrung einer detaillierten Analyse vorhanden sein.<\/p>\n<p><\/p>\n<p>Wahrscheinlich haben wir, als wir das Flugzeug gestartet und geflogen sind, weniger M\u00f6glichkeiten, jeden Millimeter der Tragfl\u00e4chenoberfl\u00e4che zu untersuchen, als in einem Windkanal. Wir haben mehr Mittel zur Diagnose. Wir k\u00f6nnen es uns erlauben, mehr von allem schweren anzuh\u00e4ngen, was wir uns im Flugzeug nicht erlauben k\u00f6nnen. Das gilt auch f\u00fcr Postgres. In einigen F\u00e4llen k\u00f6nnen wir das vollst\u00e4ndige Logging der Anfragen w\u00e4hrend der Experimente aktivieren. Und das wollen wir in der Produktion nicht tun. Vielleicht schalten wir es in Zukunft mit auto_explain ein.<\/p>\n<p><\/p>\n<p>Wie ich bereits gesagt habe, bedeutet ein hohes Ma\u00df an Automatisierung, dass wir auf eine Taste gedr\u00fcckt haben und es wiederholt haben. So sollte es laufen, damit es viele Experimente gibt, damit es im Fluss ist.<\/p>\n<p><\/p>\n<p>Nancy CLI \u2013 das Fundament des \u201eDatenbanklabors\u201c<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und so haben wir so etwas gemacht. Das hei\u00dft, ich habe im Juni, also vor fast einem Jahr, von diesen Ideen gesprochen. Und wir haben bereits in Open Source die sogenannte Nancy CLI. Dies ist die Grundlage, um ein Datenbanklabor aufzubauen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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> \u2014 Es ist Open Source auf Gitlab. Sie k\u00f6nnen darauf zugreifen, Sie k\u00f6nnen es ausprobieren. Ich habe in den Folien einen Link hinzugef\u00fcgt. Auf den kann man klicken und dort ist es <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> f\u00fcr alle Parameter.<\/p>\n<p><\/p>\n<p>Nat\u00fcrlich ist dort vieles noch in der Entwicklung. Es gibt viele Ideen. Aber das ist bereits das, was wir praktisch t\u00e4glich anwenden. Wenn wir die Idee haben \u2013 was passiert, wenn wir 40.000.000 Zeilen l\u00f6schen und alles auf IO st\u00f6\u00dft, dann k\u00f6nnen wir ein Experiment durchf\u00fchren und genauer hinsehen, um zu verstehen, was passiert, und versuchen, das unterwegs zu beheben. Das hei\u00dft, wir f\u00fchren ein Experiment durch. Zum Beispiel \u00e4ndern wir etwas und schauen, was am Ende herauskommt. Und wir machen das nicht in der Produktion. Das ist der Kern der Idee.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wo kann das funktionieren? Das kann lokal funktionieren, das hei\u00dft, man kann das \u00fcberall machen, man kann es sogar auf einem MacBook starten. Man braucht Docker, legen wir los. Und das war's. Man kann es auf irgendeinem Server-Instance oder in einer VM, wo auch immer, starten.<\/p>\n<p><\/p>\n<p>Es gibt auch die M\u00f6glichkeit, remote in Amazon EC2-Instanzen in Spot-Preisen zu starten. Das ist eine sehr coole M\u00f6glichkeit. Zum Beispiel haben wir gestern \u00fcber 500 Experimente auf einer i3-Instanz durchgef\u00fchrt, beginnend mit der kleinsten und endend mit i3-16-xlarge. Und 500 Experimente haben uns 64 Dollar gekostet. Jedes dauerte 15 Minuten. Das hei\u00dft, durch die Nutzung von Spots ist das sehr g\u00fcnstig \u2013 ein Rabatt von 70 %, abgerechnet nach Sekunden von Amazon. Man kann also sehr viel machen. Man kann echte Forschung durchf\u00fchren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und drei Hauptversionen von Postgres werden unterst\u00fctzt. Es ist nicht so schwierig, einige alte Versionen und die neue 12. Version anzupassen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen das Objekt auf drei Arten definieren. Das sind:<\/p>\n<p><\/p>\n<ul>\n<li>Dump\/sql-Datei. <\/li>\n<li>Der Hauptweg ist, das PGDATA-Verzeichnis zu klonen. Normalerweise wird es von einem Backup-Server genommen. Wenn Sie vern\u00fcnftige bin\u00e4re Backups haben, k\u00f6nnen Sie von dort Klone erstellen. Wenn Sie eine Cloud haben, wird das f\u00fcr Sie von einem Cloud-Anbieter wie Amazon oder Google erledigt. Das ist der wichtigste Weg f\u00fcr Klone aus einer echten Produktionsumgebung. So setzen wir es genau um. <\/li>\n<li>Und die letzte Methode eignet sich f\u00fcr Forschungszwecke, wenn man herausfinden m\u00f6chte, wie eine bestimmte Funktion in Postgres funktioniert. Das ist pgbench. Sie k\u00f6nnen mit pgbench generieren. Das ist einfach eine Option \"db-pgbench\". Sie sagen ihm, welchen Scale. Und alles wird in der Cloud generiert, wie gesagt.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und die Last:<\/p>\n<p><\/p>\n<ul>\n<li>Die Last k\u00f6nnen wir in einem einzelnen SQL-Thread ausf\u00fchren. Das ist die einfachste Methode. <\/li>\n<li>Oder wir k\u00f6nnen die Last emulieren. Und wir k\u00f6nnen die Last in erster Linie folgenderma\u00dfen emulieren. Wir m\u00fcssen alle Logs sammeln. Und das ist schmerzhaft. Ich werde zeigen, warum. Und wir spielen es mit pgreplay ab, das in Nancy integriert ist. <\/li>\n<li>Oder eine andere Variante. Die sogenannte Craft-Last, die wir mit etwas M\u00fche erzeugen. Indem wir unsere aktuelle Last auf dem Live-System analysieren, ziehen wir die wichtigsten Gruppen von Anfragen heraus. Und mit pgbench k\u00f6nnen wir diese Last im Labor emulieren. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Oder wir m\u00fcssen irgendein SQL ausf\u00fchren, d. h. wir \u00fcberpr\u00fcfen eine Migration, erstellen einen Index, f\u00fchren ANALYZE durch. Und wir schauen uns an, was vor dem Vacuum und nach dem Vacuum war. Im Allgemeinen ist es jedes SQL.<\/li>\n<li>Entweder \u00e4ndern wir in der Konfiguration einen oder mehrere Parameter. Wir k\u00f6nnen sagen, dass wir zum Beispiel 100 Werte auf Amazon f\u00fcr unsere Terabyte-Datenbank pr\u00fcfen lassen m\u00f6chten. Und nach ein paar Stunden haben Sie das Ergebnis. In der Regel wird sich die Terabyte-Datenbank mehrere Stunden entwickeln. Aber in der Entwicklung gibt es einen Patch, wir k\u00f6nnen eine Serie nutzen, d.h. Sie k\u00f6nnen auf demselben Server die gleiche pgdata nacheinander verwenden und pr\u00fcfen. Postgres wird neu gestartet, Caches werden zur\u00fcckgesetzt. Und Sie k\u00f6nnen die Last testen. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Es kommt ein Verzeichnis an, in dem sich eine Menge verschiedener Dateien befinden, angefangen von Snapshots von pg<em>stat<\/em>***. Und das Interessanteste sind pg_stat_statements, pg_stat_kcacke. Dies sind zwei Erweiterungen, die Anfragen analysieren. Und pg_stat_bgwriter enth\u00e4lt nicht nur statistische Informationen \u00fcber den pgwriter, sondern auch \u00fcber Checkpoint und dar\u00fcber, wie die Backends schmutzige Puffer verdr\u00e4ngen. Das ist alles interessant zu betrachten. Zum Beispiel ist es sehr interessant zu sehen, wie viel dort verdr\u00e4ngt wurde, wenn wir shared_buffers konfigurieren.<\/li>\n<li>Au\u00dferdem kommen die Protokolle von Postgres. Zwei Protokolle \u2013 das Vorbereitungsprotokoll und das Protokoll zur Ausf\u00fchrung der Last. <\/li>\n<li>Eine relativ neue Funktion sind die FlameGraphs.<\/li>\n<li>Wenn Sie pgreplay oder pgbench-Varianten zur Lastwiederholung verwendet haben, wird deren nativer Output bereitgestellt. Und Sie werden Latenz und TPS sehen k\u00f6nnen. Man kann verstehen, wie sie das gesehen haben. <\/li>\n<li>Informationen \u00fcber das System. <\/li>\n<li>Grundlegende \u00dcberpr\u00fcfungen von CPU und IO. Das ist mehr f\u00fcr EC2-Instanzen in Amazon, wenn Sie 100 identische Instanzen in einem Stream starten und dort jeweils 100 unterschiedliche L\u00e4ufe machen m\u00f6chten, haben Sie 10.000 Experimente. Und Sie m\u00fcssen sicherstellen, dass Sie nicht auf eine fehlerhafte Instanz sto\u00dfen, die bereits von jemandem beeintr\u00e4chtigt wird. Auf dieser Hardware werden andere aktiv, und Ihnen bleibt wenig Ressourcen. Solche Ergebnisse sollten besser verworfen werden. Genau mit sysbench von Alexey Kopytov f\u00fchren wir einige kurze \u00dcberpr\u00fcfungen durch, die ankommen und mit anderen verglichen werden k\u00f6nnen, d.h. Sie werden verstehen, wie sich CPU und IO verhalten. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Welche technischen Schwierigkeiten gibt es am Beispiel verschiedener Unternehmen?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Angenommen, wir m\u00f6chten eine echte Last anhand von Protokollen wiederholen. Eine gro\u00dfartige Idee, wenn dies auf Open Source pgreplay geschrieben ist. Wir verwenden es. Aber damit es gut funktioniert, m\u00fcssen Sie das vollst\u00e4ndige Logging der Abfragen mit Parametern und Timing aktivieren.<\/p>\n<p><\/p>\n<p>Es gibt einige Schwierigkeiten bei der Dauer und dem Zeitstempel. Diese ganzen Komplikationen lassen wir beiseite. Die Hauptfrage ist, k\u00f6nnen Sie sich das leisten oder nicht? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Das Problem ist, dass dies m\u00f6glicherweise nicht verf\u00fcgbar ist. Sie m\u00fcssen zun\u00e4chst verstehen, welcher Datenstrom ins Protokoll geschrieben wird. Wenn Sie pg_stat_statements haben, k\u00f6nnen Sie mit dieser Anfrage (der Link wird in den Folien zur Verf\u00fcgung stehen) sch\u00e4tzen, wie viele Bytes pro Sekunde geschrieben werden.<\/p>\n<p><\/p>\n<p>Wir betrachten die L\u00e4nge der Anfrage. Wir ignorieren, dass dort keine Parameter vorhanden sind, aber wir kennen die L\u00e4nge der Anfrage und wissen, wie oft sie pro Sekunde ausgef\u00fchrt wurde. So k\u00f6nnen wir absch\u00e4tzen, wie viele Bytes pro Sekunde ungef\u00e4hr generiert werden. Wir k\u00f6nnen uns um den Faktor zwei irren, aber die Gr\u00f6\u00dfenordnung werden wir auf diese Weise definitiv verstehen.<\/p>\n<p><\/p>\n<p>Wir k\u00f6nnen sehen, dass diese Anfrage 802 Mal pro Sekunde ausgef\u00fchrt wird. Und wir sehen, dass bytes_per_sec \u2013 300 kB\/s ungef\u00e4hr geschrieben werden. Und im Allgemeinen k\u00f6nnen wir uns einen solchen Datenstrom leisten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber! Das Ding ist, dass es verschiedene Protokollierungssysteme gibt. Und normalerweise haben die Leute standardm\u00e4\u00dfig \u201esyslog\u201c eingestellt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und wenn Sie syslog haben, k\u00f6nnte es so aussehen. Wir nehmen pgbench, aktivieren die Protokollierung der Anfragen und schauen, was passiert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ohne Protokollierung \u2013 das ist die Spalte links. Wir hatten 161.000 TPS. Mit syslog \u2013 das ist in Ubuntu 16.04 in Amazon, und wir erreichen 37.000 TPS. Wenn wir auf zwei andere Protokollierungsarten umschalten, ist die Situation viel besser. Das hei\u00dft, wir haben erwartet, dass es schlechter wird, aber nicht so sehr.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und auf CentOS 7, wo auch journald beteiligt ist, der Logs in ein bin\u00e4res Format f\u00fcr eine bessere Suche umwandelt, ist es ein v\u00f6lliger Albtraum, wir sinken um das 44-fache bei TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und das ist etwas, mit dem die Menschen leben m\u00fcssen. Und oft in Unternehmen, besonders in gro\u00dfen, ist es sehr schwierig zu \u00e4ndern. Wenn Sie von syslog wegkommen k\u00f6nnen, dann tun Sie es bitte.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&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>Bewerten Sie IOPS und den Schreibstrom. <\/li>\n<li>\u00dcberpr\u00fcfen Sie Ihr Protokollierungssystem. <\/li>\n<li>Wenn die vorhergesagte Last \u00fcberm\u00e4\u00dfig hoch ist, ziehen Sie eine Sampling-Option in Betracht. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben pg_stat_statements. Wie gesagt, er muss unbedingt vorhanden sein. Und wir k\u00f6nnen jede Anfragegruppe auf eine spezielle Art und Weise in einer Datei beschreiben. Und dann k\u00f6nnen wir eine sehr n\u00fctzliche Funktion in pgbench nutzen \u2013 die M\u00f6glichkeit, mehrere Dateien mit der Option \u201e-f\u201c einzuf\u00fcgen.<\/p>\n<p><\/p>\n<p>Er versteht viel von \u201e-f\u201c. Und man kann am Ende mit \u201e@\u201c sagen, welcher Anteil f\u00fcr jede Datei gelten soll. Das hei\u00dft, wir k\u00f6nnen sagen, dass dies in 10 % der F\u00e4lle ausgef\u00fchrt werden soll, und dieses in 20 %. Und das wird uns dem n\u00e4her bringen, was wir in der Produktion sehen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie erkennen wir, was wir in der Produktion haben? Welcher Anteil und was genau? Hier gehen wir ein wenig vom Thema ab. Wir haben ein weiteres Produkt. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. Es ist auch eine Basis in Open Source. Und wir entwickeln es jetzt aktiv weiter.<\/p>\n<p><\/p>\n<p>Es entstand aus einem anderen Grund. Aufgrund der unzureichenden \u00dcberwachung. Das hei\u00dft, Sie kommen, schauen auf die Basis, betrachten die Probleme, die vorhanden sind. Und normalerweise f\u00fchren Sie einen health_check durch. Wenn Sie ein erfahrener DBA sind, f\u00fchren Sie einen health_check durch. Sie betrachten die Nutzung der Indizes usw. Wenn Sie OKmeter haben, ist es gro\u00dfartig. Es ist eine tolle \u00dcberwachung f\u00fcr Postgres. OKmeter.io \u2013 bitte installieren Sie es, alles ist dort sehr gut gemacht. Es ist kostenpflichtig.<\/p>\n<p><\/p>\n<p>Wenn Sie es nicht haben, haben Sie normalerweise wenig. In der \u00dcberwachung gibt es normalerweise CPU, IO und das mit Vorbehalten, und das war\u2019s. Aber wir brauchen mehr. Wir m\u00fcssen sehen, wie der Autovacuum funktioniert, wie der Checkpoint funktioniert, im IO m\u00fcssen wir den Checkpoint vom bgwriter und von den Backends trennen usw.<\/p>\n<p><\/p>\n<p>Das Problem ist, wenn Sie einem gro\u00dfen Unternehmen helfen, k\u00f6nnen sie etwas nicht schnell implementieren. Sie k\u00f6nnen OKmeter nicht schnell kaufen. Vielleicht kaufen sie es in sechs Monaten. Sie k\u00f6nnen keine Pakete schnell installieren. <\/p>\n<p><\/p>\n<p>Wir hatten die Idee, dass wir ein spezielles Tool ben\u00f6tigen, das keine Installation erfordert, das hei\u00dft, Sie m\u00fcssen auf der Produktion \u00fcberhaupt nichts installieren. Sie installieren es auf Ihrem Laptop oder auf einem Observationsserver, von wo aus Sie starten werden. Und es wird viele Dinge analysieren: das Betriebssystem, das Dateisystem und Postgres selbst, und dabei einige leichte Abfragen durchf\u00fchren, die Sie direkt in der Produktion ausf\u00fchren k\u00f6nnen, ohne dass etwas ausf\u00e4llt.<\/p>\n<p><\/p>\n<p>Wir haben es Postgres-checkup genannt. Wenn es medizinisch betrachtet wird, ist es eine regelm\u00e4\u00dfige Gesundheitspr\u00fcfung. Im automobilen Bereich entspricht es der Inspektion. Sie machen alle sechs Monate oder j\u00e4hrlich eine Inspektion, je nach Marke. Machen Sie auch eine Inspektion f\u00fcr Ihre Datenbank? Das hei\u00dft, f\u00fchren Sie regelm\u00e4\u00dfig eine tiefgehende Untersuchung durch? Das sollte man machen. Wenn Sie Backups machen, dann machen Sie auch das Checkup, das ist nicht weniger wichtig.<\/p>\n<p><\/p>\n<p>Und wir haben ein solches Tool. Es begann vor etwa drei Monaten aktiv zu entstehen. Es ist noch jung, aber es gibt schon viele Funktionen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir sammeln die \u201eeinflussreichsten\u201c Abfragegruppen \u2013 Bericht K003 in Postgres-checkup<\/p>\n<p><\/p>\n<p>Und dort gibt es eine Gruppe von Berichten K. Bis jetzt gibt es drei Berichte. Und es gibt diesen Bericht K003. Dort ist die Spitze von pg_stat_statements, sortiert nach total_time.<\/p>\n<p><\/p>\n<p>Wenn wir die Abfragegruppen nach total_time sortieren, sehen wir an der Spitze eine Gruppe, die unser System am meisten belastet, d. h. die am meisten Ressourcen verbraucht. Warum nenne ich sie Abfragegruppen? Weil wir die Parameter weggelassen haben. Das sind keine Abfragen mehr, sondern Gruppen von Abfragen, d. h. sie sind abstrahiert.<\/p>\n<p><\/p>\n<p>Und wenn wir von oben nach unten optimieren, werden wir unsere Ressourcen entlasten und den Moment aufschieben, an dem ein Upgrade notwendig wird. Das ist eine sehr gute M\u00f6glichkeit, Geld zu sparen.<\/p>\n<p><\/p>\n<p>Vielleicht ist es nicht die beste Methode, um sich um die Nutzer zu k\u00fcmmern, da wir m\u00f6glicherweise seltene, aber sehr \u00e4rgerliche F\u00e4lle \u00fcbersehen, in denen jemand 15 Sekunden gewartet hat. Insgesamt sind die so selten, dass wir sie nicht sehen, aber wir k\u00fcmmern uns um die Ressourcen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Was ist in dieser Tabelle passiert? Wir haben zwei Snapshots gemacht. Postgres_checkup zeigt Ihnen die Delta-Werte f\u00fcr jede Metrik: total-time, calls, rows, shared_blks_read usw. Alles, Delta wurde berechnet. Ein gro\u00dfes Problem bei pg_stat_statements ist, dass es sich nicht erinnert, wann es zur\u00fcckgesetzt wurde. W\u00e4hrend pg_stat_database sich erinnert, tut pg_stat_statements dies nicht. Sie sehen dort die Zahl 1.000.000, aber wir wissen nicht, woher wir gez\u00e4hlt haben.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hier wissen wir, dass wir zwei Snapshots haben. Wir wissen, dass das Delta in diesem Fall 56 Sekunden betrug. Ein sehr kurzer Zeitraum. Nach total_time sortiert. Und dann k\u00f6nnen wir differenzieren, das hei\u00dft, wir teilen alle Metriken durch die Dauer. Wenn wir jede Metrik durch die Dauer teilen, haben wir die Anzahl der Aufrufe pro Sekunde.<\/p>\n<p><\/p>\n<p>Weiter geht\u2019s mit total_time pro Sekunde \u2013 das ist meine Lieblingsmetrik. Sie wird in Sekunden gemessen, pro Sekunde, d. h. wie viele Sekunden unser System ben\u00f6tigt hat, um diese Gruppe von Abfragen pro Sekunde auszuf\u00fchren. Wenn Sie dort mehr als eine Sekunde pro Sekunde sehen, bedeutet das, dass mehr als einen Kern h\u00e4tten bereitgestellt werden m\u00fcssen. Das ist eine sehr gute Metrik. Sie k\u00f6nnen verstehen, dass dieser Kollege zum Beispiel mindestens drei Kerne ben\u00f6tigt.<\/p>\n<p><\/p>\n<p>Das ist unser Know-how, so etwas habe ich nirgendwo gesehen. Beachten Sie \u2013 das ist eine sehr einfache Sache \u2013 Sekunde f\u00fcr Sekunde. Manchmal, wenn Ihre CPU 100 % erreicht, sind das eine halbe Stunde pro Sekunde, d. h. Sie haben eine halbe Stunde nur mit diesen Abfragen verbracht. <\/p>\n<p><\/p>\n<p>Weiter sehen wir die Zeilen pro Sekunde. Wir wissen, wie viele Zeilen pro Sekunde zur\u00fcckgegeben wurden.<\/p>\n<p><\/p>\n<p>Und auch das ist interessant. Wie viele shared_buffers wir pro Sekunde aus den shared_buffers gelesen haben. Hits waren bereits dort, und die Reihen haben wir aus dem Cache des Betriebssystems oder von der Festplatte genommen. Die erste Option ist schnell, die zweite k\u00f6nnte schnell sein, muss es aber nicht, das h\u00e4ngt von der Situation ab. <\/p>\n<p><\/p>\n<p>Die zweite Differenzierungsmethode \u2013 wir teilen die Anzahl der Anfragen in dieser Gruppe. In der zweiten Spalte haben Sie immer eine Anfrage geteilt durch die Anfrage. Und dann wird es interessant \u2013 wie viele Millisekunden in dieser Anfrage waren. Wir wissen, wie sich diese Anfrage im Durchschnitt verh\u00e4lt. 101 Millisekunden ben\u00f6tigten wir f\u00fcr jede Anfrage. Das ist eine traditionelle Metrik, die wir f\u00fcr unser Verst\u00e4ndnis ben\u00f6tigen.<\/p>\n<p><\/p>\n<p>Wie viele Zeilen jede Anfrage im Durchschnitt zur\u00fcckgab. Wir sehen, dass diese Gruppe 8 zur\u00fcckgibt. Wie viele im Durchschnitt aus dem Cache abgefragt und gelesen wurden. Wir sehen, dass alles gro\u00dfartig im Cache gespeichert ist. Nur Hits f\u00fcr die erste Gruppe. <\/p>\n<p><\/p>\n<p>Die vierte Zeile in jeder Zeile \u2013 das sind wie viele Prozent der Gesamtanzahl. Wir haben insgesamt Aufrufe. Nehmen wir an, 1.000.000. Und wir k\u00f6nnen verstehen, welchen Beitrag diese Gruppe leistet. Wir sehen, dass in diesem Fall die erste Gruppe weniger als 0,01 % beitr\u00e4gt. Das bedeutet, sie ist so langsam, dass wir sie im Gesamtbild nicht sehen. Die zweite Gruppe hingegen \u2013 5 % der Aufrufe. Das bedeutet, 5 % aller Aufrufe kommen von der zweiten Gruppe. <\/p>\n<p><\/p>\n<p>Bei total_time ist es auch interessant. F\u00fcr die erste Gruppe von Anfragen haben wir 14 % der gesamten Arbeitszeit aufgewendet. F\u00fcr die zweite Gruppe 11 % usw. <\/p>\n<p><\/p>\n<p>Ich werde nicht ins Detail gehen, aber es gibt Feinheiten. Wir zeigen oben einen Fehler an, weil, wenn wir vergleichen, die Snapshots abweichen k\u00f6nnen, d. h. einige Anfragen k\u00f6nnen ausfallen und im zweiten Snapshot nicht vorhanden sein, w\u00e4hrend einige neue auftauchen k\u00f6nnen. Und wir berechnen dort den Fehler. Wenn Sie 0 sehen, ist das gut. Das bedeutet, es gibt keine Fehler. Wenn der Fehlerindikator bis zu 20 % betr\u00e4gt, ist das in Ordnung. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dann kehren wir zu unserem Thema zur\u00fcck. Wir m\u00fcssen die Arbeitslast zusammenschn\u00fcren. Wir gehen von oben nach unten, bis wir 80 % oder 90 % erreicht haben. Normalerweise sind das 10-20 Gruppen. Und wir erstellen Dateien f\u00fcr pgbench. Dort verwenden wir random. Manchmal klappt das leider nicht. Und in Postgres 12 wird es mehr M\u00f6glichkeiten geben, diesen Ansatz zu nutzen. <\/p>\n<p><\/p>\n<p>Und so erreichen wir 80-90 % der gesamten Zeit. Was sollten wir nach dem @ einsetzen? Wir schauen uns die Anrufe an, sehen uns an, wie viele Prozents\u00e4tze es sind und verstehen, dass wir hier einen bestimmten Prozentsatz erreichen m\u00fcssen. Aus diesen Prozents\u00e4tzen k\u00f6nnen wir verstehen, wie wir jede einzelne Datei ausbalancieren. Danach verwenden wir pgbench und fangen an zu arbeiten. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wir haben auch K001 und K002. <\/p>\n<p><\/p>\n<p>K001 ist eine gro\u00dfe Zeile mit vier Unterzeilen. Dies beschreibt die gesamte Last. Schaut euch die zweite Spalte und die zweite Unterzeile an. Wir sehen, dass es etwa anderthalb Sekunden pro Sekunde sind, d. h. wenn es zwei Kerne gibt, w\u00e4re das gut. Die Auslastung l\u00e4ge dann bei etwa 75 %. Und so wird es funktionieren. Wenn wir 10 Kerne haben, sind wir vollkommen in Ordnung. So k\u00f6nnen wir die Ressourcen einsch\u00e4tzen.<\/p>\n<p><\/p>\n<p>K002 bezeichne ich als Klassen von Anfragen, d. h. SELECT, INSERT, UPDATE, DELETE. Und separat SELECT FOR UPDATE, weil dieser sperrt. <\/p>\n<p><\/p>\n<p>Hier k\u00f6nnen wir feststellen, dass die gew\u00f6hnlichen SELECT-Abfragen \u2013 82 % aller Aufrufe ausmachen, aber dabei \u2013 74 % der Gesamtzeit. D. h. sie werden h\u00e4ufig aufgerufen, verbrauchen aber weniger Ressourcen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und zur\u00fcck zu der Frage: \u201eWie w\u00e4hlen wir die richtigen shared_buffers aus?\u201c. Ich stelle fest, dass die meisten Benchmarks auf der Idee basieren \u2013 lasst uns schauen, was die Durchsatzrate sein wird, also welche Bandbreite wir erreichen k\u00f6nnen. Diese wird \u00fcblicherweise in TPS oder QPS gemessen.<\/p>\n<p><\/p>\n<p>Und wir versuchen, mit den Parametern des Tuning so viele Transaktionen pro Sekunde wie m\u00f6glich aus der Maschine herauszuholen. Hier sind es 311 pro Sekunde f\u00fcr SELECT.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aber niemand f\u00e4hrt mit dem Auto mit Vollgas zur Arbeit und zur\u00fcck nach Hause. Das ist dumm. Ebenso ist es mit Datenbanken. Wir sollten nicht mit Vollgas fahren, und das tut auch niemand. Niemand lebt in einer Produktion, die 100 % CPU-Auslastung hat. Obwohl vielleicht jemand das tut, ist das nicht gut. <\/p>\n<p><\/p>\n<p>Die Idee ist, dass wir normalerweise bei etwa 20 % unserer M\u00f6glichkeiten fahren, und es ist w\u00fcnschenswert, dass wir nicht \u00fcber 50 % hinausgehen. Und wir versuchen, die Antwortzeiten vor allem f\u00fcr unsere Nutzer zu optimieren. D. h., wir m\u00fcssen unsere Handlungen so gestalten, dass die Latenz bei hypothetisch 20 % Geschwindigkeit minimal ist. Das ist die Idee, die wir auch in unseren Experimenten zu nutzen versuchen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Und schlie\u00dflich die Empfehlungen: <\/p>\n<p><\/p>\n<ul>\n<li>Stellt unbedingt eine Datenbankumgebung bereit.<\/li>\n<li>Wenn m\u00f6glich, macht es on demand, sodass es f\u00fcr eine gewisse Zeit bereitgestellt wird \u2013 gespielt und dann wieder entfernt. Wenn ihr Clouds habt, ist das selbstverst\u00e4ndlich, d. h. handelt damit. <\/li>\n<li>Seien Sie neugierig. Und wenn etwas nicht stimmt, testen Sie durch Experimente, wie es sich verh\u00e4lt. Nancy kann verwendet werden, um sich selbst zu schulen, um zu \u00fcberpr\u00fcfen, wie die Datenbank funktioniert.<\/li>\n<li>Und zielen Sie auf die minimale Reaktionszeit. <\/li>\n<li>Haben Sie keine Angst vor den Postgres-Quellcodes. Wenn Sie mit den Quellcodes arbeiten, sollten Sie Englisch kennen. Da gibt es sehr viele Kommentare, die alles erkl\u00e4ren. <\/li>\n<li>Und \u00fcberpr\u00fcfen Sie regelm\u00e4\u00dfig die Gesundheit der Datenbank, mindestens einmal alle drei Monate von Hand oder mit Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fragen<\/p>\n<p><\/p>\n<p><em>Vielen Dank! Sehr interessantes Thema.<\/em> <\/p>\n<p><\/p>\n<p>Zwei Sachen.<\/p>\n<p><\/p>\n<p><em>Ja, zwei Sachen. Nur ich habe das nicht ganz verstanden. Wenn wir mit Nancy arbeiten, k\u00f6nnen wir nur einen Parameter anpassen oder eine ganze Gruppe?<\/em><\/p>\n<p><\/p>\n<p>Wir haben einen Delta-Config-Parameter. Sie k\u00f6nnen dort beliebig viele gleichzeitig anpassen. Aber Sie m\u00fcssen verstehen, dass wenn Sie vieles \u00e4ndern, Sie falsche Schlussfolgerungen ziehen k\u00f6nnten. <\/p>\n<p><\/p>\n<p><em>Ja. Warum habe ich gefragt? Weil es schwierig ist, Experimente durchzuf\u00fchren, wenn man nur einen Parameter hat. Man stellt ihn ein, sieht, wie er funktioniert. Dann optimalisiert man den n\u00e4chsten.<\/em><\/p>\n<p><\/p>\n<p>Man kann mehrere gleichzeitig anpassen, aber das h\u00e4ngt nat\u00fcrlich von der Situation ab. Aber es ist besser, eine Idee zu testen. Wir hatten gestern eine Idee. Wir hatten eine sehr \u00e4hnliche Situation. Es gab zwei Konfigurationen. Und wir konnten nicht verstehen, warum es so gro\u00dfe Unterschiede gab. Und die Idee entstand, dass wir Dichotomie verwenden m\u00fcssen, um schrittweise zu verstehen und herauszufinden, wo der Unterschied liegt. Man kann sofort die H\u00e4lfte der Parameter gleich machen, dann ein Viertel usw. Alles flexibel.<\/p>\n<p><\/p>\n<p><em>Und ich habe noch eine Frage. Das Projekt ist jung, es entwickelt sich. Ist die Dokumentation schon fertig, gibt es eine ausf\u00fchrliche Beschreibung?<\/em><\/p>\n<p><\/p>\n<p>Ich habe dort absichtlich einen Link zur Beschreibung der Parameter gesetzt. Das gibt es. Aber vieles gibt es noch nicht. Ich suche Gleichgesinnte. Und ich finde sie, wenn ich spreche. Das ist echt klasse. Jemand arbeitet bereits mit mir, jemand hat geholfen und etwas gemacht. Und wenn Ihnen dieses Thema interessiert, geben Sie bitte Feedback \u2013 was fehlt. <\/p>\n<p><\/p>\n<p><em>Wenn wir das Labor machen, k\u00f6nnte es R\u00fcckmeldungen geben. Mal schauen. Danke!<\/em><\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Bericht! Ich habe gesehen, dass es Unterst\u00fctzung f\u00fcr Amazon gibt. Ist Unterst\u00fctzung f\u00fcr GSP geplant?<\/em><\/p>\n<p><\/p>\n<p>Gute Frage. Wir haben damit begonnen. Und vorerst eingefroren, weil wir sparen wollen. D. h. es gibt Unterst\u00fctzung durch Run on localhost. Sie k\u00f6nnen selbst ein Instance erstellen und lokal arbeiten. \u00dcbrigens, so machen wir es. In Getlab mache ich das so, dort auf GSP. Aber genau diese Orchestrierung sehen wir derzeit keinen Sinn, da Google keine g\u00fcnstigen Spot-Instances hat. Es gibt ??? Instances, aber die haben Einschr\u00e4nkungen. Erstens gibt es immer nur 70 % Rabatt und man kann den Preis nicht anpassen. Bei Spot-Instances erh\u00f6hen wir den Preis um 5-10 %, um die Wahrscheinlichkeit zu verringern, dass sie gekillt werden. D. h. bei Spot-Instances sparen Sie, aber sie k\u00f6nnen jederzeit weggenommen werden. Wenn Sie den Preis etwas h\u00f6her ansetzen als bei anderen, werden Sie sp\u00e4ter gekillt. Google hat eine ganz andere Spezifik. Und es gibt noch eine sehr unangenehme Einschr\u00e4nkung \u2013 sie leben nur 24 Stunden. Manchmal wollen wir jedoch ein Experiment \u00fcber 5 Tage laufen lassen. Bei Spot-Instances kann man das machen, diese leben manchmal monatelang. <\/p>\n<p><\/p>\n<p><em>Hallo! Vielen Dank f\u00fcr den Vortrag! Sie haben den Checkup erw\u00e4hnt. Wie berechnen Sie die Fehler in stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Sehr gute Frage. Ich kann das sehr detailliert zeigen und erkl\u00e4ren. Kurz gesagt - wir schauen, wie sich eine Gruppe von Anfragen verhalten hat: wie viele weggefallen sind und wie viele neu hinzugekommen sind. Und dann betrachten wir zwei Metriken: total_time und calls, daher gibt es zwei Fehler. Und wir sehen uns an, welchen Beitrag die betroffenen Gruppen geleistet haben. Es gibt zwei Untergruppen: die weggefahrenen und die neu angekommenen. Wir schauen, wie viel Einfluss sie auf das Gesamtbild haben. <\/p>\n<p><\/p>\n<p><em>Haben Sie keine Angst, dass es zwischen den Snapshots zwei- oder dreimal durchgef\u00fchrt wird?<\/em><\/p>\n<p><\/p>\n<p>D. h. haben sie sich neu registriert oder wie?<\/p>\n<p><\/p>\n<p><em>Zum Beispiel wurde diese Anfrage einmal bereits verdr\u00e4ngt, dann kam sie wieder und wurde erneut verdr\u00e4ngt, dann kam sie noch einmal und wurde wieder verdr\u00e4ngt. Und was haben Sie hier gez\u00e4hlt, wo ist das alles?<\/em><\/p>\n<p><\/p>\n<p>Gute Frage, das m\u00fcssen wir uns anschauen. <\/p>\n<p><\/p>\n<p><em>Ich habe eine \u00e4hnliche Sache gemacht. Nat\u00fcrlich einfacher, ich habe es alleine gemacht. Aber ich musste zur\u00fccksetzen, stat_statements zur\u00fccksetzen und mich im Moment des Snapshots orientieren, dass dort weniger als ein bestimmter Anteil ist, dass es trotzdem nicht an die Obergrenze von stat_statements gekommen ist. Und ich orientiere mich daran, dass wahrscheinlich nichts verdr\u00e4ngt wurde.<\/em> <\/p>\n<p><\/p>\n<p>Ja, ja. <\/p>\n<p><\/p>\n<p><em>Aber ich verstehe nicht, wie man es anders verl\u00e4sslich machen kann.<\/em><\/p>\n<p><\/p>\n<p>Leider erinnere ich mich nicht genau \u2013 verwenden wir dort den Anfrage-Text oder den queryid aus pg_stat_statements und orientieren uns daran. Wenn wir uns auf queryid orientieren, vergleichen wir beispielsweise vergleichbare Dinge. <\/p>\n<p><\/p>\n<p><em>Nein, er kann sich zwischen den Snapshots mehrmals \u00fcberschreiben und wieder kommen.<\/em><\/p>\n<p><\/p>\n<p>Mit dieser ID?<\/p>\n<p><\/p>\n<p><em>Ja.<\/em> <\/p>\n<p><\/p>\n<p>Wir werden das untersuchen. Gute Frage. Wir m\u00fcssen es studieren. Aber bisher sehen wir nur, dass bei uns entweder 0 angezeigt wird...<\/p>\n<p><\/p>\n<p><em>Das ist nat\u00fcrlich ein seltener Fall, aber ich war erschrocken, als ich erfuhr, dass stat_statements dort \u00fcberschrieben werden kann.<\/em> <\/p>\n<p><\/p>\n<p>In Pg_stat_statements kann es viel geben. Wir haben festgestellt, dass, wenn Sie track_utility = on, auch Ihre Sets verfolgt werden. <\/p>\n<p><\/p>\n<p><em>Ja, nat\u00fcrlich.<\/em><\/p>\n<p><\/p>\n<p>Und wenn Sie Java Hibernate haben, das zuf\u00e4llig ist, dann beginnt die Hash-Tabelle zu blockieren. Und sobald Sie eine stark belastete Anwendung ausschalten, haben Sie 50-100 Gruppen. Und dort ist alles mehr oder weniger stabil. Ein Weg, dem entgegenzuwirken, ist, pg_stat_statements.max zu erh\u00f6hen. <\/p>\n<p><\/p>\n<p><em>Ja, aber man muss wissen, wie viel. Und man muss es irgendwie im Auge behalten. So mache ich es. Das hei\u00dft, ich habe pg_stat_statements.max. Und ich schaue, dass ich zum Zeitpunkt des Snapshots nicht 70 % erreicht habe. Gut, das hei\u00dft, wir haben nichts verloren. Wir machen einen Reset. Und sammeln es erneut. Wenn es im n\u00e4chsten Snapshot weniger als 70 ist, dann haben wir wahrscheinlich wieder nichts verloren.<\/em><\/p>\n<p><\/p>\n<p>Ja. Standardm\u00e4\u00dfig sind es jetzt 5.000. Und vielen reicht das aus. <\/p>\n<p><\/p>\n<p><em>Normalerweise \u2013 ja.<\/em> <\/p>\n<p><\/p>\n<p>Video:<\/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=\"Video abspielen\" 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. Ich f\u00fcge hinzu, dass, wenn sich vertrauliche Daten in Postgres befinden und diese nicht in die Testumgebung gelangen d\u00fcrfen, man Folgendes verwenden kann: <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. Das Schema ist ungef\u00e4hr wie folgt:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"&quot;Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken&quot;. Nikolai Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quelle: <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.1.1 - 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\/de\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47\"Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken\". Nikolai Samokhvalov | ProHoster","description":"Ich empfehle, sich die Transkription des Berichts von Nikolai Samokhvalov \"Industrieller Ansatz zur Optimierung von PostgreSQL: Experimente mit Datenbanken\" anzusehen. Shared_buffers = 25 % \u2013 ist das viel oder wenig?","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}