SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
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/

Más contenido relacionado

La actualidad más candente

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
devCAT Studio, NEXON
 

La actualidad más candente (20)

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 

Destacado

Destacado (6)

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

Similar a 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-1340
Samsung Electronics
 
[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
 
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
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 

Similar a 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
 

Más de Seungmo Koo

Más de 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
 

Último

Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
Wonjun Hwang
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
Wonjun Hwang
 

Último (6)

MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

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/