Escolar Documentos
Profissional Documentos
Cultura Documentos
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
PostgreSQL: heavyweight locks, lwlocks, deadlocks, spinlocks, pg_locks, row locks ... slvese quien pueda!
lvaro Herrera Command Prompt, Inc. alvherre@commandprompt.com
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Introduccin
Esta charla es sobre locks su implementacin bloqueos en aplicaciones? WTF: locks sobre registros WTF: locks sobre transacciones
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Introduccin
Esta charla es sobre locks su implementacin bloqueos en aplicaciones? WTF: locks sobre registros WTF: locks sobre transacciones Esta charla NO es sobre MVCC Para eso, vaya a la de Bruce Momjian, que adems tiene traduccin simultnea
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Introduccin
Esta charla es sobre locks su implementacin bloqueos en aplicaciones? WTF: locks sobre registros WTF: locks sobre transacciones Esta charla NO es sobre MVCC Clusters, replicacin, sharding, ...
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Locks en PostgreSQL
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Spinlocks
Mecanismo bsico: spinlocks objetos muy livianos rpida adquisicin (de no haber contencin) la CPU queda ocupada esperando hasta obtener el lock, si est ocupado
busy waiting en estricto rigor signica espera activa busy waiting normalmente es malo: la CPU queda ocupada
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Spinlocks en PostgreSQL
Implementacin en Postgres: macros TAS (test-and-set) y SPIN_DELAY (especie de pausa) TAS es un mecanismo atmico (incluso en multiprocesadores) cdigo especco en assembly para cada plataforma/compilador src/include/storage/s_lock.h src/backend/storage/s_lock.c src/backend/storage/spin.c
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Parntesis: Deadlocks
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Deadlocks
es fundamental evitar deadlocks o corregirlos corregir (detectar) un deadlock es costoso. Lo veremos ms adelante evitar deadlocks es responsabilidad del programador inventar reglas de manera que la situacin nunca se produzca
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Deadlocks y Spinlocks
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Usuarios de spinlocks
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
LWLocks
LWLock: lightweight locks Mecanismo intermedio entre heavyweight locks y spinlocks ms capaces que spinlocks
dos modos de adquisicin: compartido (candado de slo lectura, ms de un proceso simultneamente) exclusivo (candado de escritura)
para proteger acceso a informacin de control almacenada en memoria compartida No hay deteccin de deadlocks
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
LWLocks (2)
Para adquirir un LWLock: adquirir su spinlock si el lwlock est libre: tomarlo si el lwlock est ocupado: ponerme a dormir (semforo SysV) liberar spinlock Al liberar un LWLock: adquirir el spinlock si hay alguien durmiendo en este lwlock (puede ser ms de uno), despertarlo liberar el spinlock
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
LWLocks (2)
Para adquirir un LWLock: adquirir su spinlock si el lwlock est libre: tomarlo si el lwlock est ocupado: ponerme a dormir (semforo SysV) liberar spinlock Al liberar un LWLock: adquirir el spinlock si hay alguien durmiendo en este lwlock (puede ser ms de uno), despertarlo liberar el spinlock
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
LWLocks (3)
Es responsabilidad del Postgreshacker asegurarse que no hay posibilidad de deadlock La regla: si se adquiere ms de uno, debe ser siempre en el mismo orden Tomar ms de dos es muy raro Todo esto requiere cuidadoso anlisis por parte del PGhacker
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
LWLocks (4)
Muchas operaciones regulares se protegen con LWLocks
escribir en WAL (WALInsertLock, WALWriteLock) generar un OID o un XID (OidGenLock, XidGenLock) examinar o modicar el contenido de ProcArray, la cola shared-inval, pg_clog, etc. examinar el contenido (datos) de un buffer (content_lock en BufferDesc)
En resumen: toda estructura ja (predenida) en memoria compartida Otra regla: un lwlocks slo debe mantenerse bloqueado por perodos muy cortos de tiempo
es decir: no realizar I/O con un lwlock bloqueado
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Heavyweight locks
Bloqueos sobre objetos de usuario (src/backend/storage/lmgr/lmgr.c) Estos son los realmente interesantes para la aplicacin
relacin (tabla, secuencia, vista, etc) extender (agrandar) una relacin pgina de una relacin tupla (registro, la) de una relacin transaccin transaccin virtual objeto (cualquier cosa que no sea una relacin) advisory
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Modos de adquisicin
AccessShare (SELECT) RowShare (SELECT FOR UPDATE, SELECT FOR SHARE) RowExclusive (UPDATE, INSERT, DELETE, etc) ShareUpdateExclusive (VACUUM, ANALYZE, CREATE INDEX
CONCURRENTLY)
Share (CREATE INDEX) ShareRowExclusive (no utilizado por el cdigo) Exclusive (no utilizado por el cdigo, excepto para bloquear ciertos catlogos en
ocasiones)
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Tabla de conictos
RS
RE
SUE
SRE
E X X X X X X X
X X
X X X X
X X X X X
X X X X X
X X X X X X
AE X X X X X X X X
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Deadlocks
Este tipo de locks es el nico que tiene deteccin de deadlocks (src/backend/storage/lmgr/deadlock.c) El sistema espera la obtencin del lock durante 1s Si despus de este tiempo no se ha obtenido el lock, el detector de deadlocks es ejecutado (deadlock.c) El detector de deadlocks recorre el grafo de waiterholder y determina si existe un ciclo en el grafo De existir un ciclo, signica que hay un deadlock El proceso que detecta primero el deadlock aborta su propia transaccin El grafo puede ser arbitrariamente complejo En trminos de aplicacin: todo cdigo que est posiblemente sujeto a deadlocks debera tener un bucle de reintento
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Cada transaccin tiene asociado un virtualxid desde el momento en que se inicia Cada transaccin obtiene un Xid al momento de hacer su primera escritura Cada transaccin adquiere ExclusiveLock en su Xid y vxid Se libera automticamente cuando termina Cuando una transaccin quiere esperar que otra termine, trata de obtener un ShareLock en ese Xid o vxid
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pg_locks ejemplo
alvherre=# select * from pg_locks where not granted; Record 1 locktype relation database 16384 relation 16398 page (null) (null) tuple virtualxid (null) transactionid (null) classid (null) objid (null) (null) objsubid virtualtransaction 3/2 pid 30786 mode AccessShareLock granted f f fastpath
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pg_locks ejemplo
alvherre=# select * from pg_locks where locktype = relation and database = 16384 and relation = 16398 and granted; Record 1 locktype relation database 16384 16398 relation page (null) tuple (null) virtualxid (null) (null) transactionid classid (null) objid (null) (null) objsubid virtualtransaction 2/3 pid 30778 mode AccessExclusiveLock granted t pgbr 2011 fastpath f
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pg_locks ejemplo
Record 1 locktype relation database 16384 16398 relation page (null) tuple (null) virtualxid (null) transactionid (null) classid (null) objid (null) objsubid (null) virtualtransaction 2/3 pid 30778 AccessExclusiveLock mode granted t fastpath f
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
relation
database relation page tuple virtualxid transactionid classid objid objsubid
Lock a relation
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
extend
database relation page tuple virtualxid transactionid classid objid objsubid
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
page
database relation page tuple virtualxid transactionid classid objid objsubid
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
tuple
database relation page tuple virtualxid transactionid classid objid objsubid
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
virtualtransaction
database relation page tuple virtualxid transactionid classid objid objsubid
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
transactionid
database relation page tuple virtualxid transactionid classid objid objsubid
Lock an Xid
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
object
database relation page tuple virtualxid transactionid classid objid objsubid
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
advisory
database relation page tuple virtualxid transactionid classid objid objsubid (1=int64 key; 2=2xint32 keys)
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Candado exclusivo: SELECT FOR UPDATE Candado compartido: SELECT FOR SHARE
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Protocolo de obtencin:
Bloquear el buffer Obtener heavyweight lock sobre registro Si est tomado el row mark,
desbloquear el buffer dormir en el lock del Xid de la transaccin que lo tiene obs: lock sobre registro queda tomado
Si no,
marcar el registro con mi Xid (row mark) liberar el heavyweight lock
desbloquear el buffer
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Llaves forneas
La implementacin de llaves forneas usa locks de registros Internamente se usa SELECT FOR SHARE sobre el registro referenciado (src/backend/utils/adt/ri_triggers.c Esto asegura que el registro no se borrar hasta despus de que la transaccin que crea la referencia haya terminado
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Llaves forneas
La implementacin de llaves forneas usa locks de registros Internamente se usa SELECT FOR SHARE sobre el registro referenciado (src/backend/utils/adt/ri_triggers.c Esto asegura que el registro no se borrar hasta despus de que la transaccin que crea la referencia haya terminado ... pero tambin impide hacer un UPDATE sobre el registro
... an cuando dicho UPDATE no afecte la permanencia de la llave
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Desarrollo en progreso
optimizacin de spinlocks en >32 CPUs 9.2: heavyweight locks usan fast path SELECT FOR KEY SHARE
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Conclusin
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Conclusin
Los mecanismos de locking son complicados ... ... pero es preciso comprenderlos para depurar ciertos problemas en PostgreSQL
pgbr 2011
intro
spinlocks
lwlocks
heavyweight locks
pg_locks
locks en las
futuro
nal
Preguntas?
pgbr 2011