{"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\/es\/blog\/administrirovanie\/promyshlennyj-podhod-k-tyuningu-postgresql-eksperimenty-nad-bazami-dannyh-nikolaj-samohvalov","title":{"rendered":"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&#187;. Nikolai Samokhvalov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Le ofrezco conocer la transcripci\u00f3n de la presentaci\u00f3n de Nikolai Samokhvalov \"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos\"<\/strong><\/p>\n<p><\/p>\n<p>\u00bfShared_buffers = 25% es mucho o poco? \u00bfO es justo lo correcto? \u00bfC\u00f3mo entender si esta recomendaci\u00f3n, bastante desactualizada, se aplica a su caso espec\u00edfico?<\/p>\n<p><\/p>\n<p>Ha llegado el momento de abordar la cuesti\u00f3n de la selecci\u00f3n de par\u00e1metros para postgresql.conf \"de manera profesional\". No a trav\u00e9s de ciegos \"autotuners\" o consejos obsoletos de art\u00edculos y blogs, sino bas\u00e1ndose en:<\/p>\n<p><\/p>\n<ol>\n<li>experimentos rigurosamente calibrados en bases de datos, realizados de forma automatizada, en grandes cantidades y en condiciones lo m\u00e1s cercanas posible a las \"de combate\",<\/li>\n<li>una comprensi\u00f3n profunda de las caracter\u00edsticas del funcionamiento del SGBD y del SO.<\/li>\n<\/ol>\n<p><\/p>\n<p>Utilizando Nancy CLI (<noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres.ai\/nancy\">https:\/\/gitlab.com\/postgres.ai\/nancy<\/a><\/noindex>), veremos un caso concreto: los famosos shared_buffers, en diferentes situaciones y proyectos y trataremos de entender c\u00f3mo elegir la configuraci\u00f3n \u00f3ptima para nuestra infraestructura, base de datos y carga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay 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>Vamos a hablar sobre experimentos con bases de datos. Esta es una historia que ha estado en desarrollo durante poco m\u00e1s de seis meses. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/e77255c4abaa2a01ae37fe888fe67db7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un poco sobre m\u00ed. Tengo m\u00e1s de 14 a\u00f1os de experiencia con Postgres. He fundado varias empresas de redes sociales. En todas se ha utilizado Postgres.<\/p>\n<p><\/p>\n<p>Tambi\u00e9n el grupo RuPostgres en Meetup, en segundo lugar en el mundo. Poco a poco nos acercamos a los 2000 miembros. RuPostgres.org.<\/p>\n<p><\/p>\n<p>Y en varios conferencias de PC, incluida Highload, he estado a cargo de bases de datos, especialmente de Postgres desde el principio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/fa009b50f1c0293eee80fc03fd2c05f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En los \u00faltimos a\u00f1os, he reiniciado mi pr\u00e1ctica de consultor\u00eda de Postgres a 11 zonas horarias desde aqu\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/550c3ddcd516adca14d2b3de9c34b7ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y cuando lo hice hace algunos a\u00f1os, hab\u00eda tenido un cierto descanso del trabajo manual activo con Postgres, probablemente desde 2010. Me sorprendi\u00f3 lo poco que hab\u00edan cambiado las rutinas laborales de DBA, cu\u00e1nta necesidad segu\u00eda habiendo de trabajo manual. Y pens\u00e9 de inmediato que algo no estaba bien, que hab\u00eda que automatizar mucho m\u00e1s.<\/p>\n<p><\/p>\n<p>Y dado que todo esto fue remoto, la mayor\u00eda de los clientes estaba en la nube. Y ya se hab\u00eda automatizado mucho, claramente. Hablaremos m\u00e1s de esto m\u00e1s adelante. Es decir, todo esto condujo a la idea de que deber\u00eda haber una serie de herramientas, es decir, una plataforma que automatice pr\u00e1cticamente todas las acciones de un DBA, para poder gestionar un gran n\u00famero de bases de datos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b02097f0bb23fa9d7c30e38ab9f3de7b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En esta presentaci\u00f3n no habr\u00e1:<\/p>\n<p><\/p>\n<ul>\n<li>\u00abBalas de plata\u00bb ni afirmaciones como \u2013 ponga 8 GB o 25 % de shared_buffers y estar\u00e1 bien. No hablaremos tanto sobre shared_buffers. <\/li>\n<li>Componentes de hardcore. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ccea359ec78a967c150ddcedc3e50a88.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfY qu\u00e9 pasar\u00e1?<\/p>\n<p><\/p>\n<ul>\n<li>Habr\u00e1 principios de optimizaci\u00f3n que aplicamos y desarrollamos. Habr\u00e1 diversas ideas que surgen en nuestro camino y distintas herramientas que creamos en su mayor parte en Open Source, es decir, basamos lo fundamental en Open Source. Adem\u00e1s, tenemos tickets, casi toda la comunicaci\u00f3n se lleva a cabo en Open Source. Puedes ver lo que estamos haciendo ahora, lo que habr\u00e1 en la pr\u00f3xima versi\u00f3n, etc. <\/li>\n<li>Tambi\u00e9n habr\u00e1 cierta experiencia en el uso de estos principios y herramientas en una variedad de empresas: desde peque\u00f1as startups hasta grandes corporaciones. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86e6f379726dec814aca616a30d36a2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo se desarrolla todo esto?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c1422d9f2945e717c6ebb31f5fef6329.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Primero, la tarea principal de un DBA, adem\u00e1s de asegurar la creaci\u00f3n de instancias, la implementaci\u00f3n de copias de seguridad, etc., es identificar cuellos de botella y optimizar el rendimiento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8e682ca8666e94d6688348ebe4540327.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Actualmente, est\u00e1 organizado de esta manera. Miramos el monitoreo, vemos algo, pero nos faltan algunos detalles. Comenzamos a investigar m\u00e1s a fondo, generalmente manualmente, y entendemos qu\u00e9 hacer con ello.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/04599422ea6b6d57c79a4e48ba2db8b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y hay dos enfoques. Pg_stat_statements es la soluci\u00f3n est\u00e1ndar por defecto para identificar consultas lentas. Y el an\u00e1lisis de logs de Postgres utilizando pgBadger.<\/p>\n<p><\/p>\n<p>Cada uno de los enfoques tiene serias desventajas. En el primer enfoque, se descartan todos los par\u00e1metros. Si vemos grupos SELECT * FROM table where columna es igual a \"?\" o \"$\" a partir de Postgres versi\u00f3n 10, no sabemos si es un escaneo por \u00edndice o un escaneo secuencial. Depende mucho del par\u00e1metro. Si pones un valor poco frecuente, ser\u00e1 un escaneo por \u00edndice. Si pones un valor que ocupa el 90 % de la tabla, ser\u00e1 un escaneo secuencial, porque Postgres conoce la estad\u00edstica. Y esta es una gran desventaja de pg_stat_statements, aunque se est\u00e1n realizando algunas mejoras.<\/p>\n<p><\/p>\n<p>El principal inconveniente del an\u00e1lisis de logs es que no puedes permitirte \"log_min_duration_statement = 0\", por lo general. Y sobre esto tambi\u00e9n hablaremos. En consecuencia, no ves toda la imagen. Y una consulta que es muy r\u00e1pida puede consumir una gran cantidad de recursos, pero no la ver\u00e1s porque est\u00e1 por debajo de tu umbral.<\/p>\n<p><\/p>\n<p><strong>\u00bfC\u00f3mo resuelven los DBA los problemas encontrados?<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/5e57fefdec6256f82045aaac037b516c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por ejemplo, encontramos alg\u00fan problema. \u00bfQu\u00e9 se suele hacer? Si eres desarrollador, har\u00e1s algo en alguna instancia que no es de ese tama\u00f1o. Si eres DBA, tienes un staging. Y solo puede haber uno. Y ha estado desactualizado por seis meses. Y piensas en ir a producci\u00f3n. Incluso los DBA experimentados revisan luego en producci\u00f3n, en la r\u00e9plica. A veces crean un \u00edndice temporal, se aseguran de que ayuda, lo eliminan y lo entregan a los desarrolladores para que lo incluyan en los archivos de migraci\u00f3n. Este tipo de locura sucede ahora. Y es un problema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/402e80c7e5fbca6a054c0c9ec61e5fe3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Ajustar configuraciones.<\/li>\n<li>Optimizar el conjunto de \u00edndices. <\/li>\n<li>Modificar la propia consulta SQL (este es el m\u00e9todo m\u00e1s complicado).<\/li>\n<li>Aumentar los recursos (el m\u00e9todo m\u00e1s sencillo en la mayor\u00eda de los casos).<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8a6b3cd56e0df5c7908714926ba1eb05.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con estas cosas hay mucho. Hay muchas consideraciones en Postgres. Se necesita saber mucho. Hay muchos \u00edndices en Postgres, gracias en parte a los organizadores de esta conferencia. Todo esto hay que conocer, y es precisamente esto lo que provoca en los no DBA la sensaci\u00f3n de que los DBA practican magia negra. Es decir, se necesita dedicar unos 10 a\u00f1os para empezar a entender todo esto correctamente.<\/p>\n<p><\/p>\n<p>Y yo soy un luchador contra esta magia negra. Quiero hacer todo de tal manera que haya tecnolog\u00eda y no solo intuici\u00f3n en todo esto.<\/p>\n<p><\/p>\n<p><strong>Ejemplos de la vida real<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/70b11c3df9c41c66570635d5f309ed24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esto lo he observado en al menos dos proyectos, incluido el m\u00edo. Otro post en el blog nos dice que el valor 1,000 para default_statistic_target es bueno. Bien, intent\u00e9moslo en producci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0b4c2bd6f73df06967c94d5d78b07279.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y aqu\u00ed estamos, utilizando nuestra herramienta dos a\u00f1os despu\u00e9s, con experimentos sobre las bases de datos de las que hablamos hoy, podemos comparar lo que era y lo que es ahora. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/3564eade6532003d2279c2736ab6d733.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y para esto necesitamos crear un experimento. Consiste en cuatro partes. <\/p>\n<p><\/p>\n<ul>\n<li>La primera es el entorno. Necesitamos hardware. Y cuando llego a alguna empresa y firmo un contrato, digo que me den un hardware igual al de producci\u00f3n. Para cada uno de sus Maestros necesito al menos un hardware igual. Ya sea una m\u00e1quina virtual en Amazon o en Google, o necesito exactamente el mismo hardware. Es decir, quiero recrear el entorno. Y en el concepto de entorno incluimos la versi\u00f3n mayor de Postgres. <\/li>\n<li>La segunda parte es el objeto de nuestra investigaci\u00f3n. Es la base de datos. Se puede crear de varias maneras. Mostrar\u00e9 c\u00f3mo. <\/li>\n<li>La tercera parte es la carga. Este es el momento m\u00e1s complicado. <\/li>\n<li>Y la cuarta parte es lo que comprobamos, es decir, con qu\u00e9 vamos a comparar. Supongamos que podemos cambiar uno o varios par\u00e1metros en la configuraci\u00f3n, o podemos crear un \u00edndice, etc. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8ccd09ac4cdd336618413375617c10a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iniciamos el experimento. Aqu\u00ed est\u00e1 pg_stat_statements. A la izquierda est\u00e1 lo que hab\u00eda. A la derecha est\u00e1 lo que se ha convertido.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/6f82d7e25a77b700f2ddb01f42a861a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A la izquierda default_statistics_target = 100, y a la derecha = 1 000. Vemos que esto nos ha ayudado. En general, ha mejorado un 8 %.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/52dda8fb5fbcb9beecaa1eda8443a374.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero si bajamos un poco, veremos grupos de consultas de pgBadger o de pg_stat_statements. Aqu\u00ed hay dos opciones. Veremos que alguna consulta ha disminuido un 88 %. Y aqu\u00ed entra el enfoque ingenieril. Podemos investigar m\u00e1s a fondo porque es interesante saber por qu\u00e9 ha disminuido. Necesitamos entender qu\u00e9 hab\u00eda en la estad\u00edstica. Por qu\u00e9 m\u00e1s buckets en la estad\u00edstica conducen a un peor resultado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4e6dfc04af4b3fc2b626dd46c08bdf66.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O podemos no investigar y hacer \"ALTER TABLE \u2026 ALTER COLUMN\" y devolver a esta columna 100 buckets en la estad\u00edstica. Y luego, mediante otros experimentos, podemos asegurarnos de que este parche ha ayudado. Eso es todo. Este es el enfoque ingenieril que nos ayuda a ver el panorama y tomar decisiones basadas en datos, no en intuiciones.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay 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=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/9e766aa4348bd1a77b697e3179d84bbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un par de ejemplos de otras \u00e1reas. En las pruebas, existen pruebas de CI desde hace muchos a\u00f1os. Y ning\u00fan proyecto en su sano juicio vivir\u00eda sin pruebas autom\u00e1ticas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b6c21981dc8b2b285973ae42199e2b4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En otras industrias: en la aviaci\u00f3n, en la automoci\u00f3n, cuando probamos la aerodin\u00e1mica, tambi\u00e9n tenemos la oportunidad de realizar experimentos. No lanzaremos algo del plano directamente al espacio ni sacaremos un coche a la carretera de inmediato. Por ejemplo, existe un t\u00fanel de viento. <\/p>\n<p><\/p>\n<p>A partir de las observaciones de otras industrias, podemos sacar conclusiones. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cef02ea9280e5795d1e593c600f0541b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En primer lugar, tenemos un entorno espec\u00edfico. Est\u00e1 cerca de la producci\u00f3n, pero no del todo. Su principal caracter\u00edstica es que debe ser econ\u00f3mico, repetible y completamente automatizado. Y tambi\u00e9n deben existir herramientas especiales para realizar un an\u00e1lisis detallado.<\/p>\n<p><\/p>\n<p>Probablemente, cuando lanzamos un avi\u00f3n y volamos, tenemos menos oportunidades de estudiar cada mil\u00edmetro de la superficie del ala que en un t\u00fanel de viento. Tenemos m\u00e1s recursos para el diagn\u00f3stico. Podemos permitirnos agregar m\u00e1s cosas pesadas, que no podemos permitirnos en un avi\u00f3n en el aire. Lo mismo pasa con Postgres. En algunos casos, podemos habilitar el registro completo de consultas durante los experimentos. Y no queremos hacer eso en producci\u00f3n. Tal vez incluso lo habilitemos con el uso de auto_explain en los planes.<\/p>\n<p><\/p>\n<p>Y como ya mencion\u00e9, un alto nivel de automatizaci\u00f3n significa que presionamos un bot\u00f3n y repetimos. As\u00ed es como debe ser, para tener muchos experimentos, para que sea continuo.<\/p>\n<p><\/p>\n<p>Nancy CLI - la base del \"laboratorio de bases de datos\"<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/f8303df21f309fb209929acec260b757.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y aqu\u00ed tenemos algo. Es decir, he hablado de estas ideas en junio, hace casi un a\u00f1o. Y ya tenemos en Open Source lo que llamamos Nancy CLI. Esta es la base para construir un laboratorio de bases de datos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay 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 Esto est\u00e1 en Open Source, en Gitlab. Pueden decirlo, pueden probarlo. He dejado un enlace en las diapositivas. Se puede hacer clic y all\u00ed estar\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/nancy\/-\/blob\/master\/help\/nancy_run.md\">help<\/a><\/noindex> en todos los par\u00e1metros.<\/p>\n<p><\/p>\n<p>Por supuesto, hay muchas cosas a\u00fan en desarrollo. Muchas ideas en cantidad. Pero ya es algo que utilizamos pr\u00e1cticamente a diario. Y cuando se nos ocurre una idea - \u00bfqu\u00e9 pasa si al borrar 40,000,000 de filas nos encontramos con un problema de IO? Podemos realizar un experimento y observar m\u00e1s de cerca para entender qu\u00e9 est\u00e1 pasando y luego intentar solucionarlo sobre la marcha. Es decir, hacemos un experimento. Por ejemplo, ajustamos algo y vemos cu\u00e1l es el resultado. Y lo hacemos no en producci\u00f3n. Esa es la esencia de la idea.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c22d332de4b45d604dfb9c5a95404fd6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfD\u00f3nde puede funcionar esto? Puede funcionar localmente, es decir, se puede hacer en cualquier lugar, incluso se puede ejecutar en un MacBook. Se necesita Docker, y listo. Se puede ejecutar en alg\u00fan instance en hardware, o en una m\u00e1quina virtual, donde sea.<\/p>\n<p><\/p>\n<p>Y tambi\u00e9n existe la posibilidad de ejecutarlo de forma remota en Amazon EC2 Instance, en instancias spot. Y es una oportunidad realmente excelente. Por ejemplo, ayer realizamos m\u00e1s de 500 experimentos en una instancia i3, comenzando desde la m\u00e1s peque\u00f1a hasta la i3-16-xlarge. Y esos 500 experimentos nos costaron 64 d\u00f3lares. Cada uno dur\u00f3 15 minutos. Es decir, gracias a que se utilizan instancias spot, es muy barato: un descuento del 70%, con la facturaci\u00f3n por segundo de Amazon. Puedes hacer much\u00edsimas cosas. Puedes llevar a cabo una investigaci\u00f3n real.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/64c61cc9dd7181296b2ef5b815a17493.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y se admiten tres versiones principales de Postgres. No es tan dif\u00edcil adaptar algunas versiones antiguas y la nueva versi\u00f3n 12 tambi\u00e9n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/ee147c91014ab698cbd3c60e193bef23.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Podemos definir el objeto de tres maneras. Estas son:<\/p>\n<p><\/p>\n<ul>\n<li>Archivo Dump\/sql. <\/li>\n<li>El m\u00e9todo principal es clonar el directorio PGDATA. Normalmente se toma del servidor de respaldo. Si tienes copias de seguridad binarias en buen estado, desde all\u00ed puedes hacer clones. Si tienes soluciones en la nube, entonces una empresa de nube como Amazon o Google se encargar\u00e1 de ello por ti. Este es el m\u00e9todo principal para los clones de producci\u00f3n real. As\u00ed es como justamente hacemos nuestro despliegue. <\/li>\n<li>Y el \u00faltimo m\u00e9todo es adecuado para investigaciones, cuando se quiere entender c\u00f3mo funciona algo en Postgres. Esto es pgbench. Puedes generar utilizando pgbench. Simplemente hay una opci\u00f3n llamada \u00abdb-pgbench\u00bb. Le dices cu\u00e1l es el scale. Y todo ser\u00e1 generado en la nube, como se indica.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/2bc3e30cb31a19f66c6b55480447126f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y la carga:<\/p>\n<p><\/p>\n<ul>\n<li>Podemos ejecutar la carga en un solo hilo de SQL. Este es el m\u00e9todo m\u00e1s primitivo. <\/li>\n<li>O podemos emular la carga. Y es algo que podemos emular de la siguiente manera. Necesitamos recopilar todos los logs. Y eso puede ser complicado. Te mostrar\u00e9 por qu\u00e9. Y utilizamos pgreplay, que est\u00e1 integrado en Nancy. <\/li>\n<li>Otra opci\u00f3n. La llamada carga artesanal, que hacemos con cierto esfuerzo. Analizando nuestra carga actual en el sistema en producci\u00f3n, extraemos los grupos de consultas m\u00e1s importantes. Y con pgbench podemos emular esa carga en el laboratorio. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/4adba12881faf9ad9d4f9e9f42c0f5c1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>O tenemos que ejecutar alguna SQL, es decir, verificamos alguna migraci\u00f3n, creamos un \u00edndice, ejecutamos ANALYZE. Y observamos lo que ocurri\u00f3 antes y despu\u00e9s de un vacuum. En resumen, cualquier SQL.<\/li>\n<li>O podemos cambiar uno o varios par\u00e1metros en la configuraci\u00f3n. Podemos pedir que revisen, por ejemplo, 100 valores en Amazon para nuestra base de un terabyte. Y en unas pocas horas tendr\u00e1s el resultado. Generalmente, la base de un terabyte se desplegar\u00e1 en unas horas. Pero en desarrollo hay un parche, tenemos la posibilidad de hacer una serie, es decir, puedes usar el mismo pgdata en el mismo servidor y hacer verificaciones. Postgres se reiniciar\u00e1, se borrar\u00e1n los cach\u00e9s. Y puedes generar carga. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/02985b47bf0ab62e8f1c4cc3ea003f26.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Llega un directorio que contiene un mont\u00f3n de archivos, comenzando por los snapshots de pg.<em>stat<\/em>***. Y lo m\u00e1s interesante ah\u00ed es pg_stat_statements, pg_stat_kcache. Estos son dos extensiones que analizan las consultas. Y pg_stat_bgwriter contiene no solo la estad\u00edstica de pgwriter, sino tambi\u00e9n sobre los checkpoints y c\u00f3mo los propios backend expulsan los buffers sucios. Y es interesante ver todo esto. Por ejemplo, cuando configuramos shared_buffers, es muy interesante ver cu\u00e1nto ha sido expulsado.<\/li>\n<li>Tambi\u00e9n llegan los logs de Postgres. Dos logs: el log de preparaci\u00f3n y el log de reproducci\u00f3n de carga. <\/li>\n<li>Una caracter\u00edstica relativamente nueva son los FlameGraphs.<\/li>\n<li>Adem\u00e1s, si has utilizado pgreplay o los variantes de pgbench para la reproducci\u00f3n de carga, tendr\u00e1s su salida nativa. Y podr\u00e1s ver la latencia y TPS. Se podr\u00e1 entender c\u00f3mo lo vieron. <\/li>\n<li>Informaci\u00f3n sobre el sistema. <\/li>\n<li>Verificaciones b\u00e1sicas de CPU e IO. Esto es m\u00e1s para las instancias de EC2 en Amazon, cuando deseas lanzar 100 instancias iguales en paralelo y hacer 100 diferentes pruebas, tendr\u00e1s 10,000 experimentos. Y debes asegurarte de que no has obtenido una instancia defectuosa, que ya est\u00e1 sufriendo por otra. En este hardware, otros est\u00e1n activiando y te quedan pocos recursos. Es mejor descartar tales resultados. Justamente con sysbench de Alexey Kopytov hacemos algunas breves verificaciones, que llegar\u00e1n y se pueden comparar con otras, es decir, entender\u00e1s c\u00f3mo se comporta el CPU y c\u00f3mo se comporta el IO. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c4ddf5283c3c79e3d4c2c061e7dd9e7d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfCu\u00e1les son las dificultades t\u00e9cnicas a trav\u00e9s de diferentes empresas?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/959690b464a01a4a3cb67ec497becff1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supongamos que queremos reproducir una carga real utilizando logs. Es una excelente idea, si est\u00e1 escrito en Open Source pgreplay. Lo usamos. Pero para que funcione bien, debes habilitar el logging completo de consultas con par\u00e1metros y tiempos.<\/p>\n<p><\/p>\n<p>Hay algunas complejidades con respecto a la duraci\u00f3n y la marca de tiempo. Vamos a dejar de lado toda esta parte. La pregunta principal es: \u00bfpuede permit\u00edrselo o no? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay 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>El problema es que esto puede no estar disponible. Primero debe comprender qu\u00e9 flujo se registrar\u00e1 en el log. Si tiene pg_stat_statements, puede utilizar esta consulta (el enlace estar\u00e1 disponible en las diapositivas) para entender cu\u00e1ntos bytes se escribir\u00e1n por segundo.<\/p>\n<p><\/p>\n<p>Estamos mirando la longitud de la consulta. Ignoramos el hecho de que no hay par\u00e1metros, pero conocemos la longitud de la consulta y sabemos cu\u00e1ntas veces se ejecut\u00f3 por segundo. As\u00ed, podemos estimar cu\u00e1ntos bytes aproximadamente por segundo. Podemos equivocarnos en el doble, pero definitivamente entenderemos el orden de magnitud de esta manera.<\/p>\n<p><\/p>\n<p>Podemos ver que esta consulta se ejecuta 802 veces por segundo. Y vemos que se escriben aproximadamente 300 kB\/s. Y, por lo general, podemos permitirnos tal flujo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/218f905073a8519115adf5c65825b74d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00a1Pero! El hecho es que existen diferentes sistemas de registro. Y por defecto, la mayor\u00eda de la gente utiliza 'syslog'.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/66054682083ba2ada174afb5e7ee3973.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y si tiene syslog, entonces puede tener una imagen como esta. Tomaremos pgbench, activaremos el registro de consultas y veremos qu\u00e9 sucede.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a05723dcf10a7733f054ba108bb0f107.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sin registro, este es el primer columna izquierda. Logramos 161 000 TPS. Con syslog, en Ubuntu 16.04 en Amazon logramos 37 000 TPS. Pero si cambiamos a dos otros m\u00e9todos de registro, la situaci\u00f3n mejora considerablemente. Es decir, esper\u00e1bamos que disminuir\u00eda, pero no tanto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a7d90af9d29761d3b80eb09bf050760f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y en CentOS 7, donde journald tambi\u00e9n participa, transformando logs en un formato binario para b\u00fasqueda conveniente, la situaci\u00f3n es un desastre, caemos 44 veces en TPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/86d2af18a0e6364f297a62378b6ede56.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y con esto viven las personas. Y a menudo en las empresas, especialmente en las grandes, es muy dif\u00edcil cambiar. Si puede alejarse de syslog, h\u00e1galo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/a167a6fac7f28c7541515f7eff30bdb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Eval\u00fae los IOPS y el flujo de escritura. <\/li>\n<li>Verifique su sistema de registro. <\/li>\n<li>Si la carga prevista es excesivamente alta, considere la opci\u00f3n de muestreo. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/127fa1296578ba0ba6eac2b44c5c5398.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tenemos pg_stat_statements. Como dije, debe estar incluido. Y podemos tomar y describir cada grupo de consultas de manera especial en un archivo. Y luego podemos utilizar una caracter\u00edstica muy conveniente en pgbench: la opci\u00f3n de pasar varios archivos usando la opci\u00f3n '-f'.<\/p>\n<p><\/p>\n<p>\u00c9l entiende mucho el \u00ab-f\u00bb. Y se puede decir con \u00ab@\u00bb al final, qu\u00e9 proporci\u00f3n deber\u00eda tener cada archivo. O sea, podemos decir que este se ejecute en el 10 % de los casos, y este en el 20 %. Y esto nos acercar\u00e1 a lo que vemos en producci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/b91d18a9861abdc36bfda54cd72a142f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfY c\u00f3mo sabremos qu\u00e9 tenemos en producci\u00f3n? \u00bfQu\u00e9 proporci\u00f3n y de qu\u00e9? Aqu\u00ed hay un peque\u00f1o desv\u00edo. Tenemos otro producto. <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/postgres-ai\/postgres-checkup\">postgres-checkup<\/a><\/noindex>. Tambi\u00e9n es una base en Open Source. Y ahora la estamos desarrollando activamente.<\/p>\n<p><\/p>\n<p>Naci\u00f3 un poco por otras razones. Debido a que la monitorizaci\u00f3n no es suficiente. Es decir, llegas, miras la base, observas los problemas que hay. Y, como regla general, realizas un health_check. Si eres un DBA experimentado, haces un health_check. Observas el uso de \u00edndices, etc. Si tienes OKmeter, genial. Es una excelente monitorizaci\u00f3n para Postgres. OKmeter.io \u2013 por favor, inst\u00e1lalo, est\u00e1 todo muy bien hecho. Es de pago.<\/p>\n<p><\/p>\n<p>Si no lo tienes, por regla general, no tienes mucho. En la monitorizaci\u00f3n normalmente solo hay CPU, IO y eso con explicaciones, y ya est\u00e1. Y necesitamos m\u00e1s. Necesitamos ver c\u00f3mo funciona el autovacuum, c\u00f3mo funciona el checkpoint, y en IO necesitamos separar el checkpoint del bgwriter y de los backend, etc.<\/p>\n<p><\/p>\n<p>El problema es que cuando ayudas a una gran empresa, no pueden implementar algo r\u00e1pidamente. No pueden comprar OKmeter r\u00e1pidamente. Quiz\u00e1s lo compren en seis meses. No pueden instalar algunos paquetes r\u00e1pidamente. <\/p>\n<p><\/p>\n<p>Y se nos ocurri\u00f3 que necesitamos una herramienta especial que no requiera nada de instalaci\u00f3n, es decir, no debes instalar nada en producci\u00f3n. La instalas en tu laptop, o en un servidor de observaci\u00f3n, desde donde ejecutar\u00e1s. Y va a analizar muchas cosas: tanto el sistema operativo, como el sistema de archivos, y Postgres mismo, haciendo algunas consultas ligeras que se pueden ejecutar directamente en producci\u00f3n y no afectar\u00e1n nada.<\/p>\n<p><\/p>\n<p>La llamamos Postgres-checkup. Si lo miramos m\u00e9dicamente, es un chequeo de salud regular. Si lo relacionamos con el autom\u00f3vil, es como el mantenimiento. Haces el mantenimiento del coche cada seis meses o un a\u00f1o, dependiendo de la marca. \u00bfPero haces mantenimiento para tu base de datos? Es decir, \u00bfrealizas investigaciones profundas regularmente? Se debe hacer. Si haces copias de seguridad, tambi\u00e9n haz el checkup, es igualmente importante.<\/p>\n<p><\/p>\n<p>Y tenemos una herramienta as\u00ed. Comenz\u00f3 a desarrollarse activamente hace solo tres meses. Es a\u00fan joven, pero ya tiene muchas caracter\u00edsticas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/514d00b5cb710a7997af0a5dde55b5a8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Recopilamos los grupos de consultas m\u00e1s \"influyentes\" - informe K003 en Postgres-checkup<\/p>\n<p><\/p>\n<p>Y all\u00ed hay un grupo de informes K. Por ahora, hay tres informes. Y hay un informe K003. All\u00ed se encuentra la parte superior de pg_stat_statements, ordenada por total_time.<\/p>\n<p><\/p>\n<p>Cuando ordenamos los grupos de consultas por total_time, en la parte superior vemos un grupo que carga nuestra sistema de la manera m\u00e1s intensa, es decir, consume m\u00e1s recursos. \u00bfPor qu\u00e9 llamo grupos de consultas? Porque hemos eliminado los par\u00e1metros. Esto ya no son consultas, sino grupos de consultas, es decir, est\u00e1n abstra\u00eddos.<\/p>\n<p><\/p>\n<p>Y si optimizamos de arriba hacia abajo, facilitamos nuestros recursos y retrasamos el momento en que necesitaremos hacer una actualizaci\u00f3n. Esta es una muy buena forma de ahorrar dinero.<\/p>\n<p><\/p>\n<p>Puede que no sea la mejor forma en t\u00e9rminos de atenci\u00f3n al usuario, porque tal vez no veamos casos raros, pero muy molestos, en los que una persona esper\u00f3 15 segundos. En total, estos son tan raros que no los vemos, pero estamos tratando con los recursos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d16abc423573e4d923b0c03683c2efee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 ocurri\u00f3 en esta tabla? Hicimos dos instant\u00e1neas. Postgres_checkup te har\u00e1 una delta por cada m\u00e9trica: por total-time, calls, rows, shared_blks_read, etc. Todo, ha calculado la delta. El gran problema de pg_stat_statements es que no recuerda cu\u00e1ndo se reinici\u00f3. Si pg_stat_database recuerda, pg_stat_statements no. Ves que hay un n\u00famero de 1,000,000, pero no sabemos de d\u00f3nde se calcul\u00f3.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c370bf1237675e03c0a3d362c025ac24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqu\u00ed sabemos, tenemos dos instant\u00e1neas. Sabemos que la delta en este caso fue de 56 segundos. Un intervalo muy peque\u00f1o. Se orden\u00f3 por total_time. Y luego podemos diferenciar, es decir, dividimos todas las m\u00e9tricas por duration. Si dividimos cada m\u00e9trica por duration, obtendremos el n\u00famero de llamadas por segundo.<\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, total_time por segundo \u2013 esta es mi m\u00e9trica favorita. Se mide en segundos, por segundo, es decir, cu\u00e1ntos segundos le tom\u00f3 a nuestro sistema ejecutar este grupo de consultas por segundo. Si ves m\u00e1s de un segundo por segundo, significa que necesitabas m\u00e1s de un n\u00facleo. Esta es una muy buena m\u00e9trica. Puedes entender que esta persona, por ejemplo, necesita un m\u00ednimo de tres n\u00facleos.<\/p>\n<p><\/p>\n<p>Esa es nuestra novedad, no he visto algo as\u00ed en ninguna parte. F\u00edjate \u2013 es algo muy simple \u2013 un segundo por segundo. A veces, cuando tienes CPU al 100%, son media hora por segundo, es decir, estuviste media hora solo con estas consultas. <\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, vemos filas por segundo. Sabemos cu\u00e1ntas filas por segundo se devolvieron.<\/p>\n<p><\/p>\n<p>Y despu\u00e9s tambi\u00e9n hay algo interesante. Cu\u00e1ntos shared_buffers le\u00edmos por segundo desde los propios shared_buffers. Ya hubo aciertos all\u00ed, y las filas las tomamos del cach\u00e9 del sistema operativo o del disco. La primera opci\u00f3n es r\u00e1pida, y la segunda puede ser r\u00e1pida o no, dependiendo de la situaci\u00f3n. <\/p>\n<p><\/p>\n<p>Y la segunda forma de diferenciaci\u00f3n es dividir la cantidad de consultas en este grupo. En la segunda columna siempre habr\u00e1 una consulta dividida por la consulta. Y luego es interesante saber cu\u00e1ntos milisegundos tom\u00f3 esta consulta. Sabemos c\u00f3mo se comporta esta consulta en promedio. Requer\u00eda 101 milisegundos en cada solicitud. Esta es una m\u00e9trica tradicional que necesitamos para entender.<\/p>\n<p><\/p>\n<p>Cu\u00e1ntas filas devolvi\u00f3 cada consulta en promedio. Vemos que este grupo devuelve 8. Cu\u00e1ntas se tomaron y leyeron del cach\u00e9 en promedio. Vemos que todo est\u00e1 cacheado de maravilla. Son solo aciertos para el primer grupo. <\/p>\n<p><\/p>\n<p>Y la cuarta subcadena en cada fila es cu\u00e1ntos por cientos del total. Tenemos llamadas, supongamos, en 1,000,000. Y podemos entender qu\u00e9 contribuci\u00f3n hace este grupo. Vemos que en este caso, el primer grupo contribuye con menos del 0.01%. Es tan lento que no lo vemos en el panorama general. Y el segundo grupo \u2013 5% en las llamadas. Es decir, el 5% de todas las llamadas son del segundo grupo. <\/p>\n<p><\/p>\n<p>Tambi\u00e9n es interesante en cuanto a total_time. En el primer grupo de consultas gastamos el 14% de todo el tiempo de trabajo. En el segundo, el 11%, etc. <\/p>\n<p><\/p>\n<p>No profundizar\u00e9 en los detalles, pero hay sutilezas. Aqu\u00ed mostramos un error porque, al comparar, los snapshots pueden variar, es decir, algunas consultas pueden caer y no estar presentes en el segundo, mientras que otras pueden aparecer nuevas. Y all\u00ed calculamos el error. Si ves 0, eso es bueno. No hay errores. Si la tasa de error es del 20%, est\u00e1 bien. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/327bbf167bc21d37a3e1597b52528e6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, volvemos a nuestro tema. Necesitamos elaborar la carga de trabajo. Vamos de arriba hacia abajo, hasta que alcancemos el 80% o 90%. Normalmente son de 10 a 20 grupos. Y hacemos archivos para pgbench. All\u00ed usamos el aleatorio. A veces, desafortunadamente, eso no funciona. Y en Postgres 12 habr\u00e1 m\u00e1s oportunidades para usar ese enfoque. <\/p>\n<p><\/p>\n<p>Y as\u00ed es como alcanzamos el 80-90 % del total_time. \u00bfQu\u00e9 debemos poner despu\u00e9s de \u00ab@\u00bb? Observamos las llamadas, vemos cu\u00e1ntos porcentajes y entendemos que aqu\u00ed debemos tener cierto porcentaje. A partir de estos porcentajes, podemos determinar c\u00f3mo equilibrar cada uno de los archivos. Despu\u00e9s de eso, usamos pgbench y comenzamos a trabajar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/53edf787f49dcabb5e4731510839332d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tambi\u00e9n tenemos K001 y K002. <\/p>\n<p><\/p>\n<p>K001 es una cadena grande con cuatro subcadenas. Esta es la caracter\u00edstica de nuestra carga total. Mire la segunda columna y la segunda subcadena. Vemos que son aproximadamente una y media segundos por segundo, es decir, si tuvi\u00e9ramos dos n\u00facleos, estar\u00eda bien. Habr\u00e1 aproximadamente un 75 % de carga. Y funcionar\u00e1 as\u00ed. Si tuvi\u00e9ramos 10 n\u00facleos, estar\u00edamos completamente tranquilos. De esta manera, podemos evaluar los recursos.<\/p>\n<p><\/p>\n<p>K002 \u2013 es lo que llamo clases de consultas, es decir, SELECT, INSERT, UPDATE, DELETE. Y por separado SELECT FOR UPDATE, porque bloquea. <\/p>\n<p><\/p>\n<p>Y aqu\u00ed podemos concluir que los SELECT normales \u2013 82 % de todas las llamadas, pero a la vez \u2013 74 % del total_time. Es decir, se llaman muchas veces, pero consumen menos recursos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/0e0234e696ffe1c80f8b5acccc602dbd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y volvamos a la pregunta: \u00ab\u00bfC\u00f3mo ajustamos correctamente el shared_buffers?\u00bb. Observo que la mayor\u00eda de los benchmarks se basan en la idea de \u2013 veamos qu\u00e9 throughput habr\u00e1, es decir, cu\u00e1l ser\u00e1 la capacidad de procesamiento. Generalmente se mide en TPS o QPS.<\/p>\n<p><\/p>\n<p>Y tratamos de exprimir de la m\u00e1quina, a trav\u00e9s de par\u00e1metros de ajuste, la mayor cantidad de transacciones por segundo. Aqu\u00ed hay justo 311 por segundo para SELECT.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/d5e73f2672d94bb92eed921ef3dfe0b7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero nadie conduce al trabajo y de regreso a casa en su autom\u00f3vil a toda velocidad. Eso es absurdo. Lo mismo ocurre con las bases de datos. No debemos ir a m\u00e1xima velocidad, y nadie lo hace. Nadie vive en producci\u00f3n con 100 % de CPU. Aunque, puede que alguien lo haga, pero no es bueno. <\/p>\n<p><\/p>\n<p>La idea es que normalmente funcionamos al 20 % de la capacidad, idealmente no m\u00e1s del 50 %. Y nos esforzamos por optimizar el tiempo de respuesta para nuestros usuarios en primer lugar. Es decir, debemos ajustar nuestras configuraciones para tener la latencia m\u00ednima a una velocidad del 20 %, de forma condicional. Esta es una idea que tambi\u00e9n tratamos de aplicar en nuestros experimentos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/c32c2cfb76dce0ce6b50e929bbf914ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y para concluir recomendaciones: <\/p>\n<p><\/p>\n<ul>\n<li>Aseg\u00farese de hacer un Database Lab.<\/li>\n<li>Si es posible, haga que sea on demand, para que se despliegue por un tiempo \u2013 juegue y luego lo elimine. Si tiene nubes, esto es natural, es decir, tenga muchos standing. <\/li>\n<li>S\u00e9 curioso. Y si algo no est\u00e1 bien, haz experimentos para comprobar c\u00f3mo se comporta. Puedes usar Nancy para formarte y verificar c\u00f3mo funciona la base.<\/li>\n<li>Y apunta a un tiempo de respuesta m\u00ednimo. <\/li>\n<li>Y no temas a los c\u00f3digos fuente de Postgres. Cuando trabajas con los fuentes, debes saber ingl\u00e9s. Hay muchos comentarios, todo est\u00e1 explicado all\u00ed. <\/li>\n<li>Y verifica la salud de la base de manera regular, al menos una vez cada tres meses manualmente o con Postgres-checkup. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/8d2ac05f44bd245b879799862ce9e233.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Preguntas<\/p>\n<p><\/p>\n<p><em>\u00a1Muchas gracias! Es una cosa muy interesante.<\/em> <\/p>\n<p><\/p>\n<p>Dos cosas.<\/p>\n<p><\/p>\n<p><em>S\u00ed, dos cosas. Solo que no entend\u00ed del todo. Cuando trabajamos con Nancy, \u00bfpodemos ajustar solo un par\u00e1metro o todo un grupo?<\/em><\/p>\n<p><\/p>\n<p>Tenemos el par\u00e1metro de configuraci\u00f3n delta. Puedes ajustar tantos como quieras al mismo tiempo. Pero hay que entender que, si modificas muchas cosas, puedes llegar a conclusiones err\u00f3neas. <\/p>\n<p><\/p>\n<p><em>S\u00ed. \u00bfPor qu\u00e9 lo pregunt\u00e9? Porque es dif\u00edcil realizar experimentos cuando solo tienes un par\u00e1metro. Ajustas uno, miras c\u00f3mo funciona. Lo estableces. Luego comienzas con el siguiente.<\/em><\/p>\n<p><\/p>\n<p>Se puede ajustar simult\u00e1neamente, pero depende de la situaci\u00f3n, por supuesto. Pero es mejor probar una idea a la vez. Ayer tuvimos una idea. Ten\u00edamos una situaci\u00f3n muy similar. Hab\u00eda dos configuraciones. Y no pod\u00edamos entender por qu\u00e9 hab\u00eda tanta diferencia. Y surgi\u00f3 la idea de que necesit\u00e1bamos usar dicotom\u00eda para entender secuencialmente y encontrar cu\u00e1l era la diferencia. Puedes hacer la mitad de los par\u00e1metros iguales, luego una cuarta parte, etc. Todo es flexible.<\/p>\n<p><\/p>\n<p><em>Y tengo otra pregunta. El proyecto es joven, est\u00e1 en desarrollo. \u00bfLa documentaci\u00f3n ya est\u00e1 lista, hay una descripci\u00f3n detallada?<\/em><\/p>\n<p><\/p>\n<p>Hice un enlace a la descripci\u00f3n de los par\u00e1metros. Eso existe. Pero a\u00fan falta mucho. Busco personas afines. Y las encuentro cuando hablo. Es muy genial. Algunas personas ya est\u00e1n trabajando conmigo, algunas ayudaron y hicieron algo. Y si te interesa este tema, dame tu opini\u00f3n: \u00bfqu\u00e9 falta? <\/p>\n<p><\/p>\n<p><em>Cuando tengamos el laboratorio, tal vez habr\u00e1 retroalimentaci\u00f3n. Veremos. \u00a1Gracias!<\/em><\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Vi que hay soporte para Amazon. \u00bfEst\u00e1 planeado el soporte para GSP?<\/em><\/p>\n<p><\/p>\n<p>Buena pregunta. Hemos comenzado a trabajar en ello. Y mientras tanto, lo hemos congelado porque queremos ahorrar. Es decir, hay soporte a trav\u00e9s de la ejecuci\u00f3n en localhost. Puedes crear tu propia instancia y trabajar localmente. Por cierto, as\u00ed lo hacemos. En Getlab lo hago as\u00ed, all\u00ed en GSP. Pero no vemos sentido en hacer exactamente esa orquestaci\u00f3n por ahora, porque Google no tiene instancias de spot baratas. Hay instancias ???, pero tienen limitaciones. Primero, siempre tienen un descuento del 70 % y no se puede jugar con el precio. En los spots aumentamos el precio entre un 5 y un 10 % para reducir la probabilidad de que te eliminen. Es decir, ahorras en los spots, pero te pueden quitar en cualquier momento. Si estableces tu precio un poco m\u00e1s alto que el de los dem\u00e1s, ser\u00e1s eliminado m\u00e1s tarde. Google tiene una especificidad totalmente diferente. Y hay otra limitaci\u00f3n muy desagradable: solo viven 24 horas. Y a veces queremos ejecutar un experimento durante 5 d\u00edas. Pero en los spots eso se puede hacer, a veces viven meses. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Mencionaste el checkup. \u00bfC\u00f3mo calculas los errores de stat_statements?<\/em><\/p>\n<p><\/p>\n<p>Muy buena pregunta. Puedo mostrar y explicar esto en detalle. En resumen: observamos c\u00f3mo ha variado un conjunto de grupos de consultas: cu\u00e1ntas se han eliminado y cu\u00e1ntas nuevas han aparecido. Luego miramos dos m\u00e9tricas: total_time y calls, por lo que ah\u00ed hay dos errores. Y vemos cu\u00e1l es la contribuci\u00f3n de los grupos que han variado. Hay dos subgrupos: el que se ha ido y el que ha llegado. Observamos cu\u00e1l es su contribuci\u00f3n al panorama general. <\/p>\n<p><\/p>\n<p><em>\u00bfNo temes que se vuelva a procesar dos o tres veces entre los snapshots?<\/em><\/p>\n<p><\/p>\n<p>Es decir, \u00bfse registraron de nuevo o c\u00f3mo?<\/p>\n<p><\/p>\n<p><em>Por ejemplo, esta consulta ya fue eliminada una vez, luego lleg\u00f3 y nuevamente fue eliminada, y volvi\u00f3 a llegar y de nuevo fue eliminada. Y aqu\u00ed has calculado algo, \u00bfy d\u00f3nde est\u00e1 todo esto?<\/em><\/p>\n<p><\/p>\n<p>Buena pregunta, hay que observar. <\/p>\n<p><\/p>\n<p><em>Hice algo similar. Por supuesto, fue m\u00e1s simple, lo hice solo. Pero tuve que resetear stat_statements y orientarme en el momento del snapshot, asegur\u00e1ndome de que hubiera menos de cierta proporci\u00f3n, que a\u00fan no hab\u00eda llegado al l\u00edmite de cu\u00e1ntos stat_statements puede acumular. Y me oriento en que, probablemente, no se ha eliminado nada.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ed, s\u00ed. <\/p>\n<p><\/p>\n<p><em>Pero no entiendo c\u00f3mo hacerlo de manera confiable de otra forma.<\/em><\/p>\n<p><\/p>\n<p>Lamentablemente, no recuerdo con certeza si usamos el texto de la consulta o queryid de pg_stat_statements y nos basamos en eso. Si nos basamos en queryid, entonces, en teor\u00eda, estamos comparando cosas comparables. <\/p>\n<p><\/p>\n<p><em>No, puede ser reemplazado varias veces entre los snapshots y volver otra vez.<\/em><\/p>\n<p><\/p>\n<p>\u00bfCon este mismo id?<\/p>\n<p><\/p>\n<p><em>S\u00ed.<\/em> <\/p>\n<p><\/p>\n<p>Vamos a estudiarlo. Buena pregunta. Hay que investigar. Pero por ahora, lo que vemos es que tenemos o se escribe un 0...<\/p>\n<p><\/p>\n<p><em>Esto, por supuesto, es un caso raro, pero me sorprendi\u00f3 cuando supe que stat_statements podr\u00eda ser reemplazado.<\/em> <\/p>\n<p><\/p>\n<p>En Pg_stat_statements puede haber muchas cosas. Hemos encontrado que si tienes track_utility = on, entonces tambi\u00e9n se rastrean las sentencias. <\/p>\n<p><\/p>\n<p><em>S\u00ed, claro.<\/em><\/p>\n<p><\/p>\n<p>Y si tienes java hibernate, que es aleatorio, entonces se bloquea la tabla hash. Y tan pronto como apagas una aplicaci\u00f3n muy cargada, tienes de 50 a 100 grupos. Y ah\u00ed todo es m\u00e1s o menos estable. Uno de los m\u00e9todos para combatir esto es aumentar pg_stat_statements.max. <\/p>\n<p><\/p>\n<p><em>S\u00ed, pero hay que saber cu\u00e1nto. Y de alguna manera hay que monitorearlo. As\u00ed lo hago. Es decir, tengo pg_stat_statements.max. Y veo que en el momento del snapshot no he alcanzado el 70%. Bien, eso significa que no hemos perdido nada. Hacemos un reset. Y acumulamos de nuevo. Si en el siguiente snapshot es menos del 70, significa que probablemente no hemos perdido nada otra vez.<\/em><\/p>\n<p><\/p>\n<p>S\u00ed. Por defecto ahora es 5,000. Y a muchos les es suficiente. <\/p>\n<p><\/p>\n<p><em>Normalmente, s\u00ed.<\/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=\"Reproducir video\" 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. Agregar\u00e9 que si en Postgres hay datos confidenciales que no deben ir al entorno de pruebas, se puede utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/labs.dalibo.com\/postgresql_anonymizer\">PostgreSQL Anonymizer<\/a><\/noindex>. El esquema es aproximadamente el siguiente:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos&quot;. Nikolay Samokhvalov\" src=\"\/wp-content\/uploads\/2020\/04\/cf9a2052364e09a20e68d2347dd0c25b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\udd47Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos\u00bb. Nikolay Samokhvalov | ProHoster","description":"Te propongo revisar la transcripci\u00f3n de la presentaci\u00f3n de Nikolay Samokhvalov \"Enfoque industrial para la optimizaci\u00f3n de PostgreSQL: experimentos con bases de datos\" Shared_buffers = 25% \u2013 \u00bfes mucho o poco?","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/78742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=78742"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/78742\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/78743"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=78742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=78742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=78742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}