SlideShare a Scribd company logo
1 of 18
Download to read offline
Windows Registered I/O (RIO)
Introduction & Performance
Seungmo Koo (@sm9kr)
대한민국 온라인 게임 서버 제작자 모임
Agenda
• IOCP: I/O Completion Port
• RIO: Registered I/O Network Extensions
• 성능 평가
• 결론
• Source Code Sample
IOCP 개요
• 다들 잘 아시는 것
– Proactor 방식의 고성능 I/O Notification Model
• 비동기 I/O 지원

– Windows OS가 직접 효율적인 쓰레드 풀링 제공
• context-switching을 줄이는 효과

– Overlapped I/O 지원
• 커널영역과 유저영역의 버퍼 공유 (memory page-locking)

• 그럼에도 불구하고,
– 하나의 I/O operation마다 버퍼 영역에 대한 page-lock/unlock
• 특정 메모리에 대한 Pin/Unpin은 많은 CPU cycle요구
• 그래서 RECV를 posting 할 때, page-locking을 피하여 CPU cycle을
줄이기 위해 zero-byte recv 꼼수를 사용해왔음

– 하나의 I/O operation마다 시스템콜 호출
• 유저모드-커널모드 전환 발생
IOCP 동작구조
• 기본적인 처리 흐름
– I/O initiation  I/O processing  I/O completion

• I/O Initiation
User Virtual Address
Space

WSARecv(socket, buffer)

App
Physical Memory

User
Kernel

Winsock
I/O Manager
WS/Transport

I/O Request

NIC
IOCP 동작구조
• I/O Processing
User Virtual Address
Space

WSARecv(socket, buffer)
App
Physical Memory

User
Kernel

Winsock
I/O Manager
WS/Transport

I/O Request

NIC

DMA

Scatter/gather I/O
를 지원하는 NIC에
서는 User버퍼로 바
로 DMA될 수 있음
IOCP 동작구조
• I/O Completion
User Virtual Address
Space

WSARecv(socket, buffer)
App

GQCS()
Physical Memory

User
Kernel

Winsock
unlock

I/O Manager
WS/Transport

I/O Request

NIC
RIO 개요
• Lower latency and jitter를 위해
– 지연의 최소화 및 튀지 않는(?) 안정성 (예측가능성)
– (예) 북미의 주식시세 정보 방송: 초당 5백만 업데이트 필요
– (예) Database 서버나 UDP 스트리밍 같은 곳에서는 초당 패킷
처리량이 높을수록 최고의 성능을 뽑음
• 엄청난 수의 작은 패킷 처리에 유리함 (by MS)

• 특징
– I/O에 사용할 고정 크기의 버퍼를 등록하는 개념
• 물리 메모리에 필요한 버퍼를 항상 pin해놓고 쓰기 때문에 매번의
I/O마다 page-lock/unlock이 없음
• 메모리 사용량과 CPU사용량간의 Trade-off
• I/O 버퍼 핸들링을 실제 I/O에서 분리하여 I/O 비용 감소 시킴

– RIO에서는 커널 소켓 버퍼는 의미 없음
• SO_SNDBUF, SO_RCVBUF
RIO Buffer 등록
• RIO에서 사용할 고정 버퍼 등록 과정
– RB: User영역과 Kernel영역이 공유하는 페이지로 PIN됨
• RIODeregisterBuffer하기 전까지 계속 locking
User Virtual Address
Space

App

User
Kernel

RIORegisterBuffer(buf,size)

RB ID

Physical Memory

Winsock
lock

I/O Manager

WS/Transport

RB

NIC
RIO RQ/CQ 등록
• RIO에서 사용할 고정 크기의 RQ 및 CQ 등록
– 모든 I/O요청은 RequestQueue (RQ)를 통해 이루어짐
– I/O 완료에 대한 통지는 CompletionQueue (CQ)를 통해 처리

App

RIOCreateCQ(size)
RIOCreateRQ(sock, CQ)

Winsock

RQ
CQ

User
Kernel

I/O Manager

WS/Transport
NIC
RIO 동작구조
• I/O 처리 과정
– DequeueCompletion시 복수개의 I/O완료 통지가 옴
• 한번의 과정으로 CQ에 큐잉되어 있던 여러 개의 I/O 처리
App

RIOReceive(RQ, RBID)

Winsock
User
Kernel

RIODequeueCompletion(CQ)
RIONotify(CQ)

RQ

R

C
CQ

I/O Manager

WS/Transport

R
NIC

C
성능 평가
• MS의 성능평가
– RIO 사용시 Latency가 15~30% 가량 줄어들었다고 함
– RIO 사용시 Throughput이 최대 2배 되었다고 함 (Datagrams/s)

• 직접 해본 성능평가 (IOCP vs RIO)
– 사용 장비
• 클라이언트: i7-4770k, 16GB RAM, 1Gbps LAN, Windows 8
• 서버: Mac-mini server 2012 late, Windows Server 2012

– 1024 byte UDP 패킷 5천만개 전송 테스트
• IOCP와 RIO의 경우 모두 1Gbps 대역 full로 활용함
– 그러다보니 두 경우 모두 throughput과 UDP 드랍률이 비슷
» 즉, 의미 있는 결과 못냄 (10Gbps 대역에서는 차이가 많이 날 듯?)

– 그러나, 같은 상황에서
• RIO가 CPU사용률 약 2배 낮았음
• RIO의 context-switches/sec가 6배 가량 낮았음
CPU Usage

IOCP

약 20%

RIO
약 10%
System Calls Per Second

IOCP

217,991,452

RIO
16,268,070
Context Switches Per Second

IOCP

74,182,111

RIO
11,926,964
결론?
• RIO가 성능은 확실히 좋음
– Throughput: MS에 의하면 2배 가량 좋아진다고 함
– CPU 사용률 등: 직접 성능 테스트 결과 월등히 좋음
• Context-switching 및 System call 횟수도 훨씬 낮음

• 그런데…
– 굳이 고성능 게임 서버용으로 RIO까지 쓸 필요가 있을까?
• 점점 좋아지는 머신 성능, 더 복잡한 코딩 방법, MS 플랫폼 종속, …
• Gigabit 네트워크 상에서의 throughput의 경우에
– IOCP 뿐만 아니라 Linux의 EPOLL과도 별 차이 없었음

• 게임 서버당 Gigabit 이상의 대역이 필요한 경우 다시 생각해봐도?
– 트래픽이 많은 게임서버라고 해봤자 300~400Mbps 정도
– 이 정도의 대역을 사용하는 경우, CPU 사용률의 차이도 적어짐
Sample Code
• 어디에도 제대로 된 샘플 코드가 없어서 직접 구현
– MSDN 문서 조차도 제대로 되어 있지 않음
• 수많은 삽질…

– 최소한의 동작을 위한 코드만 들어 있음
– 버그에 대한 책임 없음

• Source Code: RIO Echo Server
– TCP, RIO only
• https://github.com/zeliard/RIOTcpServer

– UDP, IOCP+RIO
• https://github.com/zeliard/RIOEchoServer
[Update] RIO 사용시 주의할 점
• RIO의 이벤트 통지
– IOCP 또는 윈도우 Event를 이용하여 I/O 이벤트 통지를 받을 수 있
지만 추천하지 않음  시스템 콜 횟수가 늘어나서 성능 저하
• 앞의 성능 평가는 IOCP를 이벤트 통지 모델로 사용한 경우였음
– 이렇게 해도 컨텍스트 스위칭이 6배 가량 낮았지만,
– IOCP와 같은 이벤트 통지 없이 순수 RIODequeueCompletion만을 이용하는
것이 최고의 성능을 냄. 단, Sleep or WaitableTimer등을 이용하여 CPU 사용
률 낮추는게 필요 (TCP버전의 소스코드 참고)

• Request/Completion Queue
– Thread-safe하지 않기 때문에 정교한 설계가 필요함
• (예) 세션 별로 특정 전담 thread 할당

– CQ는 thread별로, RQ는 socket별로 만드는 것이 구조 및 효율면에
서 좋음

• NUMA 장비에서 RIO
– RIO가 user-level communication 방식인 관계로 타 CPU의 코어를
골고루 사용하는데 한계가 있음
참고 자료
• Tech to Develop Low Latency Apps, Build 2011.
– http://channel9.msdn.com/Events/Build/BUILD2011/SAC593T/player?w=960&h=544

• The Server Framework
– http://www.serverframework.com/asynchronousevents/rio/

More Related Content

What's hot

임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍Seungmo Koo
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화Seungmo Koo
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기iFunFactory Inc.
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...Amazon Web Services Korea
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조Hyunjik Bae
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 

What's hot (20)

임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 

Viewers also liked

NHN NEXT 2014년도 게임트랙 소개
NHN NEXT 2014년도 게임트랙 소개 NHN NEXT 2014년도 게임트랙 소개
NHN NEXT 2014년도 게임트랙 소개 Seungmo Koo
 
게임제작개론 : #0 과목소개
게임제작개론 : #0 과목소개게임제작개론 : #0 과목소개
게임제작개론 : #0 과목소개Seungmo Koo
 
게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링Seungmo Koo
 
게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅Seungmo Koo
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가Seungmo Koo
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 

Viewers also liked (6)

NHN NEXT 2014년도 게임트랙 소개
NHN NEXT 2014년도 게임트랙 소개 NHN NEXT 2014년도 게임트랙 소개
NHN NEXT 2014년도 게임트랙 소개
 
게임제작개론 : #0 과목소개
게임제작개론 : #0 과목소개게임제작개론 : #0 과목소개
게임제작개론 : #0 과목소개
 
게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링게임서버프로그래밍 #5 - 데이터베이스 핸들링
게임서버프로그래밍 #5 - 데이터베이스 핸들링
 
게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅게임서버프로그래밍 #6 - 예외처리 및 로깅
게임서버프로그래밍 #6 - 예외처리 및 로깅
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 

Similar to Windows Registered I/O (RIO) vs IOCP

kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들Hyunjik Bae
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선NAVER D2
 
주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기Yeonhee Kim
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅NAVER D2
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
Rhea mmo node_for_share
Rhea mmo node_for_shareRhea mmo node_for_share
Rhea mmo node_for_shareRhea Strike
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD활 김
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)Sang Don Kim
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1Jinkyoung Kim
 
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)Jongwon Han
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Jongwon Han
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스Dan Kang (강동한)
 
서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기YEONG-CHEON YOU
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 

Similar to Windows Registered I/O (RIO) vs IOCP (20)

kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
 
주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Rhea mmo node_for_share
Rhea mmo node_for_shareRhea mmo node_for_share
Rhea mmo node_for_share
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD
 
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
 
Place site Design
Place site DesignPlace site Design
Place site Design
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)
DV 환경에서 PG 연동하기 ('우리 안의 소리', 2015-11-19)
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
 
서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기
 
LTM
LTMLTM
LTM
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 

More from Seungmo Koo

Understanding Tech Debt
Understanding Tech Debt Understanding Tech Debt
Understanding Tech Debt Seungmo Koo
 
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링Seungmo Koo
 
게임제작개론 : #9 라이브 서비스
게임제작개론 : #9 라이브 서비스게임제작개론 : #9 라이브 서비스
게임제작개론 : #9 라이브 서비스Seungmo Koo
 
게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스Seungmo Koo
 
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해Seungmo Koo
 
게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해Seungmo Koo
 
게임제작개론 : #5 플레이어에 대한 이해
게임제작개론 : #5 플레이어에 대한 이해게임제작개론 : #5 플레이어에 대한 이해
게임제작개론 : #5 플레이어에 대한 이해Seungmo Koo
 
게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱Seungmo Koo
 
게임제작개론: #3 간접통제와 게임 커뮤니티
게임제작개론: #3 간접통제와 게임 커뮤니티게임제작개론: #3 간접통제와 게임 커뮤니티
게임제작개론: #3 간접통제와 게임 커뮤니티Seungmo Koo
 
게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소Seungmo Koo
 
게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해Seungmo Koo
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개Seungmo Koo
 
Game Developer Magazine, May 2012, Supplemental Info
Game Developer Magazine, May 2012, Supplemental InfoGame Developer Magazine, May 2012, Supplemental Info
Game Developer Magazine, May 2012, Supplemental InfoSeungmo Koo
 

More from Seungmo Koo (13)

Understanding Tech Debt
Understanding Tech Debt Understanding Tech Debt
Understanding Tech Debt
 
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링
게임서버프로그래밍 #3 - 메모리 및 오브젝트 풀링
 
게임제작개론 : #9 라이브 서비스
게임제작개론 : #9 라이브 서비스게임제작개론 : #9 라이브 서비스
게임제작개론 : #9 라이브 서비스
 
게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스
 
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
 
게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해
 
게임제작개론 : #5 플레이어에 대한 이해
게임제작개론 : #5 플레이어에 대한 이해게임제작개론 : #5 플레이어에 대한 이해
게임제작개론 : #5 플레이어에 대한 이해
 
게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱게임제작개론 : #4 게임 밸런싱
게임제작개론 : #4 게임 밸런싱
 
게임제작개론: #3 간접통제와 게임 커뮤니티
게임제작개론: #3 간접통제와 게임 커뮤니티게임제작개론: #3 간접통제와 게임 커뮤니티
게임제작개론: #3 간접통제와 게임 커뮤니티
 
게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소
 
게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개
 
Game Developer Magazine, May 2012, Supplemental Info
Game Developer Magazine, May 2012, Supplemental InfoGame Developer Magazine, May 2012, Supplemental Info
Game Developer Magazine, May 2012, Supplemental Info
 

Windows Registered I/O (RIO) vs IOCP

  • 1. Windows Registered I/O (RIO) Introduction & Performance Seungmo Koo (@sm9kr) 대한민국 온라인 게임 서버 제작자 모임
  • 2. Agenda • IOCP: I/O Completion Port • RIO: Registered I/O Network Extensions • 성능 평가 • 결론 • Source Code Sample
  • 3. IOCP 개요 • 다들 잘 아시는 것 – Proactor 방식의 고성능 I/O Notification Model • 비동기 I/O 지원 – Windows OS가 직접 효율적인 쓰레드 풀링 제공 • context-switching을 줄이는 효과 – Overlapped I/O 지원 • 커널영역과 유저영역의 버퍼 공유 (memory page-locking) • 그럼에도 불구하고, – 하나의 I/O operation마다 버퍼 영역에 대한 page-lock/unlock • 특정 메모리에 대한 Pin/Unpin은 많은 CPU cycle요구 • 그래서 RECV를 posting 할 때, page-locking을 피하여 CPU cycle을 줄이기 위해 zero-byte recv 꼼수를 사용해왔음 – 하나의 I/O operation마다 시스템콜 호출 • 유저모드-커널모드 전환 발생
  • 4. IOCP 동작구조 • 기본적인 처리 흐름 – I/O initiation  I/O processing  I/O completion • I/O Initiation User Virtual Address Space WSARecv(socket, buffer) App Physical Memory User Kernel Winsock I/O Manager WS/Transport I/O Request NIC
  • 5. IOCP 동작구조 • I/O Processing User Virtual Address Space WSARecv(socket, buffer) App Physical Memory User Kernel Winsock I/O Manager WS/Transport I/O Request NIC DMA Scatter/gather I/O 를 지원하는 NIC에 서는 User버퍼로 바 로 DMA될 수 있음
  • 6. IOCP 동작구조 • I/O Completion User Virtual Address Space WSARecv(socket, buffer) App GQCS() Physical Memory User Kernel Winsock unlock I/O Manager WS/Transport I/O Request NIC
  • 7. RIO 개요 • Lower latency and jitter를 위해 – 지연의 최소화 및 튀지 않는(?) 안정성 (예측가능성) – (예) 북미의 주식시세 정보 방송: 초당 5백만 업데이트 필요 – (예) Database 서버나 UDP 스트리밍 같은 곳에서는 초당 패킷 처리량이 높을수록 최고의 성능을 뽑음 • 엄청난 수의 작은 패킷 처리에 유리함 (by MS) • 특징 – I/O에 사용할 고정 크기의 버퍼를 등록하는 개념 • 물리 메모리에 필요한 버퍼를 항상 pin해놓고 쓰기 때문에 매번의 I/O마다 page-lock/unlock이 없음 • 메모리 사용량과 CPU사용량간의 Trade-off • I/O 버퍼 핸들링을 실제 I/O에서 분리하여 I/O 비용 감소 시킴 – RIO에서는 커널 소켓 버퍼는 의미 없음 • SO_SNDBUF, SO_RCVBUF
  • 8. RIO Buffer 등록 • RIO에서 사용할 고정 버퍼 등록 과정 – RB: User영역과 Kernel영역이 공유하는 페이지로 PIN됨 • RIODeregisterBuffer하기 전까지 계속 locking User Virtual Address Space App User Kernel RIORegisterBuffer(buf,size) RB ID Physical Memory Winsock lock I/O Manager WS/Transport RB NIC
  • 9. RIO RQ/CQ 등록 • RIO에서 사용할 고정 크기의 RQ 및 CQ 등록 – 모든 I/O요청은 RequestQueue (RQ)를 통해 이루어짐 – I/O 완료에 대한 통지는 CompletionQueue (CQ)를 통해 처리 App RIOCreateCQ(size) RIOCreateRQ(sock, CQ) Winsock RQ CQ User Kernel I/O Manager WS/Transport NIC
  • 10. RIO 동작구조 • I/O 처리 과정 – DequeueCompletion시 복수개의 I/O완료 통지가 옴 • 한번의 과정으로 CQ에 큐잉되어 있던 여러 개의 I/O 처리 App RIOReceive(RQ, RBID) Winsock User Kernel RIODequeueCompletion(CQ) RIONotify(CQ) RQ R C CQ I/O Manager WS/Transport R NIC C
  • 11. 성능 평가 • MS의 성능평가 – RIO 사용시 Latency가 15~30% 가량 줄어들었다고 함 – RIO 사용시 Throughput이 최대 2배 되었다고 함 (Datagrams/s) • 직접 해본 성능평가 (IOCP vs RIO) – 사용 장비 • 클라이언트: i7-4770k, 16GB RAM, 1Gbps LAN, Windows 8 • 서버: Mac-mini server 2012 late, Windows Server 2012 – 1024 byte UDP 패킷 5천만개 전송 테스트 • IOCP와 RIO의 경우 모두 1Gbps 대역 full로 활용함 – 그러다보니 두 경우 모두 throughput과 UDP 드랍률이 비슷 » 즉, 의미 있는 결과 못냄 (10Gbps 대역에서는 차이가 많이 날 듯?) – 그러나, 같은 상황에서 • RIO가 CPU사용률 약 2배 낮았음 • RIO의 context-switches/sec가 6배 가량 낮았음
  • 13. System Calls Per Second IOCP 217,991,452 RIO 16,268,070
  • 14. Context Switches Per Second IOCP 74,182,111 RIO 11,926,964
  • 15. 결론? • RIO가 성능은 확실히 좋음 – Throughput: MS에 의하면 2배 가량 좋아진다고 함 – CPU 사용률 등: 직접 성능 테스트 결과 월등히 좋음 • Context-switching 및 System call 횟수도 훨씬 낮음 • 그런데… – 굳이 고성능 게임 서버용으로 RIO까지 쓸 필요가 있을까? • 점점 좋아지는 머신 성능, 더 복잡한 코딩 방법, MS 플랫폼 종속, … • Gigabit 네트워크 상에서의 throughput의 경우에 – IOCP 뿐만 아니라 Linux의 EPOLL과도 별 차이 없었음 • 게임 서버당 Gigabit 이상의 대역이 필요한 경우 다시 생각해봐도? – 트래픽이 많은 게임서버라고 해봤자 300~400Mbps 정도 – 이 정도의 대역을 사용하는 경우, CPU 사용률의 차이도 적어짐
  • 16. Sample Code • 어디에도 제대로 된 샘플 코드가 없어서 직접 구현 – MSDN 문서 조차도 제대로 되어 있지 않음 • 수많은 삽질… – 최소한의 동작을 위한 코드만 들어 있음 – 버그에 대한 책임 없음 • Source Code: RIO Echo Server – TCP, RIO only • https://github.com/zeliard/RIOTcpServer – UDP, IOCP+RIO • https://github.com/zeliard/RIOEchoServer
  • 17. [Update] RIO 사용시 주의할 점 • RIO의 이벤트 통지 – IOCP 또는 윈도우 Event를 이용하여 I/O 이벤트 통지를 받을 수 있 지만 추천하지 않음  시스템 콜 횟수가 늘어나서 성능 저하 • 앞의 성능 평가는 IOCP를 이벤트 통지 모델로 사용한 경우였음 – 이렇게 해도 컨텍스트 스위칭이 6배 가량 낮았지만, – IOCP와 같은 이벤트 통지 없이 순수 RIODequeueCompletion만을 이용하는 것이 최고의 성능을 냄. 단, Sleep or WaitableTimer등을 이용하여 CPU 사용 률 낮추는게 필요 (TCP버전의 소스코드 참고) • Request/Completion Queue – Thread-safe하지 않기 때문에 정교한 설계가 필요함 • (예) 세션 별로 특정 전담 thread 할당 – CQ는 thread별로, RQ는 socket별로 만드는 것이 구조 및 효율면에 서 좋음 • NUMA 장비에서 RIO – RIO가 user-level communication 방식인 관계로 타 CPU의 코어를 골고루 사용하는데 한계가 있음
  • 18. 참고 자료 • Tech to Develop Low Latency Apps, Build 2011. – http://channel9.msdn.com/Events/Build/BUILD2011/SAC593T/player?w=960&h=544 • The Server Framework – http://www.serverframework.com/asynchronousevents/rio/