요즘 잼있는 작업을 하고 있습니다.
다름이 아닌 Winsock2기반의 IOCP로 제작된 모듈을 닷넷에 적용을 시켜보는것인데 아주 흥미롭습니다. 일단 제작된 서버가 온라인 게임서버인 관계로 상당한 네트웍 부하와 CPU 점유율에 대해 민감
하므로 상당히 걱정되면서도 기대되는 작업이었습니다.
닷넷에 적용 시키기 위해서 MC++(Managed C++)을 사용했고, 덕분의 수많은 닷넷 라이브러리를
사용할 수 있었습니다.
닷넷쪽을 사용하면서 느낀 편리함은 아래 몇가지가 되는군요..
1. __gc 클래스 사용으로 편리해진 가비지 컬렉션
서버쪽에서는 큐나 스택을 많이 쓰는 관계로 개체의 생성 삭제에 대해서 상당히 많은 부담이
갑니다. 생성, 삭제 타임의 CPU점유율이나 시간이 문제가 된다는거죠.. 그래서 미리 다 만들어
놓는 풀 방식으로 가기도 하지만 대부분이 컬렉션을 해 주게됩니다. 이 부분 상당히 복잡하게
코딩을 해 주어야 하는데 .Net에서는 가비지 컬렉션이 클래스 단위로 처리할 수 있게 되어있더군요
하지만 일명 관리되는 메모리와 관리되지 않는 메모리와의 호환성 문제에서 약간 어려운면이...
2. 기존의 ThreadPool 및 Overlapped의 기본 지원
윈도우에서는 힘들게 접근해야 했던 부분이 쉽게 지원이 됩니다. 즉 일반적인 닷넷에서의 소켓은
(비동기 소켓)단순이 콜백만으로 모든 작업을 처리해 줍니다. 예전에 Overlapped 구조체와의
전쟁은 눈씼고 봐도 찾을 수 없을정도로 래핑이 되어있습니다. 그리고 닷넷에서는 모든 메시지는
ThreadPool을 통해 들어갔다 나왔다를 하기때문에 이 부분도 Winsock2 기반으로 하는 IOCP에서
처럼 따로 ThreadPool이나 BindIoCompletionCallback로 처리를 해 줄 필요가 없어졌습니다.
3. 쉬운 도움말 및 다양한 예제
정말 행복하게 제가 비절스튜디오 닷넷 한글판을 써서인지 필요한 라이브러리 도움말이 모조리
한글화 되어 있더군요..^^ 정말 행복한 일이였습니다. 그거 이외에도 정말 도움말만으로 모든
것이 해결될 정도로 풍부한 예제도 지원했습니다.
편리함 뒤에 성능의 저하가 있다고 했던가...
여하튼 우여곡절끝에 제가 찾은 최적의 방법으로 에코서버를 제작, 기존에 제작했던 IOCP 에코와
성능 비교에 들어갔습니다. 그런데 역시 좀 더 성능이 안나오더군요^^;;
CPU점유율에서 2000접속시 10% 가까이 되는 차이를 보입니다.
물론 IOCP를 제외한 다른 윈도 소켓 기법 보다는 뛰어나지만 역시 IOCP보다는....흐흐흐
하지만 프로토콜을 모두 달고, 실제 처리를 하게 되면 GC의 강력함으로 역전이 될수 있을지도
모르겠군요..
앞으로 시간날때 마다 조금씩 더 올리겠습니다.
그럼 이만
|