A veces ejecuto una consulta de Postgres, tarda 30 segundos. Luego, inmediatamente ejecuto la misma consulta y toma 2 segundos. Parece que Postgres tiene algún tipo de almacenamiento en caché. ¿Puedo de alguna manera ver qué contiene ese caché? ¿Puedo forzar que se borren todos los cachés con 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 qué contiene realmente ese búfer.
Gracias por cualquier ayuda.
fuente
No he visto ningún comando para vaciar los cachés en PostgreSQL. Lo que ve es probablemente solo índices normales y cachés de datos que se leen desde el disco y se mantienen en la memoria. tanto por postgresql como por las cachés del sistema operativo. Para deshacerme de todo eso, la única forma que conozco:
Lo que debes hacer es:
sudo service postgresql stop
,sudo systemctl stop postgresql
, etc.)echo 3 > /proc/sys/vm/drop_caches
Esto borrará los cachés de archivos / bloques del sistema operativo, muy importante, aunque no sé cómo hacerlo en otros sistemas operativos. (En caso de denegación del permiso, intentesudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
como en esa pregunta )sudo service postgresql start
,sudo systemctl start postgresql
)fuente
La respuesta de Greg Smith sobre drop_caches fue muy útil. Encontré necesario detener e iniciar el servicio postgresql, además de eliminar las 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 tomó 19 segundos la primera vez y menos de 2 segundos en los intentos posteriores. Después de ejecutar este script, la consulta nuevamente tomó 19 segundos.
fuente
Utilizo este comando en mi caja de Linux:
sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
Elimina por completo el caché.
fuente
postgresql
, lo que puede no ser el caso.sync
debería hacerse después de detener el servidor, inmediatamente antesdrop_caches
, ya que Postgres puede escribir algo durante el proceso de detención nuevamente.Sí, postgresql ciertamente tiene almacenamiento en caché. El tamaño está controlado por la configuración shared_buffers . Aparte de eso, existe, como menciona la respuesta anterior, el caché de archivos del sistema operativo que también se usa.
Si desea ver qué hay en el caché, hay un módulo contrib llamado pg_buffercache disponible (en contrib / en el árbol de fuentes, 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 la memoria caché del búfer, salvo reiniciar el servidor. Puede eliminar el caché del sistema operativo con el comando mencionado en la otra respuesta, siempre que su sistema operativo sea Linux.
fuente
Tuve este error.
Estaba buscando vaciar el plan actual y encontré esto:
DESECHAR PLANES
Tenía esto entre mis inserciones y resuelve mi problema.
fuente
DISCARD PLANS;
. Y, como dice la documentación: "DISCARD libera recursos internos asociados con una sesión de base de datos ".Sí, es posible borrar los búferes compartidos de la caché de postgres Y la caché del sistema operativo. La siguiente solución es para Windows ... otros ya han dado la solución de Linux.
Como ya han dicho muchas personas, para borrar los búferes compartidos, puede simplemente reiniciar Postgres (no es necesario reiniciar el servidor). Pero simplemente hacer esto no borrará el 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 Sysinternals Suite. Una vez que ejecute RamMap, simplemente haga clic en "Vaciar" -> "Lista de espera vacía" en el menú principal.
Reinicie Postgres y verá que su próxima consulta será muy lenta debido a que no hay caché en absoluto.
También puede ejecutar RamMap sin cerrar Postgres, y probablemente obtendrá los resultados "sin caché" que desea, ya que, como ya se ha dicho, los búferes compartidos suelen tener poco impacto en comparación con el caché del sistema operativo. Pero para una prueba confiable, prefiero detener postgres como todo antes de borrar la caché del sistema operativo para asegurarme.
Nota: AFAIK, no recomiendo borrar las otras cosas además de "Lista de espera" cuando se usa RamMap, porque los otros datos se están usando de alguna manera, y puede causar problemas / perder datos 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.
fuente
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;
fuente
Hay un
pg_buffercache
módulo para buscar en elshared_buffers
caché. Y en algún momento necesité eliminar 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.fuente