서버/RIO

기본 개념

MAKGA 2021. 9. 23. 20:33
320x100

IOCP는 IO operation 마다 버퍼 영역에 대한 page-lock/unlock이 필요하고, 이는 많은 CPU 연산을 필요로 한다.

(하나의 IO operation 마다 시스템콜 호출, 유저-커널모드 switching 발생)

Zero-recv같은 우회방법으로 page locking을 회피 했었다.

 

이런 문제점을 해결하기 위해 IO에 사용할 물리메모리를 고정시켜두고 사용하는 방법으로 RIO가 등장하며 매 IO마다 page-lock/unlock이 필요 없어졌다.

단점으로는 메모리를 미리 선점하는 형식이기 때문에 미사용 하는 메모리의 양이 존재한다.

 

IOCP와의 차이점은 IOCP의 경우엔 그저 해당 핸들로 Post, Get 전부 Thread Safe하게 사용할 수 있었지만, RIO의 Request Queue (RQ)와 Completion Queue (CQ)가 Thread Safe 하지 않다는 것이다.

 

그래서 주로 사용하는 방법이 TCP의 세션을 특정 스레드에 고정시켜 사용하는 것이다.

State Full 서버라면 특정 기준(맵 등)으로 스레드를 나누고 해당 스레드에 유저를 넣어두면 별 문제 없을 듯 하다.

+ 소켓의 Send, Recv, Close 함수들을 1개의 lock으로 묶어서 사용하자.

 

UDP라면 Connection을 유지할 필요가 없기 때문에 더 쉽게 사용할 수 있을 듯 하다.

 

여기에 RIO가 물리 메모리를 사용한다는 점을 NUMA와 함께 고려한다면, CPU와 가까운 큰 메모리 블럭을 할당받고, TCP 세션별로 나눠서 사용하는 것도 생각해볼 수 있다.

 

그리고 Hyper Thread 환경에서 1개의 코어에서 2개의 스레드를 돌리는 것 보단 Affinity를 조절해 1코어에서 1스레드를 사용하는 것이 성능상의 이점을 가지고 갈 수 있다고 한다.

아무래도 스레드별 lock과 메모리 이슈가 아닐까..? 내용 보강이 필요하다

 

 

https://jacking.tistory.com/1177

 

Windows Registered I/O(RIO) 공부하기

Windows 8부터 새로 생긴 WinSock의 확장 기능. TCP, UDP, 멀티캐스트 UDP, IPv4, IPv6 모두 지원한다. 아주 높은 성능과 많은 송수신, 예측 가능성을 필요로 하는 애플리케이션에서 사용하면 네트워크 대기

jacking.tistory.com

 

https://www.slideshare.net/sm9kr/windows-registered-io-rio

 

Windows Registered I/O (RIO) vs IOCP

Windows 8 및 Windows Server 2012의 새로운 Network Extensions인 RIO에 대한 소개와 성능 평가, 그리고 샘플 코드입니다.

www.slideshare.net

 

http://www.serverframework.com/asynchronousevents/rio/

 

AsynchronousEvents: Winsock Registered I/O Archives

Most of the buzz being generated around the Windows 8 Developer Previews at the moment seems to be centred on the new Metro user interface and the Windows Runtime. Whilst both Metro and WinRT are key components of the next Windows release I find the Regist

www.serverframework.com

 

https://gist.githubusercontent.com/ujentus/5997058/raw/48e75cf2f585ae00b19c3217a7da9e98d80f150b/RIOServer_sm9.cpp

 

https://github.com/unicomp21/RIO.lib

 

GitHub - unicomp21/RIO.lib: A library of utility classes for leveraging the Registered i/o api present in Microsoft Windows Serv

A library of utility classes for leveraging the Registered i/o api present in Microsoft Windows Server 2012, great for HFT or low latency programmers - GitHub - unicomp21/RIO.lib: A library of util...

github.com

 

https://github.com/zeliard/RIOTcpServer/tree/RioWithIocp

 

GitHub - zeliard/RIOTcpServer: High Performance TCP server example using Windows Registered I/O (RIO)

High Performance TCP server example using Windows Registered I/O (RIO) - GitHub - zeliard/RIOTcpServer: High Performance TCP server example using Windows Registered I/O (RIO)

github.com

 

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh997032(v=ws.11)?redirectedfrom=MSDN 

 

Registered Input-Output (RIO) API Extensions

Registered Input/Output (RIO) API Extensions 08/31/2016 2 minutes to read In this article --> Applies To: Windows Server 2012 Registered Input/Output (RIO) API Extensions The RIO API is a new extension to Windows Sockets (Winsock) and provides an opportuni

docs.microsoft.com

 

https://docs.microsoft.com/ko-kr/windows/win32/winsock/what-s-new-for-windows-sockets-2?redirectedfrom=MSDN 

 

Windows 소켓의 새로운 기능 - Win32 apps

Windows 소켓의 새로운 기능

docs.microsoft.com

 

 

관련 논문

http://www.koreascience.kr/article/JAKO202007650437076.pdf

 

320x100

'서버 > RIO' 카테고리의 다른 글

RIO Function table 구조체  (0) 2022.10.02