네트워크 패킷을 받는 worker thread에서 바로 로직 처리를 하는게 가장 좋다.

하지만 lock은 어쩔 수 없을듯..



출처 : http://javawork.egloos.com/2210019

worker thread와 logic thread의 운용에 대한 poll Programming

일반적으로 접속 혹은 접속종료을 감지하거나 패킷을 받는 일을 하는 하는 스레드를 워커스레드라고 하고 받은 패킷을 처리하는 일을 하는 스레드를 로직스레드라고 합니다. 프로그래머의 성향에 따라서 워커스레드가 로직처리까지 한다거나, 로직스레드를 하나만 둔다거나, 로직스레드를 다수로 운용하거나 하는 여러가지 방법이 있습니다. 

분류해 보면 대략 아래와 같은 그림이 나옵니다.



약간 부연 설명을 하자면
  • Model 1 : 로직스레드 없이 워커스레드에서 로직까지 처리하는 방법 입니다. 컨텍스트 스위칭이 적어서 잘 구성하면 최고의 성능을 낼수 있지만 네트워크 처리와 로직 처리에 대한 구분을 할 수 없어서 모듈화에는 좋지 않습니다.
  • Model 2 : 로직스레드 하나로 처리하는 방법입니다. 로직 처리시에 따로 lock을 걸지 않아도 되기 때문에 협업에 유리한 구조 입니다.
  • Model 3 : 로직스레드 다수로 처리하는 방법입니다. 로직스레드가 다수 이므로 lock정책을 잘 수립해야 합니다.
  • Model 4 : 3번 모델에서 큐를 여러개 두는 방식으로 변형된 방법입니다.
얼마전에 온라인 서버구조 토론회에서 발표자 중에 한분이 위의 이슈에 대한 poll을 하시길래 기록해 두었다가 제가 활동하는 온라인서버 제작자 모임 에서도 같은 주제로 poll을 해서 결과를 합산해 보았습니다. 결과는 아래와 같습니다.
  • Model 1 : 12 명
  • Model 2 : 27 명
  • Model 3 : 15 명
  • Model 4 :  7 명




표본 수가 충분하지는 않지만 게임 서버 프로그래머들의 작업 성향을 보여주는 데이터 인 것 같습니다.






출처 : http://projecteoe.egloos.com/2541442



Network Engine의 Multi-thread Processing 방식

Multi-Thread 환경에서 최고의 성능을 내기 위한 구현 방식이다.
구현하는데 있어 다소 복잡할 수 있다.


아래 설명은 non-blocking, asynchronous, overlapped방식의 IOCP를 기준으로 작성하였다.

1. Network-Job
network event가 발생했을 때 동작해야 하는 처리로
packet을 받아 필요한 내용을 실행시키거나
연결이 종료되었을 때의 처리등을 말한다.

2. Reserved-Job
특정 시간 후에 동작해야 하는 처리로 NPC의 AI처리 등이 해당된다.
특정 시간은 최소 100ms 부터 지원한다.

- Worker Thread에서 packet을 parsing한 후 packet queue를 사용하는 경우가 있는데
이는 multi-thread의 장점을 살리지 못하고
queue를 여러개 사용하거나 logic thread를 여러개 사용한다면
lock으로 인한 성능저하 및 context-switching으로 인한 성능저하가 발생하기 때문에
packet queue는 사용하지 않는다.
* http://javawork.egloos.com/2210019
* Model1 이어야 한다.


Network-Job은 IOCP에서 Worker Thread로 event를 할당해주기 때문에 Thread load balancing이 필요하지 않다.

Reserved-Job은 Thread load balancing을 직접 구현해야 한다.
-> IOCP를 사용할 수 있다.

이 때 Network-Job과 Reserved-Job을
1) 동일한 Thread에서 처리할 것인지
2) 별도의 Thread에서 처리할 것인지
선택이 필요하다.
-> Thread load balancing을 따로 구현하지 않고 IOCP를 사용하기 위해서 통합 관리한다.
또한 Network-Job을 처리하는 Thread pool과 Reserved-Job을 처리하는 Thread pool이 각각 동작할 경우
context-switching이 더 많이 발생 할 수 있다.

Network-Job과 Reserved-Job을 통합하여 Realtime-Job이라 한다.
Realtime-Job은 고성능 처리를 위해 처리 제한 시간을 가진다.
처리 제한 시간을 초과할 경우 처리지연이 발생했다고 하며 이를 예외처리 해야 한다.