optimization - tunear - tuning postgresql 10
Ver y borrar cachés/búferes de Postgres? (9)
A veces ejecuto una consulta de Postgres, demora 30 segundos. Luego, ejecuto inmediatamente la misma consulta y demora 2 segundos. Parece que Postgres tiene algún tipo de almacenamiento en caché. ¿De alguna manera puedo ver qué contiene ese caché? ¿Puedo forzar que se eliminen todas las memorias caché para fines de ajuste?
Nota: Básicamente, estoy buscando una versión de Postgres del siguiente comando de SQL Server:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Pero también me gustaría saber cómo ver lo que realmente está contenido en ese buffer.
Gracias por cualquier ayuda.
Hay pg_buffercache
módulo pg_buffercache
para buscar en el caché shared_buffers
. Y en algún momento tuve que soltar el caché para realizar algunas pruebas de rendimiento en el caché "frío", así que escribí una extensión pg_dropcache que hace exactamente esto. Por favor, míralo.
La respuesta de Greg Smith sobre drop_caches fue muy útil. Me pareció necesario detener e iniciar el servicio postgresql, además de descartar los cachés. Aquí hay un script de shell que hace el truco. (Mi entorno es Ubuntu 14.04 y PostgreSQL 9.3.)
#!/usr/bin/sudo bash
service postgresql stop
sync
echo 3 > /proc/sys/vm/drop_caches
service postgresql start
Probé con una consulta que tardó 19 segundos la primera vez y menos de 2 segundos en intentos posteriores. Después de ejecutar este script, la consulta una vez más tomó 19 segundos.
No he visto ningún comando para eliminar las cachés en PostgreSQL. Lo que ve es probable que solo el índice normal y los cachés de datos se lean desde el disco y se guarden en la memoria. por ambos postgresql y los cachés en el SO. Para deshacerse de todo eso, la única forma que conozco:
Lo que debes hacer es:
- Cierre el servidor de la base de datos (pg_ctl, sudo service postgresql stop, etc.)
- echo 3> / proc / sys / vm / drop_caches Esto eliminará las cachés de archivos / bloques del sistema operativo, algo muy importante, aunque no sé cómo hacerlo en otros sistemas operativos.
- Comience el servidor de base de datos
Puede ver lo que hay en la memoria caché del búfer PostgreSQL utilizando el módulo pg_buffercache. Hice una presentación llamada " Dentro de la memoria caché de búfer de PostgreSQL " que explica lo que está viendo, y le muestro algunas consultas más complicadas para ayudar a interpretar esa información que va con eso.
También es posible observar la memoria caché del sistema operativo en algunos sistemas, consulte pg_osmem.py para obtener un ejemplo bastante aproximado.
No hay forma de borrar los cachés fácilmente. En Linux, puede detener el servidor de la base de datos y usar la función drop_caches para borrar el caché del sistema operativo; asegúrese de prestar atención a la advertencia allí para ejecutar la sincronización primero.
Sí, es posible borrar los búferes compartidos postgres cache Y el caché del sistema operativo. La solución a continuación es para Windows ... otros ya han dado la solución de Linux.
Como mucha gente ya dijo, para borrar los búferes compartidos, simplemente puede reiniciar Postgres (no es necesario reiniciar el servidor). Pero hacer esto no borrará la memoria caché del sistema operativo.
Para borrar el caché del sistema operativo utilizado por Postgres, después de detener el servicio, utilice el excelente RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ), de la excelente Suite Sysinternals. Una vez que ejecutas RamMap, simplemente haz clic en "Vaciar" -> "Vaciar lista de espera" en el menú principal.
Reinicie Postgres y verá que su próxima consulta será demasiado lenta debido a que no tiene memoria caché.
También puede ejecutar RamMap sin cerrar Postgres, y probablemente tendrá los resultados de "sin caché" que desee, ya que, como ya se dijo, los almacenamientos intermedios compartidos generalmente tienen poco impacto en comparación con el caché del sistema operativo. Pero para una prueba confiable, prefiero dejar postgres como todo antes de borrar el caché del sistema operativo para estar seguro.
Nota: AFAIK, no recomiendo borrar otras cosas además de la "lista de espera" cuando se usa RamMap, porque los otros datos se están usando de alguna manera, y puede potencialmente causar problemas / datos sueltos si lo hace. Recuerde que está borrando la memoria no solo utilizada por los archivos de Postgres, sino también por cualquier otra aplicación y sistema operativo.
Saludos, Thiago L.
Sí, postgresql ciertamente tiene almacenamiento en caché. El tamaño está controlado por la configuración shared_buffers . Aparte de eso, hay como la respuesta anterior menciona, el caché de archivos del sistema operativo que también se utiliza.
Si desea ver lo que hay en la memoria caché, hay un módulo contrib llamado pg_buffercache disponible (en contrib / en el árbol fuente, en el RPM contrib, o donde sea apropiado para cómo lo instaló). Cómo usarlo se enumera en la documentación estándar de PostgreSQL.
No hay formas de borrar el caché del búfer, que no sea para reiniciar el servidor. Puede soltar el caché del sistema operativo con el comando mencionado en la otra respuesta, siempre que su sistema operativo sea Linux.
Tuve este error.
psql: /cygdrive/e/test_insertion.sql: 9: ERROR: el tipo del parámetro 53 (t_stat_gardien) no coincide con eso cuando se prepara el plan (t_stat_avant)
Estaba buscando enjuagar el plan actual y encontré esto:
Tuve esto entre mis insertos y solucionó mi problema.
Yo uso este comando en mi cuadro de Linux:
sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
Se deshace completamente de la memoria caché.
este es mi atajo
echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start;