Nieuwe Core-nodes werden al met NVMe-opslag opgeleverd. De nodes die er langer stonden, draaiden nog op SSD's. Die zijn deze zomer allemaal overgezet, terwijl het halve land aan het strand lag of van een berg gleed met twee stokken in de hand.

Wat dat kost? Gratis.

Opslag bestaat uit twee dingen

Er zit geheugen waar de data in staat, en er is een weg waarover de server dat geheugen bereikt.

Bij de overstap van harde schijf naar SSD ging het om het eerste: geen draaiende metalen plaat meer, maar flashgeheugen. Bij de overstap van SSD naar NVMe gaat het om het tweede. Een SATA-SSD en een NVMe-SSD kunnen dezelfde flashgeheugenchips bevatten. Het verschil zit in hoe de server ermee praat.

Van 600 naar 7.000 megabyte per seconde

SATA is ontworpen voor draaiende schijven

SATA, en het protocol AHCI dat eroverheen praat, stamt uit het tijdperk van de harde schijf: een metalen plaat die ronddraait, met een armpje erboven dat de juiste plek opzoekt. Zo'n armpje kan maar op één plek tegelijk zijn. Het protocol is daar helemaal op ingericht: één wachtrij, met maximaal 32 opdrachten erin. Meer had een draaiende schijf ook niet nodig, want die kan er toch maar één tegelijk uitvoeren.

Toen de eerste SSD's kwamen, gingen die in datzelfde 'stopcontact'. Flashgeheugen heeft geen bewegende delen en kan honderden opdrachten naast elkaar afhandelen, maar het moest dat doen door een protocol dat ervan uitgaat dat er een armpje over een schijf beweegt.

NVMe praat rechtstreeks met de processor

NVMe (Non-Volatile Memory Express) laat die omweg weg. De opslag hangt rechtstreeks aan PCI Express, dezelfde verbinding waarop ook videokaarten en netwerkkaarten zitten.

Waar SATA één loket heeft met plek voor 32 mensen in de rij, heeft NVMe er duizenden naast elkaar. In gewone woorden: de server kan veel meer leesopdrachten tegelijk uitzetten, en hoeft niet te wachten tot de vorige klaar is. Op moderne hardware haalt zo'n verbinding rond de 7.000 megabyte per seconde. Vandaar die factor tien.

Waarom dat voor websites nog meer uitmaakt

Die 7.000 megabyte per seconde is het getal dat op de doos staat, en dat getal gaat over één groot bestand achter elkaar uitlezen. Een website doet dat vrijwel nooit.

Eén PHP-site opent honderden losse PHP-bestanden: de core, het thema, elke actieve plug-in. Daar komen sessiebestanden en cachebestanden bij. Allemaal klein, allemaal ergens anders. Dat heet 'random I/O', en juist daar is het verschil het grootst: niet omdat elke losse leesactie zoveel sneller is, meer omdat er honderden tegelijk in behandeling kunnen zijn.

Waar jullie het merken

  • Projecten zonder of met beperkte caching. Komt een pagina uit een cache, dan raakt die de schijf nauwelijks. Komt die er niet uit, dan bepaalt de opslag hoe snel de pagina er staat.
  • Alles wat veel bestanden tegelijk aanraakt. Een composer install, een productfeed importeren, een backup terugzetten, een mediabibliotheek met tienduizenden bestanden doorlopen, noem maar op.
  • Databases die groter zijn dan het geheugen dat ervoor is gereserveerd. Zodra een query van schijf moet lezen in plaats van uit het geheugen, telt elke microseconde wachttijd mee - en de gemiddelde pageview doet tientallen queries.

Wat jullie moeten doen: niets

Het is al gebeurd. Alle Core-nodes staan op NVMe, jullie projecten draaien er al op.

Eén nuance houden we er graag bij: snellere opslag maakt de schijf sneller, een cache maakt de schijf overbodig. OPcache en Redis blijven dus de eerste plek om winst te halen. NVMe zorgt ervoor dat het ook goed gaat op de momenten dat een cache niet helpt: de eerste bezoeker na een deploy, een pagina die niet te cachen is, een import die om middernacht draait.

Blijft een project daarna nog steeds traag, dan zit het ergens anders. Dan zoeken we met Tideways op naar welke regel code de tijd opsnoept. Laat het ons weten, dan kijken we mee.