2009-08-01 23 views
55

A veces ejecuto una consulta de Postgres que 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?¿Ves y borras las memorias caché/búferes de Postgres?

Nota: básicamente estoy buscando una versión de postgres el siguiente comando SQL Server:


DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 

Pero también me gustaría saber ver lo que realmente está contenida en ese búfer.

Gracias por cualquier ayuda.

Respuesta

43

Se puede ver lo que hay en el buffer cache PostgreSQL usando el módulo pg_buffercache. Hice una presentación llamada "Inside the PostgreSQL Buffer Cache" 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 mirar a la caché del sistema operativo también en algunos sistemas, consulte pg_osmem.py por un ejemplo un tanto áspera.

No hay manera de borrar las memorias caché fácilmente. En Linux puede detener el servidor de la base de datos y usar el recurso 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.

+14

¿Es posible omitir el almacenamiento en caché en una sola sesión?A menudo necesitamos pruebas de rendimiento diferentes consultas y este almacenamiento en caché hace que sea muy difícil evaluar si un método es mejor que otro (excepto cuando se compara el rendimiento en caché!) – EvilPuppetMaster

+0

Gracias, pero ¿hay un comando SQL Postgres que vacía el caché? –

+4

No hay forma de eludir o vaciar el caché de la base de datos. Todo lo que puede hacer para borrarlo es reiniciar el servidor. –

16

no he visto ningún comando para vaciar 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 debe hacer es:

  1. Apagar el servidor de base de datos (pg_ctl, sudo parada de servicio de PostgreSQL, etc.)
  2. eco 3>/proc/sys/vm/drop_caches Esto borrará las cachés de archivos/bloques del sistema operativo, algo muy importante, aunque no sé cómo hacerlo en otros sistemas operativos.
  3. iniciar el servidor de base de datos
+1

pensó que sería útil tener en cuenta: si Postgres' directorio de datos no está en el mismo volumen que '/' está montado en, puede que tenga que desmontar antes/después de la operación anterior (no estoy seguro de qué, realmente). Además (tal vez un poco de vudú) intente ejecutar 'sincronización' antes y después de esos pasos. – marqueed

5

Sí, PostgreSQL sin duda tiene el 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 quieres ver lo que hay en la memoria caché, hay un módulo contrib llamada pg_buffercache disponible (en contrib/del árbol de origen, en el RPM contrib, o donde sea apropiado para la forma en que lo ha instalado). Cómo usarlo se enumera en la documentación estándar de PostgreSQL.

No hay maneras de limpiar la caché del búfer, excepto 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.

11

que utiliza este comando en mi máquina Linux:

sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start 

Es completamente se deshace de la memoria caché.

+2

Si la versión de Postgresql no es 9.0: sincronización; sudo service postgresql stop; echo 1>/proc/sys/vm/drop_caches; sudo service postgresql start – rusllonrails

+0

@rusllonrails Eso solo funcionará si el servicio se llama 'postgresql', que puede no ser el caso. – jpmc26

6

Tuve este error.

psql:/cygdrive/e/test_insertion.sql:9: ERROR: type of parameter 53 (t_stat_gardien) does not match that when preparing the plan (t_stat_avant)

que estaba buscando para el lavado del plan actual y encontré esto:

DISCARD PLAN

Tenía esta entre mis inserciones y resuelve mi problema.

6

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.

3

este es mi método abreviado

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; 
3

Hay pg_buffercache módulo de mirar en shared_buffers caché. Y en algún momento necesité 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.

3

Sí, es posible borrar los búferes compartidos postgres caché Y la memoria 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 ha dicho, para borrar los búferes compartidos, puede reiniciar Postgres (no es necesario reiniciar el servidor). Pero hacer esto no borrará la memoria caché del sistema operativo.

Para borrar la caché del sistema operativo utilizado por Postgres, después de suspender el servicio, utilice el excelente RamMap (https://technet.microsoft.com/en-us/sysinternals/rammap), del excelente Sysinternals Suite. Una vez que ejecuta RamMap, simplemente haga clic en "Vaciar" -> "Vaciar lista de espera" en el menú principal.

Reinicie Postgres y verá que su próxima consulta será muy lenta debido a que no tiene memoria caché.

También puede ejecutar el RamMap sin cerrar Postgres, y probablemente tenga los resultados "sin caché" que desee, ya que como ya se dijo, los búferes 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 están siendo utilizados de alguna manera, y puede 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.

+0

¡Esto funcionó para el caso de Windows! Gracias. – olivmir

+0

Me alegro de que haya ayudado;) –

Cuestiones relacionadas