Indy 서버 - EPOLL Linux (3 / 3)

· 기능

sgcWebSockets 2022.9.0부터 Linux용 새 IOHandler가 추가됐어요. EPOLL을 사용하면 서버가 더 많은 연결을 처리할수록 성능이 크게 저하되는 "1연결당 1스레드" 문제를 피할 수 있어요. IOCP는 여러 클라이언트를 처리하는 소수의 스레드를 제공해요. 처리할 것이 있을 때까지 스레드는 일시 중단되어 CPU 사이클을 사용하지 않아요.

EPOLL IOHandlersgcWebSockets Enterprise 패키지에서만 사용할 수 있어요.


설정 

Linux용 EPOLL은 Indy가 기본적으로 하는 것처럼 연결마다 스레드를 사용하는 대신 제한된 스레드 풀을 사용해 수천 개의 연결을 처리할 수 있는 API예요.

Indy 서버에서 EPOLL을 활성화하려면 IOHandlerOptions 속성으로 이동해 IOHandler 타입으로 iohIEPOLL을 선택하세요.

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 비동기 요청(오버랩 작업)에 사용되는 스레드예요. 기본적으로 값은 0이며, 이는 스레드 수가 프로세서 수를 사용해 계산된다는 것을 의미해요(cpucount 함수가 지원되지 않는 Delphi 7 및 2007은 스레드 수가 32로 설정됨). 스레드 수를 수동으로 조정할 수 있어요.

2. WorkOpThreads는 연결이 항상 같은 스레드에서 처리되길 원할 때만 활성화해야 해요. EPOLL을 사용하면 요청이 스레드 풀에 의해 처리되고, 같은 연결에 대한 각 요청이 다른 스레드에서 처리될 수 있어요. 모든 연결을 같은 스레드에서 처리하려면 WorkOpThreads에 이러한 요청을 처리하는 데 사용할 스레드 수를 설정하세요. 이는 서버 성능에 영향을 미치므로 이 기능이 필요한 경우에만 0보다 큰 값을 설정하는 것이 권장돼요.

Linux 서버에서 EPOLL 활성화는 수천 개의 연결을 처리해야 할 때 권장돼요. 서버가 최대 100개의 동시 연결만 처리하는 경우 기본 Indy 스레드 모델을 유지할 수 있어요.

성능 테스트

간단한 테스트가 Indy 스레드 모델과 EPOLL의 차이를 보여줄 거예요. WebSocket 프로토콜을 사용해 서버에 연결하고 CPU 사용률과 메모리 소비량이 다음 표에 표시돼요. CPU 사용률 %는 서버가 유휴 상태일 때예요.

연결 수 Indy IOHandler 기본값 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)

The Indy server could not open more than 1024 concurrent connections, due to the limitation of Select method to accept more than 1024 concurrent connections. Comparing the results till 1000 connections, the Indy Default Server was using more cpu and more RAM than EPOLL server. The EPOLL server was using no CPU while it was in idle state and the memory consumption was lower too.

The next test measures how much time it takes to connect X clients.

연결 수 Indy IOHandler 기본값 Indy IOHandler EPOLL
1000 16.5초 9.49초
10000-- (실패)1분 55초

테스트는 가상 머신에서 실행 중인 프로세서 2개, RAM 8GB의 Ubuntu 20.0.4에서 수행됐어요.

EPOLL 문서

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

EPOLL을 구현한 훌륭한 Delphi 프로젝트

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