Docker Container 에서 IOCP 사용이 가능한가요?

지인의 도움을 받아서 궁금한 점을 많이 해결할 수 있었습니다.

우선 IOCP vs epoll은 많이 대중화는 되어있으나 현재의 추세는 RIO (Registered I/O) vs io_uring 이라고 합니다.

Windows에서 IOCP보다 고성능을 낼 수 있는 RIO와 (대신 위험하다고 하네요, Thread-Safe하지 않다고 합니다.)

Linux 에서 epoll 보다 고성능을 낼 수 있는 io_uring 이 있다고 합니다.

RIO의 경우에는 일전에 @rkttu 님께서 소개해주신 적도 있습니다.

그리고 국내에 RIO로 개발된 MMORPG 게임이 몇개 있다고 합니다. (역시 MMORPG는 윈도우서버인가보네요)

epoll이나 io_uring으로 개발된 MMORPG 게임서버 사례는 잘 모르겠습니다.

아래는 RIO를 사용하는 예제? 인 것 같아서 기록 목적으로 올려봅니다.


이런 궁금증을 올렸던 이유는, 최초 질문 글에 언급했던 대로

MMORPG 게임 도메인에서는 Scale Out이 필요가 없는 환경이라고 생각하여 Docker의 도입이 비용적으로 봤을 때 가성비가 떨어진다는 생각이 있었기 때문입니다.

서버를 몇 개 생성해둘지 결정하고 유저가 어느 서버에 캐릭터를 생성할지 결정하는 MMORPG 특성상 트래픽 로드밸런싱이 필요 없다고 생각한 것이고, (본인이 캐릭터를 생성해둔 서버가 있는데 그 서버가 Auto Scale out 환경에서 서버가 사라지거나 생성되거나 그러면 안되겠지요.) 그런 의미에서 Docker와 k8s의 도입이 다른 게임서버라면 모를까 MMORPG에서는 컨테이너가 죽었을 때 살려주는 기능 외에는 어느 부분에서 필요한지 경험이 없어서 감이 잘 안옵니다.


그리고 게임서버 개발자들이 어떤 소켓 라이브러리를 사용하시는 모르겠지만 찾아보니 IOCP, epoll의 방식을 모두 지원하는 소켓 라이브러리들도 있는 것 같습니다.

OS에 따라 라이브러리가 알아서 방식을 변경해주는 것 같습니다.

그리고 또한 프라우드넷이라는 것도 있는 것 같습니다.

https://proudnet.com/proudnet1-08/
http://1st.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&no=3652
https://guide.nettention.com/cpp_ko
https://guide.nettention.com/cpp_ko#pn1ami

써본적이 없어서 잘 모르겠지만 게임 서버 라이브러리인 프라우드넷을 사용하면 Windows/Linux/Mac 에서 각자 OS에 맞는 고성능 소켓을 원소스로 사용할 수 있는 것 같습니다.

그러면 IOCP를 사용하시던 C++ 게임 서버 개발자 분들도 프라우드넷을 이용하면 Linux Docker Image로 빌드하여 Container 화 해서 사용하실 수 있을 것 같습니다.

혹 제가 틀린 부분이 있다면 언제든 교정 부탁드립니다.

4 Likes