본문 바로가기

네트워크 프로그래밍/Netty

[박혜웅] MemoryAwareThreadPoolExecutor vs OrderedMemoryAwareThreadPoolExecutor

MemoryAwareThreadPoolExecutor는 flood control을 하여, OutofMemory를 방지하기 위해 쓰이는 클래스이다.
task의 memory size를 계산하여, 할당이상의 메모리를 사용할 경우 새 task를 block한다.
Runnalbe을 상속받은 task 클래스의 객체가 갖고 있는 변수들의 크기를 계산하여, 메모리 필요량을 계산한다.
MemoryAwareThreadPoolExecutor는 같은 channel에 대한 channel event(패킷)의 순서를 보장하지 않으므로, 패킷이 순차적으로 전달되야 하는 경우 OrderedMemoryAwareThreadPoolExecutor는 사용해야 한다. (예를 들어, 메시지를 보내고 채널을 닫았다고 하여도, 실제로 channel event는 반대 순서로 일어 날 수 있다.)

MemroyAwareThreadPoolExecutor가 스레드의 개수를 항상 일정히 유지하며, 사용하지 않는 스레드는 주기적으로(기본 30초) 재시작하여 비효율적임

3.2.3 Fianl까지 있었던 MemroyAwareThreadPoolExecutor의 dead lock 문제입니다. 다행히 3.2.4 Final에서는 고쳐졌다네요.
그래도 찜찜하면, 아래처럼 worker thread 개수를 넉넉히 지정하는 방법도 있을 듯합니다.
new NioServerSocketChannelFactory(..., 32)


OrderedMemoryAwareThreadPoolExecutor 
같은 channel에 대한 이벤트를 순차적으로 수행한다. 따라서 이전 이벤트 처리가 끝나기 전까지 다음 이벤트를 실행하지 않는다.
따라서 동시에 실행되도 되는 이벤트들을 처리하는데는 부적합하다. (예: 다수의 이미지 업로드)