wxgame의 C/S화는 twisted 버전을 끝으로 일단 마무리 합니다.
By SeukWon Kang
앞으로도 자잘한 수정들은 있겠지만 큰 변화나 추가는 없을 듯 합니다.
이번에 twisted 버전을 작업하면서 오랫만에 다시 twisted를 만져 봤는데 예전에 테스트한 기억 보다 많이 빨라진 듯 합니다.
twistedtest.py를 보면 테스트 할 때 사용한 코드가 있습니다만 비록 echo 서버긴 하지만 초당 10만 패킷을 넘게 처리 하는 군요. ( intel 2500, pypy 사용, Int32StringReceiver 프로토콜, epoll reactor 사용.) 이 정도면 거의 대부분의 서버에서 필요한 성능을 충족시킬 수 있을 것 같습니다.
epoll reactor를 사용할 경우 6만 정도의 동시 커넥션 상태에서도 6만 패킷/초 이상을 꾸준히 처리 할 수 있습니다.
wxgame2server.py 와 netlib.py 를 보면 알게 되겠지만 원래는 twisted를 사용하지 않고 독자적인 네트웍 레이어를 만들어 쓰고 있었습니다. wxgame2server가 그 코드고 이를 정리해서 재 사용 가능한 라이브러리를 만들려고 한 결과물이 netlib.py 입니다.
만들어 놓고 성능 테스트를 진행했는데 select 를 사용하니 동시 커넥션 수가 수십을 넘어가면 성능 저하가 심하며 1000 커넥션을 넘어가면 파이썬이 오류를 일으킵니다. ( python 2.7, pypy 2.2 모두 ) 그래서 epoll 로 수정하려고 코드를 이리 저리 고치고 또 다른 라이브러리를 참고하다 보니 구조가 점점 twisted와 유사해 지게 되더군요. 그렇다면 새로 만드느니 이미 존재하는 라이브러리를 조금 손 봐서 써야지 하고 twisted 코드를 보다가 성능 테스트를 해보니 꽤 만족스러운 성능이 나옵니다.
참고로 제가 만든 select./socket 기반 라이브러리(I32ClientProtocol)는 대충 20000/sec ( memoryview등을 사용 효율을 꽤 중시해서 코딩했습니다만.. )
multiprocessing.Pipe 를 사용한 ChannelPipe 를 사용한 통신은 65000/sec 정도 나왔습니다. ( 동일한 환경/조건은 아닙니다만.. )
그런데 twisted , Int32StringReceiver 을 사용한 테스트는 100000/sec 정도가 나오니 그냥 쓰는 것이 정답이겠지요.
재미있는 것은 제 기억에는 Int32StringReceiver 는 이렇게 빠르지 않았습니다. 그래서 코드를 보니 예전과 달리 메모리 복사를 줄이는 쪽으로 코드 수정이 꽤 많이 이루어져 있었습니다.
그래서 코드를 복사해다가 조금 더 튜닝을 시도해봤는데 테스트를 돌려보니 유의미한 차이가 나지 않았습니다. 그래서 그냥 쓰는 것으로 결정.
그래서 정리하면 - readme.md에도 적혀 있습니다. (영어로 ;; ) wxgame 은 모두 3가지 버전이 있습니다.
twisted 버전 twservers.py, twclient.py
제가만든 select기반 라이브러리 버전 wxgame2server.py, wxgame2npc.py, wxgame2client.py
네트웍이 없는 독립 버전 wxgame2single.py
네트웍이 되는 프로그램들 끼리는 프로토콜이 같으니 서로 연동 시킬 수 있습니다.
그리고 wxpython을 사용하지 않는 서버사이드 프로그램들은 pypy에서 잘 작동합니다.