Anatomía del Motor WiredTiger: B+Trees sin Locks, Hazard Pointers, Eviction Threads y Checkpoints (50 min)
Anatomía del Motor WiredTiger: B+Trees sin Locks, Hazard Pointers, Eviction Threads y Checkpoints
1. Representación Dual: Páginas en Memoria vs. Bloques Comprimidos en Disco
A diferencia de las bases relacionales que mantienen páginas de $8\text{ KB}$ idénticas en RAM y disco, WiredTiger separa el formato de memoria del formato de almacenamiento: - En Disco (On-Disk Format): Bloques serializados y comprimidos con Zstandard (zstd) o Snappy ($32\text{ KB}$ por defecto para datos y $4\text{ KB}$ para índices con prefix compression). - En Memoria (In-Memory Cache): Árboles B+ descomprimidos optimizados para recorrido por punteros de CPU, acompañados de listas Update/Modify SkipLists por registro para soportar MVCC (Multi-Version Concurrency Control) sin bloqueos de tabla ni colección.
flowchart LR
WR["Write Op (insert/update)"] --> MEM["WiredTiger In-Memory B+Tree + Update SkipList (MVCC)"]
WR --> WAL["Write-Ahead Log (Journal comprimido cada 100ms o WriteConcern j:true)"]
MEM -->|"Dirty Cache > 20%"| EVICT["Eviction Server Threads"]
MEM -->|"Cada 60s"| CHK["Snapshot Checkpoint Atómico CoW hacia Disco (zstd)"]
2. Presión de Caché y Umbrales Críticos de Evicción (Dirty Cache Stalls)
Por defecto, WiredTiger asigna el $50\%$ de (RAM - 1 GB) a su caché interna:
- eviction_dirty_trigger = 5%: Los hilos de evicción en segundo plano comienzan a escribir páginas sucias a disco.
- eviction_dirty_target = 20%: Si las páginas modificadas superan el $20\%$ de la caché (o la caché total supera el $80\%$), los hilos de las aplicaciones cliente son forzados a realizar evicción síncrona, disparando la latencia p99 de $2\text{ ms}$ a $> 500\text{ ms}$.