Postgresql y update muy lentos (cuando hay alta carga)
Este es un mini post, para tenerlo a mano y que alguno que busque lo encuentre. Postgresql en los escenarios que la he probado, ha resultado más lenta que MySQL usando MyISAM e InnoDB. Por supuesto esto con la configuración que trae de base en una instalación Debian, Ubuntu o con el instalador (con perfiles) en Windows. O modificándole muy pocos parámetros.
Hace un tiempo ya que para un trabajo que estamos haciendo buscábamos la forma de acelerar los updates en Postgres. No es que fuera algo intolerable, pero a veces necesitabamos correr varias consultas que actualizaban unos 2M registros en base a si cumplían o no unas 40 expresiones regulares bastante complejas.
Bueno, me dirán, por qué no usaste MySQL entonces. Bueno, porque no je. En realidad porque en cuanto a extensibilidad usando los lenguajes en Postgres (plpythonu, plpgsql,plphp y quizá pljava) teníamos más flexibilidad. Tenía mejores capacidades de gestión de expresiones regulares y posibilidad de usar tipos de datos vectores (para los matching de las reg. exp.).
El post corto se está alargando y me voy a explayar en otros. Lo que intentamos fue meter commits entre medio de los updates, pero de nada servía. Incluso encerrar en una transacción varios updates. Tampoco.
Leyendo encontré que tiene que ver en la performance de PgSQL las copias que se genera de cada tabla que se está accediendo para mantener consistencia en cuanto a las consultas d ediferentes usuarios. Los checkpoints que va haciendo en el log (log de transacciones, no el log de errores) del sistema son los que estaban afectando. En definitiva aumentando el tamaño de los segmentos de los checkpoints debería haber una mejora en performance.
Este parámetro se cambia en
/etc/postgresql/8.3/main/postgresql.conf
checkpoint_segments = 256
Si hubiese mirado el log (avisos y errores) de PgSQL quizá me hubiese dado cuenta. Se la pasaba imprimiendo:
2009-02-10 11:23:09 ARST LOG: los checkpoints están ocurriendo con demasiada frecuencia (cada 2 segundos)
2009-02-10 11:23:09 ARST HINT: Considere incrementar el parámetro de configuración «checkpoint_segments».
Prometo en otro post contar los resultados y ordenar esto.
Fuentes:
http://pugs.postgresql.org/node/499
http://www.linux-es.org/node/660
Por qué: http://www.network-theory.co.uk/docs/postgresql/vol1/Increasecheckpoint_segments.html
http://archives.postgresql.org/pgsql-performance/2008-06/msg00119.php