Verbindingsbeperkingen in webhosting om te bepalen hoeveel gelijktijdige aanvragen een server betrouwbaar kan verwerken voordat er vertragingen en fouten optreden. Ik laat je specifiek zien hoe je limieten, gelijktijdige verbindingen en serverbelasting kunt meten en optimaliseren en hoe je deze betrouwbaar kunt controleren door middel van gerichte afstemming.
Centrale punten
De volgende kernpunten geven een beknopt overzicht van de inhoud en de voordelen van dit artikel.
- Beperking Gelijktijdige verbindingen beschermen tegen overbelasting en foutmeldingen.
- Bronnen zoals CPU, RAM en I/O bepalen de effectieve limiet.
- Afstemmen met Sysctl, Nginx/Apache en DB-parameters verhoogt de capaciteit.
- Controle herkent knelpunten vroegtijdig en voorkomt storingen.
- Schalen en caching verminderen de serverbelasting tijdens piekverkeer.
Wat betekenen verbindingslimieten?
Een verbindingslimiet stelt een drempelwaarde voor het aantal gelijktijdige TCP-verbindingen dat een host accepteert voordat nieuwe verzoeken worden afgewezen of in een wachtrij worden geplaatst. Achter elke verbinding staat een TCP-handdruk, buffer en een verwerkingseenheid die middelen kost. Zonder limiet loopt het systeem snel uit tijdens pieken of meldt het „Connection refused“. Typische startwaarden liggen tussen 128 en 4096, afhankelijk van de kernel en setup, wat voor veel projecten te laag blijft. Ik controleer daarom eerst hoeveel open sockets, bestanden en processen het systeem betrouwbaar aankan en stel dan een limiet in die belastingspieken vermindert maar legitiem verkeer niet onnodig blokkeert.
Gelijktijdige verbindingen en serverbelasting
Elke open verbinding verbruikt Bronnen in CPU, RAM, netwerk en mogelijk in de database. Onder hoge belasting nemen contextwisselingen toe, lopen kernelwachtrijen vol en pauzeert de server met het accepteren van nieuwe verzoeken. Keep-Alive vermindert handshakes, maar vergroot de geheugenbehoefte per socket tijdens lange timeouts. Backlogs die te klein zijn (SYN en Accept) leiden tot drops voor de applicatie. Ik monitor daarom actieve verbindingen, backlog vullingsniveaus en retransmits en optimaliseer timeouts zodat ik idle time vermijd maar verbindingen snel vrijgeef na gebruik.
Prestatie-afstemming voor meer capaciteit
Voor meer gelijktijdige gebruikers verhoog ik eerst de kernellimieten en ga ik akkoord met Netwerk-buffer. De parameter net.core.somaxconn is vaak 128 en vertraagt de acceptatie van nieuwe verbindingen, dus ik stel deze aanzienlijk hoger in, afhankelijk van het systeem, vaak tot 4096 of meer. Ik verhoog de wachtrij voor half-open verbindingen met net.ipv4.tcp_max_syn_backlog zodat pieken netjes doorkomen. Ik pas de ontvangst- en zendbuffers (rmem_max, wmem_max) aan aan de bandbreedte maal RTT zodat er geen pakketten vastlopen in de gebruikersruimte. Met gecoördineerde timeouts en een schone acceptwachtrij neemt het aantal stabiel verwerkte verzoeken merkbaar toe zonder dat ik hoef te vertrouwen op kwaliteit in de reactietijd.
Webserver configureren: Nginx en Apache
Met Nginx verhoog ik werker_verbindingen en stel worker_rlimit_nofile in om overeen te komen met de systeemlimiet zodat bestandsdescriptor limieten niet vroegtijdig botsen. Een keepalive_timeout van ongeveer een minuut houdt verbindingen efficiënt open zonder dat sockets te lang inactief blijven. Met Apache gebruik ik Event-MPM en dimensioneer MaxRequestWorkers zodat de RAM reserveringen overeenkomen met de grootte van de PHP processen. Een beter begrip van de processen tussen prefork, worker en event maakt merkbare verschillen in doorvoer. Voor een overzicht van de sterke punten van de respectieve modellen, zie Gebeurtenis MPM en werkermodellen, wat me helpt om de juiste aanpak te kiezen.
Databaseverbindingen en time-outs
In de database beperk ik verbindingen met max_verbindingen en plan voldoende buffers in de InnoDB bufferpool zodat actieve records in RAM blijven. Ik houd annuleringen, lockwachttijden en verbindingswachtrijen van de applicatie in de gaten, omdat een te hoge limiet de CPU te zwaar belast met te veel actieve sessies. Ik houd de transactieduur en pool timeouts kort zodat verbindingen snel terug naar de pool gaan. Voor typische webstacks gaan gematigd ingestelde waarden veel verder dan blindelings hoge maxima. Als u dieper wilt ingaan op foutpatronen zoals 500s met te veel DB-sessies, kunt u informatie vinden op Limieten voor databaseverbindingen, wat mijn diagnose vaak versnelt.
Caching, HTTP/2/3 en Keep-Alive
Schoon cachen vermindert dynamische Belasting onmiddellijk omdat er minder PHP- en DB-calls nodig zijn. Pagina-, fragment- en objectcache verminderen de druk op de database met een zeer groot deel, afhankelijk van de toepassing. Met HTTP/2 of HTTP/3 bundelt een browser veel verzoeken over een paar verbindingen, wat het aantal sockets per client drastisch vermindert. Compressie (Gzip/Brotli) bespaart bandbreedte en verkort de overdrachtstijd zolang er CPU-reserves beschikbaar zijn. Met verstandige keep-alive timeouts verzamel ik de winst van de hergebruikte verbindingen zonder geheugen in beslag te nemen met buitensporig lange idle fases, wat de Efficiëntie verder toeneemt.
Hardware en netwerk tuning
Hoge gelijktijdige gebruikers profiteren van CPU-threads, RAM en snelle NVMe SSD's omdat de wachttijden voor I/O korter worden. Vanaf 16 threads en 64 GB RAM kunnen grote pieken worden uitgevoerd met een schone latency. In het netwerk loont 10 Gbps, vooral met moderne congestiecontrole zoals BBR. Ik minimaliseer achtergronddiensten, stel de juiste I/O schedulers in en houd de kernel en stuurprogramma's up-to-date. Een duidelijke scheiding van data- en logboekvolumes voorkomt „burengerucht“ en houdt de Reactietijd stabiel.
PHP-FPM en proceslimieten
Veel websites zijn afhankelijk van PHP-FPM, dus ik introduceer pm.max_kinderen afhankelijk van de procesgrootte en het beschikbare RAM. Een te hoog getal blokkeert RAM en leidt tot swapping, waardoor de latentie enorm toeneemt. Een te laag getal veroorzaakt 503s tijdens belastingspieken, hoewel CPU-capaciteit beschikbaar zou zijn. Ik pas de start, spare en max waarden aan zodat wachtrijen kort blijven en processen soepel verlopen. Als je de fijne kneepjes van deze module nauwkeuriger wilt instellen, kun je praktische tips vinden op PHP-FPM pm.max_children, wat het oplossen van problemen aanzienlijk vereenvoudigt.
Monitoring en belastingstests
Ik bereik blijvende stabiliteit door Controle en reproduceerbare belastingstesten. Ik kijk naar CPU-gebruik, steeltijd in virtuele omgevingen, RAM-quota, schijflatenties en netwerkfouten. Acceptwachtrijen, SYN backlogs en retransmits laten zien of de limiet te krap is of dat een app trager wordt. Voor belastingstests gebruik ik tools zoals „hey“ of „wrk“ en verhoog ik geleidelijk het aantal gebruikers totdat ik de knik in de curve vind. Op basis hiervan verander ik de limieten, controleer opnieuw en houd de Stabiliteit onder realistische patronen.
Praktische gidswaarden en tabel
Voor startconfiguraties gebruik ik Standaardwaarden, die ik later verfijn met metingen. Met Nginx begin ik vaak met 2048 worker_connections en stel ik de open bestandslimiet hoger in. Bij Apache kies ik het eventmodel en houd ik MaxRequestWorkers binnen een bereik dat overeenkomt met de grootte van de PHP-processen. Ik begin conservatief in de database en verhoog deze alleen als latenties stabiel blijven. Ik verhoog de kernellimieten, test dan onder piekbelastingen en controleer de Effect op wachtrijen en responstijden.
| Parameters | Component | Startwaarde | Effect |
|---|---|---|---|
| net.core.somaxconn | Kernel | 4096+ | Verhoogt de acceptatie van nieuwe verbindingen |
| net.ipv4.tcp_max_syn_backlog | Kernel | Hoge waarde van vier cijfers | Vermindert druppels bij halfopen contactdozen |
| rmem_max / wmem_max | Kernel | naar bandbreedte x RTT | Voorkomt congestie met een snel netwerk |
| werker_verbindingen | Nginx | 2048 | Verhoogt de gelijktijdigheid per werker |
| MaxRequestWorkers | Apache (Gebeurtenis) | 150-400 | Controleprocessen in het RAM-budget |
| keepalive_timeout | Nginx/Apache | ~60s | Vermindert handdrukoverhead |
| max_verbindingen | Database | ~1000 | Balanceert sessiebelasting |
Beperkingen van het besturingssysteem: descriptors, poorten en toestanden
Naast de voor de hand liggende netwerkparameters Bestandsdescriptors en proceslimieten zijn kritieke parameters. Ik stel nofile (ulimit) in voor gebruikers en services zodat de webserver, PHP-FPM en database genoeg sockets en bestanden kunnen openen. De algemene kernelwaarde fs.file-max moet hiermee overeenkomen, anders zullen processen vroegtijdig het einde bereiken ondanks correcte service-instellingen. Het aantal toegestane processen/threads (nproc) is net zo belangrijk zodat er geen onverwachte fork-fouten optreden onder belasting.
Een tweede blik Efemere havens (ip_local_port_range) en TCP toestanden zoals TIME_WAIT. Met een groot aantal uitgaande verbindingen (bijvoorbeeld als proxy of met microservices) kan het beschikbare poortbereik een knelpunt worden. Ik kies een breed, verstandig bereik en stel timeouts zo in dat inactieve verbindingen snel worden vrijgegeven zonder agressieve of onveilige kernelschakelaars te gebruiken. De sleutel is om de inactieve tijd te minimaliseren en hergebruik te bevorderen (keep-alive, HTTP/2/3, database pooling) in plaats van steeds nieuwe verbindingen op te zetten.
Reverse proxy en load balancer niveau
Tussen client en app is er vaak een Omgekeerde proxy of loadbalancer. Daar stel ik ook zinvolle backlogs, timeouts en keep-alive in op de Upstream-pagina. In Nginx zorgt een upstream keepalive pool ervoor dat verbindingen naar de applicatie worden hergebruikt, wat de belasting op zowel poorten als CPU vermindert. Ik gebruik verbindingsbeperking (limit_conn) en op verzoek gebaseerde snelheidsbeperking (limit_req) in doses om individuele clients te temmen zonder de legitieme belasting te beperken. Een duidelijke foutmelding (429 in plaats van 503 voor rate limiting) helpt om de oorzaak te analyseren tijdens het gebruik.
Op Verbindingsproces Tijdens implementaties of scale-downs gebruik ik connection draining of graceful shutdown: nieuwe verzoeken worden niet meer geaccepteerd, bestaande verzoeken worden netjes afgesloten. Op deze manier voorkom ik pieklatenties en foutpercentages bij het vervangen van versies of het verminderen van het aantal instanties.
TLS-beëindiging, HTTP/2/3-gegevens en CPU-gebruik
TLS-handshakes kosten CPU en latency. Ik beëindig TLS zoveel mogelijk dicht bij de klant (bijvoorbeeld op de edge proxy) en gebruik te maken van session resumption, OCSP stapling en moderne, krachtige cipher suites. Dit bespaart handshakes en verkort de time-to-first-byte. Onder HTTP/2/3 is het de moeite waard om headercompressie en prioritering in de gaten te houden: Verkeerd geprioriteerde streams kunnen latencies verhogen, zelfs als de concurrency hoog is. Ik zorg er ook voor dat keep-alive timeouts en limieten per origin zo gekozen zijn dat er geen head-of-line blocking kan optreden.
Vooral met ciphers die veel CPU vergen of Brotli niveaus, gebruik ik benchmarks om het punt te vinden waarop compressie gebruikt in plaats van remmen. Tijdens piekverkeer verlaag ik tijdelijk het compressieniveau als CPU het knelpunt is en verhoog het weer tijdens normaal verkeer.
Real-time verkeer: WebSockets, SSE en lange polling
Verbindingen die lang open blijven staan (WebSockets, server-sent events, lange polling) hebben een sterke invloed op de capaciteitsplanning. Ik scheid zulke Langlevend-verbindingen van klassieke request/response-paden, dimensioneer speciale werkers en stel strakkere limieten in. Het is belangrijk dat er weinig middelen per verbinding nodig zijn: Lichte protocolstacks, strakke buffers en conservatieve keep-alive strategieën zijn hier verplicht. Ik meet apart per verbindingstype zodat klassieke paginaweergaven niet lijden onder permanente verbindingen.
Containers en cloud: Conntrack, pod-limieten en opwarmen
In containeromgevingen stuit ik vaak op Conntrack-limieten. nf_conntrack_max en de hashgrootte moeten overeenkomen met het verwachte aantal verbindingen, anders vallen pakketten al weg in de kernel. Pod-limieten (CPU/Memory Requests & Limits) bepalen ook hoeveel gelijktijdige verzoeken een instantie daadwerkelijk kan verwerken. Ik plan opwarmfases zodat pas opgestarte pods caches kunnen vullen voordat ze vol verkeer ontvangen. Op nodeniveau zorg ik ervoor dat ulimit- en sysctl-waarden in de containers aankomen (bijvoorbeeld via initContainer of DaemonSets) en niet op de host blijven hangen.
Op Horizontaal schalen Ik gebruik p95/p99 latencies als triggers, niet alleen CPU. Zo reageer ik op echte gebruikerservaringen en voorkom ik dat individuele „luide“ pods het gemiddelde verstoren. Het aftappen van verbindingen in Ingress/Service zorgt voor soepele overgangen bij het op- en afschalen.
Foutbeelden en snelle diagnose
Ik herken typische symptomen aan duidelijke patronen:
- Hoge retransmits / SYN drops: Backlog te klein, pakketverliezen of wachtrijen te kort.
- Veel 502/504: Upstream timeouts, PHP FPM/DB pools die te klein zijn of applicatie-aanroepen blokkeren.
- 503 onder belasting: Werker- of procespools uitgeput, RAM-limiet bereikt, limieten te krap.
- Pieken in TIME_WAIT: Overmatige nieuwbouw in plaats van hergebruik; controleer keep-alive/pooling.
- Toenemende p99 latenties met stabiele p50: Wachtrijeffecten, hotspots, sluisconcurrentie.
Voor de Snelle diagnose Ik combineer metrieken (backlogs, verbindingsstatussen, latenties) met korte profiling en logsamples. Ik schrijf toegangslogs op een gebufferde of selectieve manier om te voorkomen dat I/O een knelpunt wordt. Als logs een knelpunt worden, verplaats ik ze asynchroon en aggregeer ze centraal.
Capaciteitsplanning: headroom, SLO's en testprofielen
Ik ben van plan met Headroom van 20-40% boven de typische dagelijkse belasting, zodat korte pieken niet meteen limieten doorbreken. Voor bedrijfskritische applicaties draai ik N-1 reserves: als één instantie uitvalt, is de capaciteit van de resterende instanties nog steeds voldoende voor acceptabele SLO's. Ik definieer meetbare doelen (bijv. 99% aan verzoeken onder 300 ms, foutpercentage < 0,1%) en test daartegen.
Ik wissel tussen profielen tijdens belastingstests:
- Stap inladen: Verhoog in stappen van 1-5 minuten om knikpunten duidelijk te zien.
- Testen door inweken: Enkele uren onder constante, hoge belasting om lekken en drift te detecteren.
- Barsttests: Simuleer kortetermijnpieken om achterstallige reserves en limieten te valideren.
Ik meet niet alleen de doorvoer, maar ook Wachttijden in wachtrijen, CPU-stelen in VM's, schijflatentie en netwerkfouten. Alleen de combinatie laat zien of het systeem systemisch stabiel is of alleen snel op de korte termijn.
Schalen en verkeerspieken
Voor plotselinge pieken combineer ik Belasting balanceren, caching en uitbesteding van inhoud. Round robin of gewogen methoden verdelen verzoeken over meerdere instanties. Ik trek statische bestanden naar een CDN zodat de origin server CPU vrij heeft voor dynamische reacties. Autoscaling op applicatie- of containerniveau vult deze maatregelen aan en verkort de reactietijden bij belastingssprongen. Ik gebruik quota's en rate limiting om het platform te beschermen tegen backlog overstromingen en om de Beschikbaarheid hoog.
Mijn belangrijkste stappenplan: Zo ga ik te werk
Eerst bepaal ik de huidige Beperk, Ik meet latencies, foutpercentages en wachtrijlengtes en log harde knelpunten. Vervolgens verhoog ik geleidelijk de kernel- en webserverlimieten, pas keep-alive en buffers aan en controleer het effect onder belasting. In de derde stap integreer ik caching, activeer ik HTTP/2 of HTTP/3 en optimaliseer ik databaseparameters. In de vierde stap harmoniseer ik PHP FPM-processen en bestandsdescriptor-limieten met het RAM-budget. Tot slot zorg ik voor constante monitoring, herhaal ik regelmatig belastingstests en houd ik zo mijn Aansluiting Limieten permanent in het groene bereik.
Conclusie: Stabiel met reserves in plaats van op het randje
Verbindingslimieten zijn niet één schakelaar, maar de Interactie van kernelwachtrijen, webserverinstellingen, procespools, databaseafstemming, netwerkpaden en hardware. Het verhogen van limieten op zichzelf stelt het probleem vaak alleen maar uit. Daarom kies ik voor een holistische aanpak: eerst meten, dan gericht verhogen, altijd testen tegen echte belastingspatronen en ondersteunen met monitoring. Op deze manier groeien doorvoer en betrouwbaarheid samen en blijft de server stabiel, zelfs onder piekbelastingen. voorspelbare prestaties.


