답변 다시는 분이 없어서 부끄럽지만 제가 아는 대로 답해보겠습니다.
질문자께서 정의하신 group이 worker group을 의미하는 거라면(boss group과 worker group은 하는 일이 다릅니다),
이 설정값은 동시에 처리할 수 있는 채널의 개수를 의미합니다. (동시 접속수가 아닙니다)
통상적으로 질문자가 등록했을 decoder의 decode()와 handler의 channelRead() 메서드가 수행되는 동안 하나의 워커를 점유하게 됩니다.
이 부분에서 지연이 발생한다면 앞단에서는 여유가 생길 때까지 기다릴 수 밖에 없지요.
소켓 연결을 처리하는 부분은 위에서 언급했던 boss group이 처리하는 부분으로 일반적인 경우 1로 설정하여도 충분합니다.
File description의 늘어나는 문제는 단순히 thread 갯수와 연관지어 생각할 수는 없습니다.
client가 연결을 유지하는지, read time-out은 얼마인지? worker가 처리하는 비즈니스 로직이 얼마나 걸리는지,
무슨 일을 하는지(이 곳에서도 파일을 열 수도 있겠지요) 등 고려해야할 변수가 많습니다.
웹서비스를 예로 든다면, 트래픽이 몰려서 worker가 처리하는 부분에서 지연이 발생하는 경우를 가정해 보겠습니다.
클라이언트 입장에서 socket이 연결된 뒤 요청을 보내고 나서는 read time out이 발생할 때까지 기다리고 있을 것입니다.
이 때 소켓 연결 수가 제한되지 않았다면 이런 연결이 계속 늘어서 결국에는 파일오픈 갯수를 초과하여 서비스가 폭발하고 말 것입니다.
이런 경우에는 worker 개수를 늘려줘야 오히려 파일오픈 수가 줄어 들겠지요.
그럼 얼마까지 올려줘야 하는냐 하면, 그 답은 서비스에 따라 다르다 입니다.
우선은 CPU가 놀지 않고 적당하게 부하가 올라가는 수치를 찾아야 하겠지요. (CPU는 놀면서 위와 같은 이유로 서비스가 죽을 수도 있습니다)
그리고 나서 용량을 초과하는 요청이 들어오지 못하도록 앞단에 배압 로직을 추가해야 할 것 입니다.
병목이 발생하는 부분은 다양합니다. 의외로 CPU 부하 자체가 1차 원인이 되어 서비스가 죽는 경우는 많지 않습니다.
참고로, Case 1의 경우는 소스를 확인해 보면, 최대 worker thread 갯수가 Runtime.getRuntime().availableProcessors() * 2 입니다.
이상입니다.
혹시 잘못 기술한 부분이 있다면 너그러운 마음으로 지적해주시면 감사하겠습니다.
2019년 5월 16일 목요일 오후 1시 23분 16초 UTC+9, JunGyun Lee 님의 말: