sgcWebSockets 2022.9.0 sürümünden itibaren Indy Sunucu IOCP IOHandler'ı sıfırdan yeniden yazıldı ve performansı iyileştirildi. IOCP IOHandler yalnızca sgcWebSockets Enterprise Paketinde kullanılabilir.
IOCP kullanarak, sunucu tarafından daha fazla bağlantı işlendikçe performansın çok düştüğü "istemci başına bir iş parçacığı" sorunundan kaçınabilirsiniz. IOCP, birden fazla istemciyi işleyen birkaç iş parçacığı sağlar. İş parçacıkları askıya alınır ve işlenecek bir şey olana kadar CPU döngüsü kullanmaz.
Yapılandırma
Indy Sunucuları için IOCP'yi etkinleştirmek için IOHandlerOptions özelliğine gidin ve IOHandler Türü olarak iohIOCP'yi seçin.
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, IOCP asenkron istekleri (çakışan işlemler) için kullanılan iş parçacıklarıdır; varsayılan olarak değer sıfırdır; bu, iş parçacığı sayısının işlemci sayısı kullanılarak hesaplandığı anlamına gelir (cpucount işlevinin desteklenmediği Delphi 7 ve 2007 hariç, burada iş parçacığı sayısı 32 olarak ayarlanır).
2. WorkOpThreads, yalnızca bağlantıların her zaman aynı iş parçacığında işlenmesini istiyorsanız etkinleştirilmelidir. IOCP kullanırken, istekler bir iş parçacığı havuzu tarafından işlenir ve (aynı bağlantı için) her istek farklı iş parçacıklarında işlenebilir. Her bağlantıyı aynı iş parçacığında işlemek istiyorsanız, bu istekleri işlemek için kullanılan iş parçacığı sayısını WorkOpThreads'te ayarlayın. Bu, sunucunun performansını etkiler ve yalnızca bu özelliğe ihtiyacınız varsa sıfırdan büyük bir değer ayarlamanız önerilir.
windows sunucuları için IOCP'yi etkinleştirmek, binlerce bağlantıyı işlemeniz gerektiğinde önerilir; sunucunuz en fazla yalnızca 100 eşzamanlı bağlantıyı işliyorsa varsayılan Indy İş Parçacığı modeliyle kalabilirsiniz.
Performans Testi
Basit bir test, Indy İş Parçacığı modeli ile IOCP arasındaki farkları gösterecektir. Test, websocket protokolünü kullanarak sunucuya bağlanacak ve cpu kullanımı ile bellek tüketimi aşağıdaki tabloda gösterilecektir. % cpu kullanımı, sunucu BOŞTA iken geçerlidir.
| Bağlantı Sayısı | Indy Varsayılan 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) |
Indy sunucusu, büyük olasılıkla iş parçacığı bağlam değişimi nedeniyle 3000'den fazla eşzamanlı bağlantıyla yavaşlamalar yaşamaya başladı ve sunucu boştayken cpu kullanımı çok yüksekti.
IOCP sunucusu, boşta durumdayken hiç CPU kullanmıyordu ve bellek tüketimi de daha düşüktü.
Sonraki test, 3000 istemciyi bağlamanın ne kadar zaman aldığını ölçer; her biri sunucuya bağlandığında bir mesaj gönderir ve sunucu bu mesajı yansıtır.
| Indy Varsayılan IOHandler | Indy IOCP IOHandler | |
| 3000 istemciyi bağla ve mesajı yansıt | 15,32 saniye | 6,89 saniye |
Performans Testleri, 16 çekirdekli ve 32GB belleğe sahip bir Windows Server 2022 üzerinde yapıldı.
