Vanaf sgcWebSockets 2022.9.0 is de IOCP-IOHandler van de Indy-server vanaf nul herschreven en zijn de prestaties verbeterd. De IOCP-IOHandler is alleen beschikbaar in het sgcWebSockets Enterprise-package.
Met IOCP kun je het "one-thread-per-client"-probleem voorkomen waarbij de prestaties sterk afnemen naarmate de server meer verbindingen afhandelt. IOCP biedt een paar threads die meerdere clients afhandelen. De threads zijn opgeschort en gebruiken geen CPU-cycli totdat er iets te verwerken is.
Configuratie
Om IOCP voor Indy-servers in te schakelen, ga je naar de property IOHandlerOptions en selecteer je iohIOCP als IOHandler-type.
Server.IOHandlerOptions.IOHandlerType := iohIOCP; Server.IOHandlerOptions.IOCP.IOCPThreads := 0; // the number of IOCP threads will be calculated automatically using the number of processors. Server.IOHandlerOptions.IOCP.WorkOpThreads := 0;
1. IOCPThreads zijn de threads die worden gebruikt voor asynchrone IOCP-aanvragen (overlapped operations); standaard is de waarde nul, wat betekent dat het aantal threads wordt berekend op basis van het aantal processoren (behalve voor Delphi 7 en 2007, waar het aantal threads op 32 wordt gezet omdat de cpucount-functie niet wordt ondersteund).
2. WorkOpThreads hoef je alleen in te schakelen als je wilt dat verbindingen altijd in dezelfde thread worden verwerkt. Bij IOCP worden de aanvragen verwerkt door een threadpool, en elke aanvraag (voor dezelfde verbinding) kan in een andere thread worden verwerkt. Als je elke verbinding in dezelfde thread wilt afhandelen, stel in WorkOpThreads het aantal threads in dat deze aanvragen verwerkt. Dit heeft invloed op de prestaties van de server en het wordt alleen aangeraden een waarde groter dan nul in te stellen als je deze functie echt nodig hebt.
IOCP inschakelen voor Windows-servers wordt aanbevolen wanneer je duizenden verbindingen moet afhandelen; verwerkt je server maximaal 100 gelijktijdige verbindingen, dan kun je het standaard Indy-threadmodel blijven gebruiken.
Prestatietest
Een eenvoudige test laat de verschillen zien tussen het Indy-threadmodel en IOCP. De test verbindt met de server via het WebSocket-protocol; het CPU-gebruik en het geheugengebruik staan in de onderstaande tabel. Het CPU-gebruikspercentage is gemeten terwijl de server IDLE was.
| Aant. verbindingen | Indy Default IOHandler | Indy IOCP IOHandler |
| 100 | 0% (4.1MB) | 0% (3.9MB) |
| 500 | 0% (17.1MB) | 0% (7.7MB) |
| 1000 | 0% (32.2MB) | 0% (12.4MB) |
| 1500 | 7.3% (46.8MB) | 0% (17.1MB) |
| 2000 | 15.4% (61.6MB) | 0% (21.9MB) |
| 2500 | 51.9% (76.5MB) | 0% (26.5MB) |
| 3000 | 68.8% (91.7MB) | 0% (31.2MB) |
| 3500 | 72.3% (106MB) | 0% (35.9MB) |
De Indy-server begon vertragingen te vertonen bij meer dan 3000 gelijktijdige verbindingen, hoogstwaarschijnlijk door de thread context switch, en het CPU-gebruik was zeer hoog terwijl de server idle was.
De IOCP-server gebruikte geen CPU in idle-toestand en ook het geheugengebruik was lager.
De volgende test meet hoe lang het duurt om 3000 clients te verbinden; elke client stuurt een bericht zodra hij verbinding maakt en de server echo't dit bericht.
| Indy Default IOHandler | Indy IOCP IOHandler | |
| 3000 clients verbinden en bericht echoën | 15,32 seconden | 6,89 seconden |
De prestatietests zijn uitgevoerd op Windows Server 2022 met 16 cores en 32 GB RAM.
