Naar hoofdinhoud

Trage serverreactietijd? Zo vind je de echte oorzaak

Trage serverreactietijd? Zo vind je de echte oorzaak

Twee seconden. Zo lang kan het duren voordat een pagina begint te reageren, en op papier is dat niets. In de praktijk is het precies het moment waarop een bezoeker terugklikt, een medewerker nog een keer op verversen drukt en een koppeling in een time-out loopt. Het vervelende is dat niemand ziet waar die twee seconden blijven. Daarom wordt er vaak meteen aan de verkeerde knop gedraaid: een zwaardere server, terwijl de rem ergens anders zit.

Serverreactietijd is de tijd tussen een aanvraag van een browser, app of koppeling en het eerste stukje antwoord dat terugkomt. Je ziet die waarde terug als Time to First Byte, afgekort TTFB. Een lage TTFB betekent nog niet dat een site of applicatie snel voelt, want daarna moeten afbeeldingen, scripts en rendering ook nog hun werk doen. Een hoge TTFB betekent omgekeerd bijna altijd dat er aan de serverkant iets staat te wachten.

Waarom er zelden één schuldige is

Hosting is de makkelijkste verdachte, en soms is dat ook terecht. Te weinig geheugen, een overvolle gedeelde omgeving of een configuratie die na een groeispurt nooit is bijgesteld: dat vertraagt direct. Maar in de meeste omgevingen die wij onder de motorkap bekijken, is de wachttijd opgebouwd uit kleine stukjes die verspreid zitten over infrastructuur, applicatiecode, database en externe diensten. Geen van die stukjes is op zichzelf dramatisch. Samen zijn ze het wel.

Een productpagina is een mooi voorbeeld. Voordat er iets op het scherm kan staan, haalt de applicatie voorraad op, rekent prijzen door, controleert klantspecifieke afspraken en vraagt aanbevelingen op. Gebeurt dat in losse queries en losse API-aanroepen, dan tikt de teller netjes door. De server doet dan niet te weinig, hij moet te veel afwerken voordat hij iets mag terugsturen.

Piekbelasting legt dat soort opbouw pijnlijk bloot. Een omgeving die met twintig gelijktijdige gebruikers prima werkt, kan tijdens een campagne of een maandafsluiting vastlopen. Er is dan niets stuk. Het aantal processen, het aantal databaseverbindingen of de beschikbare rekenkracht raakt simpelweg het plafond. Zonder meetgegevens is dat niet te onderscheiden van "de server is traag".

Eerst meten, en niet alleen de homepage

Een nulmeting is pas bruikbaar als hij lijkt op echt gebruik. De gemiddelde reactietijd van je homepage zegt daar weinig over. Meet de processen waar tijd en geld in zitten: inloggen, zoeken, een order plaatsen, een rapport openen, data synchroniseren, het klantportaal laden. Daar wordt vertraging gevoeld, en daar ontstaat de schade.

Splits vervolgens de totale tijd op in onderdelen. Hoeveel zit er in het netwerk? Hoeveel in webserver en applicatie? Welke queries kosten tijd? Staat er iets te wachten op een externe API? Die verdeling voorkomt het klassieke scenario waarin ontwikkelaars weken aan code sleutelen terwijl de echte bottleneck een overbelaste database of een te krappe hostingomgeving is.

Kijk daarbij naar percentielen en niet naar gemiddelden. Een gemiddelde van 300 milliseconden klinkt uitstekend, ook als tien procent van de aanvragen er vijf seconden over doet. Voor de gebruiker die op dat moment wil afrekenen of publiceren bestaat dat gemiddelde niet. De trage staart is waar je moet zijn: wat hebben die aanvragen met elkaar gemeen? Hetzelfde tijdstip, dezelfde klant, hetzelfde rapport, dezelfde tabel?

In de analyse komen meestal vier lagen langs:

  • CPU, geheugen, schijfsnelheid en netwerk van de server zelf;
  • de webserver en runtime, met instellingen voor processen, workers en verbindingen;
  • de applicatiecode, achtergrondtaken en alles wat van externe systemen afhankelijk is;
  • de database, met trage queries, ontbrekende indexen, locks en verbindingslimieten.

Die opsomming is een handige checklist, geen rangorde. We hebben omgevingen gezien waar één verkeerd geschreven query meer winst opleverde dan een verdubbeling van de capaciteit, en omgevingen waar de code netjes in elkaar zat maar de server structureel te klein was ingekocht. Pas na het meten weet je in welke van die twee situaties je zit.

Geef de infrastructuur een eerlijke basis

Hosting moet passen bij wat er daadwerkelijk gebeurt, niet bij het aantal pagina's of gebruikers in een spreadsheet. Een webshop met zware productfilters stelt andere eisen dan een informatieve site met dezelfde bezoekersaantallen. Een SaaS-platform met veel gelijktijdige sessies, geplande taken en API-verkeer vraagt weer iets anders. Wie alleen op een rustige dinsdagmiddag kijkt, koopt bijna altijd te licht in.

Controleer dus hoe de omgeving zich tijdens een piek gedraagt. Zit de CPU langdurig tegen zijn limiet aan, lopen er wachtrijen op, worden processen afgebroken wegens geheugentekort? Dan is opschalen een verdedigbare keuze. Snellere opslag helpt vooral bij veel lees- en schrijfwerk: grote databases, uitgebreide logging, bestandsverwerking.

Alleen is extra capaciteit geen vrijbrief. Een taak die elke minuut duizenden records langsloopt zonder dat iemand nog weet waarom, blijft duur en kwetsbaar, ook op een snellere machine. In de praktijk werkt deze volgorde het beste: haal eerst het grootste stuk verspild werk eruit en schaal daarna op voor groei en pieken. Dan betaal je voor ruimte in plaats van voor rommel.

De opzet speelt ook mee. Staat de database ver van de applicatie, dan weegt elke extra aanroep zwaarder, want de latency telt per keer mee. Draaien er meerdere kritieke systemen op dezelfde machine, dan kan één zwaar maandrapport de klantomgeving traag maken. Rollen scheiden geeft meer voorspelbaarheid, maar kost ook beheertijd en geld. Dat is pas zinvol als de belasting of de bedrijfsimpact het rechtvaardigt.

Databasevertraging aanpakken waar die ontstaat

Bij zakelijke applicaties is de database vaak de grootste bron van wachttijd, en meestal ongemerkt. De interface werkt nog prima, maar achter elke gebruikersactie zitten tientallen queries die netjes op elkaar wachten. Zolang de tabellen klein zijn, valt dat niemand op. Bij vijf keer zoveel records of gebruikers is het opeens het gesprek van de dag.

Begin bij twee lijstjes: de langzaamste queries en de meest uitgevoerde queries. De oorzaken zijn vaak herkenbaar. Een ontbrekende index, een select die veel meer kolommen ophaalt dan nodig, een filter op een veld waar niets op geïndexeerd staat. En let op de queries die op zichzelf snel zijn. Twee milliseconden is niets, tot het driehonderd keer binnen dezelfde aanvraag gebeurt.

Locks en transacties verdienen aparte aandacht. Houdt een proces een tabel lang vast, dan staan andere processen te wachten terwijl de CPU bijna niets doet. De gebruiker ziet een trage pagina en in de monitoring lijkt de server kerngezond. Bij financiële, voorraad- of planningsprocessen is hier voorzichtigheid geboden: snelheid winnen mag nooit ten koste gaan van consistente data.

Caching haalt veel werk weg, zeker bij gegevens die voor iedereen gelijk zijn, zoals productinformatie, configuraties en navigatiestructuren. Voor persoonlijke gegevens, actuele voorraad en prijsberekeningen heb je duidelijke afspraken nodig over verversen en invalideren. Een razendsnelle pagina met een prijs van vorige week kost een bedrijf meer dan een pagina die 200 milliseconden langzamer is en klopt.

Laat één aanvraag minder werk doen

Veel reactietijd gaat verloren omdat een aanvraag te veel in één keer wil afronden. Iemand uploadt een bestand en wacht vervolgens op een conversie, een mailnotificatie en een synchronisatie met het ERP. Voor het antwoord aan die gebruiker is daar niets van nodig. Zulke taken horen in een wachtrij, waar een achtergrondproces ze oppakt.

Gratis is dat niet. Achtergrondtaken moeten bewaakt worden, fouten moeten opnieuw aangeboden kunnen worden en de verwerkingsorde moet kloppen. Zonder die afspraken ruil je een trage aanvraag in voor onbetrouwbare verwerking, en dat is een slechtere deal.

Externe API's zijn een categorie apart. Een betaalprovider, CRM, ERP of verzendpartij kan je aanvraag vertragen terwijl je eigen server zich verveelt. Zet daarom time-outs op elke uitgaande aanroep, log wat er terugkomt en zorg dat een storing bij een derde partij niet een hele pagina blokkeert. Waar het kan: synchroniseer asynchroon of houd een recente kopie lokaal beschikbaar.

Houd ook releases in het oog. Nieuwe functionaliteit brengt bijna altijd extra queries, scripts of integraties mee. Neem een prestatiemeting op in het ontwikkelproces, vooral bij systemen die de hele dag gebruikt worden. Een wijziging die functioneel klopt maar elke aanvraag 400 milliseconden duurder maakt, wil je vóór productie zien en niet drie weken later in een klacht.

Snelheid is beheer, geen project

Een snelle serverreactie regel je niet één keer om er daarna nooit meer naar te kijken. Verkeer groeit, tabellen vullen zich, koppelingen veranderen en gebruikers vinden routes die niemand had voorzien. Continue monitoring is het verschil tussen zelf ingrijpen en het nieuws van een klant horen.

Leg drempelwaarden vast voor reactietijd, foutpercentages, CPU, geheugen, databaseverbindingen en wachtrijlengte. Combineer die technische signalen met wat je weet van het bedrijfsproces. Een piek in gebruik is goed nieuws als een campagne aanslaat en slecht nieuws als orders daardoor blijven hangen. Dat onderscheid maakt een drempelwaarde niet voor je.

Zorg ten slotte voor duidelijk eigenaarschap. Met een externe ontwikkelaar, een apart hostingbedrijf en twee softwareleveranciers erbij verdwijnt een prestatieprobleem makkelijk in de ruimte tussen de partijen. Liggen ontwikkeling en hosting in dezelfde hand, dan is de route naar de oorzaak korter. Zo werken wij bij LJPc: niet alleen vaststellen dat iets traag is, maar uitzoeken waarom en het vervolgens oplossen.

De beste volgende stap is bijna nooit de grootste server bestellen. Kies één proces dat aantoonbaar tijd verliest, meet de hele keten van browser tot database en verbeter de schakel die het meest in de weg zit. Dat levert sneller resultaat, houdt de kosten uitlegbaar en geeft je organisatie het gevoel terug dat de techniek meewerkt.

Blijf op de hoogte van recente ontwikkelingen! Schrijf je in en ontvang onze nieuwsbrief Bezig met aanmelden...