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

현 직장에 이직하기 전까지 IOCP라는 단어를 들어본 적이 없었습니다.

주로 HTTP 통신만 해왔기 때문인데요.

현직장은 게임회사이고 MMORPG 업계에서는 Windows 서버에서 IOCP를 이용한 고성능 서버를 만드는 것이 일반적인 것 같습니다.

.NET Framework 에서는 아래 두 글에서 찾아보니 Socket 객체를 이용하면 내부적으로 IOCP를 이용하는 것 같습니다.

iocp 에 대해서 여러분은… - GpgStudy 포럼

.NET Core 이상의 .NET 제품들에서 Linux나 Mac 에서 동작하면 IOCP 말고 각 OS의 네이티브 비동기 방식을 채택하는 지는 아직 모르겠습니다. (오픈 소스니까 뜯어보면 될 것 같지만 어디서부터 봐야하는지 너무 어렵네요…ㅠㅠ)

뭐 위 질문은 번외였고, 질문은

IOCP는 Windows 종속 기능인데, Linux Docker Container로 이미지를 빌드해서 사용할 수 있는지? 입니다.

저장 프로시저를 걷어내고, 3 Tier 방식으로 하기 위해 쿼리를 호출하는 aspnetcore Http 서버야 뭐…당연히 Linux Container로 가능한 부분이겠지만, 과연 클라이언트와 직접 연결되는 Socket 서버는 IOCP를 사용한 Linux Conainter의 운용이 가능한지 입니다.

이런 고민보다는 차라리 게임 서버를 epoll 방식으로 바꿔서 linux container를 쓰는게 맞지 않나 하는 의문도 들겠지만, 게임서버 개발자중에서 epoll방식을 다루는 분들은 수요가 적은 것 같습니다. Java vs C# 했을 때 언어의 성능의 문제보다는 한국이라는 전자정부 프레임워크가 존재하는 환경의 문제 로 Java 개발자가 압도적으로 많은 한국의 시장처럼요.

따라서 대한민국의 게임 서버 개발자라면 Windows Server에서 IOCP 이용을 하는 것은 기본으로 깔고 가야하는 전제인 것 같습니다.

대한민국의 많은 게임 회사들이 Docker를 어떻게 도입해서 운영하시는 지는 모르겠지만, 아까 위에서 제가 언급한 Http API 호출의 정도야 쉽게 도입이 가능한 부분 같지만, IOCP가 필수로 요구되는 서버의 경우 Docker Container를 도입해서 사용하는 사례가 있을까요?

5개의 좋아요

혹시 요런 느낌을 원하실까 싶어 공유드립니다.

Windows Gameservers | Agones
googleforgames/agones: Dedicated Game Server Hosting and Scaling for Multiplayer Games on Kubernetes (github.com)

3개의 좋아요

답변 먼저 하면, 당연히 IOCP는 리눅스 환경에서 사용할 수 없습니다.

그리고 (현재는 어떻게 바뀌었을지는 또 체크해봐야겠지만 VC++: 124. libuv 모듈 살펴 보기 글을 쓰는 당시에는) ASP.NET Core로 빌드/배포해서 생성한 바이너리를 보면 libuv에 의존하고 있었습니다.

참고로, libuv는 플랫폼에 따라 윈도우인 경우 IOCP, 리눅스인 경우에는 (윈도우의 IOCP에 준하는) epoll을 사용합니다. 따라서, 닷넷 입장에서 보면 IOCP의 성능이 꼭 필요하다면 그냥 윈도우 서버에서 운영하면 됩니다.

그 외에, 닷넷에서 IOCP를 사용하는 것은 IO Thread를 사용하는 비동기에 한해서입니다. 관련해서는 다음의 글이 있으니 참고하세요.

C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법
; .NET Framework: 919. C# - 닷넷에서의 진정한 비동기 호출을 가능케 하는 I/O 스레드 사용법

10개의 좋아요

음…Windows Container는 지원이 좋지 않다하여 고려조차 하지 않았습니다…
혹시 Windows Container를 이용해서 게임서버를 운영해본 경험이 있으실까요…?

2개의 좋아요

아 역시 그랬군요…ㅠㅠ

그렇다면…대한민국에서 MMORPG 중에 Docker가 Main 서버인 경우는 잘 찾아보기 어려울 것 같기도 하네요…ㅎㅎ

설명 감사드립니다!!

2개의 좋아요

네. IOCP를 쓰는 VC++로 컴파일된 Win32 서버 애플리케이션을 윈도우 컨테이너에서 프로덕션으로 운영해본 경험이 있는 사람입니다. 멀리가서 찾으셨군요. ㅎㅎ :wink:

12개의 좋아요

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

우선 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개의 좋아요