Sqlite draaien op een ramdisk met compressie nog steeds sneller dan op een NVMe SSD
Ja, absoluut. SQLite draaien op een gecomprimeerde RAM-disk (zoals ZRAM op Linux of een gecomprimeerde RAM-drive van een externe aanbieder op Windows) is in bijna alle scenario's ruim sneller dan op een NVMe-SSD.
De achterliggende redenen waarom dit zo is, vallen op te splitsen in drie hoofdfactoren: latentie, bandbreedte en de page-cache van het besturingssysteem.
1. Latentie: Een onoverbrugbare kloof
De meest kritische factor voor de prestaties van SQLite is de transactielatentie (vooral bij seriële, niet-gebatchte INSERT- of UPDATE-opdrachten).
- NVMe-SSD: Zelfs de snelste Gen 5 NVMe-drives hebben een hardwarematige latentiegrens van ongeveer 10 tot 50 microseconden (\mu s).
- RAM-disk: Toegang tot het systeemgeheugen gebeurt in nanoseconden — meestal rond de 10 tot 100 nanoseconden (ns).
Omdat RAM ruwweg 1.000× tot 5.000× sneller is in puur reactievermogen dan flashgeheugen, hoeft SQLite niet te wachten tot de flashcontroller geheugencellen wist of fysieke paginamappings uitvoert.
2. Bandbreedte vs. CPU-compressie-overhead
Je vraagt je misschien af of de CPU-overhead van het 'on the fly' comprimeren en decompresseren van pagina's de RAM-disk niet vertraagt. In de praktijk zijn moderne compressie-algoritmen (zoals ZSTD of LZ4) zo snel dat ze de prestaties juist verbeteren in plaats van verslechteren.
- Doorvoersnelheid: Een standaard DDR4- of DDR5-geheugenkanaal haalt tussen de 25 GB/s en 80+ GB/s. De absolute top onder NVMe-SSD's blijft steken op zo'n 7 tot 14 GB/s.
- Het voordeel van compressie: Algoritmen zoals LZ4 kunnen gegevens decompresseren met meerdere gigabytes per seconde per CPU-core. Door de RAM-disk te comprimeren, verstuur je fysiek minder bytes over de geheugenbus. De CPU-cycli die nodig zijn voor decompressie worden ruimschoots gecompenseerd door de kleinere datavoetafdruk en de razendsnelle RAM-snelheid.
3. De olifant in de kamer: De OS Page Cache
Er is wel een belangrijk nuanceverschil. Als je SQLite-database klein genoeg is om sowieso volledig in het RAM-geheugen te passen, kan de page-cache van het besturingssysteem het verschil grotendeels tenietdoen.
Als je SQLite op een NVMe-SSD draait met PRAGMA synchronous = OFF; en PRAGMA journal_mode = WAL;, zal het besturingssysteem lees- en schrijfoperaties sowieso agressief in het RAM bufferen. Bij een benchmark tussen een volledig gecachte SSD-database en een RAM-disk-database zie je vaak bijna identieke snelheden, omdat beide stiekem vanuit het werkgeheugen draaien.
Wanneer de gecomprimeerde RAM-disk wél domineert:
- Enorme datasets: Als de database 100 GB groot is en je slechts 32 GB RAM hebt, moet de NVMe-SSD voortdurend pagina's weggooien en het fysieke flashgeheugen aanspreken (thrashing). Een gecomprimeerde RAM-disk met ZRAM kan die 100 GB terugbrengen tot bijvoorbeeld 30 GB, waardoor de volledige database in het fysieke geheugen blijft en er geen enkele schijf-I/O nodig is.
- Strikte gegevensbehoud (
synchronous = FULL): Als je SQLite dwingt om elke transactie veilig naar het fysieke medium te schrijven viafsync, moet de NVMe-SSD wachten tot de fysieke schrijfcyclus van de hardware is voltooid. De RAM-disk geeft direct een "schrijven voltooid"-bevestiging, omdat zijn "hardware" gewoon het vluchtige geheugen is.
⚠️ Waarschuwing voor gegevensverlies:
Vergeet niet dat RAM-disks volledig vluchtig zijn. Als de server de stroom verliest of crasht, is een SQLite-database op een RAM-disk op hetzelfde moment verdwenen. Gebruik je deze opzet, zorg dan voor continue back-ups of replicatie naar een fysieke NVMe-SSD.
(Bron: Google Gemini)
Comments
Post a Comment