DefaultChannelGroup 관련 문의드립니다.

49 views
Skip to first unread message

Lutters

unread,
Mar 3, 2022, 7:19:41 PMMar 3
to Netty Korean User Group
안녕하세요.  멀티룸 대화방을 만들어 볼려고 netty를 사용해서 개발중에 있습니다.

주요 컨셉은 방을 만들경우  DefaultChannelGroup을 신규로  만들어서 해당방에 명칭을 정해주고
ConcurrentHashMap에 방 정보를 기록하는 방식으로 하려합니다.

1. 신규 방 개설 시 

private static final ConcurrentHashMap<String, ChannelGroup> roomsInfo = new ConcurrentHashMap<>(); 

ChannelGroup channelGroup. = roomsInfo.putIfAbsent("방이름", 
  new DefaultChannelGroup(ImmediateEventExecutor.INSTANCE);
 if(channelGroup == null){
    roomsInfo.get("방이름").add(ctx.channel());
 }

2. 룸에 메시지 전송 시 
  ChannelGroup room = roomsInfo.get(방이름);
  if(room !=null ) {
        queueCounter.incrementAndGet(); 
        room.writeAndFlush("메시지").addListener(f -> {
                logger.info("send unsend message ={}", queueCounter.decrementAndGet();
         }
        );
   }

룸챗이 소량일때는 정상적으로 GC도 이뤄지지만
룸챗  메시지가 증가하고 queue가 누적될경우 OutOfMemory가 발생합니다. 
위 코드에서 

queueCounter.get()<100 일경우만 보내게 하면 또 문제가 없는걸로 봐서는
룸챗이 대량으로 발생하고 queueCounter가 증가할경우 지속적으로 메모리가 증가되고
속도도 느려지는것 같은데요..

속도를 올릴수 있는 방법이 있을까요?

아래 방법으로 하나씩 해봤는데요, 여전히 이유를 모르겠네요..

1)  JVM내 메모리를 증가 시켜도 동일 증상 발생
2)  ctx.channel().eventLoop().execute(() -> {room.writeAndFlush..}
3) ThreadPoolExecutor.execute(()->{room.writeAndFlush...}
4)  ChannelInitialize 에서  pipeline.addLast(new DefaultEventExecutorGroup(100), new PacketHandler());


Reply all
Reply to author
Forward
0 new messages