Indy Sunucuları - EPOLL Linux (3 / 3)

· Özellikler

sgcWebSockets 2022.9.0 sürümünden itibaren Linux için yeni bir IOHandler vardır; EPOLL 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.

EPOLL IOHandler yalnızca sgcWebSockets Enterprise Paketinde kullanılabilir.


Yapılandırma 

Linux için EPOLL, Indy'nin varsayılan olarak yaptığı gibi bağlantı için bir iş parçacığı kullanmak yerine sınırlı bir iş parçacığı havuzu kullanarak binlerce bağlantıyı işlemeye olanak tanıyan bir API'dir.

Indy Sunucuları için EPOLL'u etkinleştirmek için IOHandlerOptions özelliğine gidin ve IOHandler Türü olarak iohIEPOLL'u seçin.

Server.IOHandlerOptions.IOHandlerType := iohEPOLL;
Server.IOHandlerOptions.EPOLL.EPOLLThreads := 0; // the number of EPOLL threads will be calculated automatically using the number of processors.
Server.IOHandlerOptions.EPOLL.WorkOpThreads := 0; 

1. EPOLLThreads, EPOLL 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). İş parçacığı sayısını manuel olarak ayarlayabilirsiniz.

2. WorkOpThreads, yalnızca bağlantıların her zaman aynı iş parçacığında işlenmesini istiyorsanız etkinleştirilmelidir. EPOLL 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.

Linux sunucuları için EPOLL'u 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 EPOLL 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 IOHandler Varsayılan Indy IOHandler EPOLL
100 1% (1.4MB) 0% (1.4MB)
5004% (5.6MB)0% (4.8MB)
100010% (10.5MB)0% (8.9MB)
1500-- (Failed)0% (13.3MB)
2000-- (Failed)0% (17.4MB)

Indy sunucusu, Select metodunun 1024'ten fazla eşzamanlı bağlantıyı kabul etme sınırlaması nedeniyle 1024'ten fazla eşzamanlı bağlantı açamadı. 1000 bağlantıya kadar olan sonuçları karşılaştırdığımızda, Indy Varsayılan Sunucusu EPOLL sunucusundan daha fazla cpu ve daha fazla RAM kullanıyordu. EPOLL sunucusu, boşta durumdayken hiç CPU kullanmıyordu ve bellek tüketimi de daha düşüktü.

Sonraki test, X istemciyi bağlamanın ne kadar zaman aldığını ölçer.

Bağlantı Sayısı Indy IOHandler Varsayılan Indy IOHandler EPOLL
1000 16,5 saniye 9,49 saniye
10000-- (Failed)1dk 55 saniye

Testler, sanal makinede çalışan 2 işlemcili ve 8GB belleğe sahip bir Ubuntu 20.0.4 üzerinde yapıldı.

EPOLL Belgeleri

https://man7.org/linux/man-pages/man7/epoll.7.html

EPOLL Uygulayan Harika Delphi Projeleri

https://github.com/winddriver/Delphi-Cross-Socket
https://github.com/grijjy/GrijjyFoundation