인프런 커뮤니티 질문&답변

우웅님의 프로필 이미지
우웅

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

패킷 모아 보내기

메모리가 줄줄 새고 있습니다

해결된 질문

작성

·

438

0

안녕하세요 메모리 릭과 관련해서 질문 드립니다

비주얼 스튜디오에서 프로그램 실행시키면 진단 도구 창이 뜨고 그 안에 현재 프로세스가 얼마나 메모리 잡아 먹는지 보여주는데 콘솔에 로그 찍으면 메모리 계속 잡아먹으니까 서버와 클라 모두 콘솔에 아무것도 로그를 찍지 않게 빈 상태로 두었는데도 약 30초마다 3~5MB 씩 오릅니다 그래서 강의 자료에 있는 모든 코드를 복붙해서 어떤 로그도 안찍게 살짝 수정 후 실행했더니 결과는 동일하게 조금씩 오르더라구요

이 상태에서 서버는 계속 작동시키고 클라를 끄니까 메모리 릭 현상이 멈추긴 했습니다만

이 현상이 선생님 환경에서도 일어나는지 궁금하네요..

기본 서버 강의라서 아직 최적화가 덜 돼서 그런건지요..?

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

어떻게 테스트했는지에 따라 다르지만,
저 부분은 높은 확률로 SendBuffer를 Chunk에서 빼와서 그런 것인데요.
SendBuffer를 매 번 new 해서도 발생하는지 테스트를 해보시면 되겠습니다.

Chunk 특성상 모든 Send가 완성되지 않으면 해제가 되지 않아서
조금이라도 패킷 전송이 밀리면 메모리 릭이 일어나게 됩니다.
이전에 강의 소스코드 바탕으로 간단한 온라인 게임 출시
테스트까지 마쳤었는데 SendBuffer와 일부 try catch 구문이 누락되긴 했었지만
그 외 크게 다른 문제 없었습니다.

물론 강의 마지막에서 Job을 사용하면 조금 더 주의해야 하긴 하는데요.
아마 질문주신 부분은 그 부분은 아닌 것 같아 생략하겠습니다.

우웅님의 프로필 이미지
우웅
질문자

SendBuffer를 매 번 new 해서도 발생하는지 테스트를 해보시면 되겠습니다 /

이렇게 수정 맞나요? 이렇게 해도 해결은 안되네요

크기 4096은 패킷 wirte 에서 4096이여서 저렇게 했습니다

public static ThreadLocal<SendBuf> CurrentBuffer = new ThreadLocal<SendBuf>(() => { return null; });

public static int ChunkSize { get; set; } = 4096;

public static ArraySegment<byte> open(int reserveSize)
{
    //if (CurrentBuffer.Value == null)
    //    CurrentBuffer.Value = new SendBuf(ChunkSize);

    //if (CurrentBuffer.Value._free_size < reserveSize)
    //    CurrentBuffer.Value = new SendBuf(ChunkSize);
    CurrentBuffer.Value = new SendBuf(ChunkSize);
    return CurrentBuffer.Value.open(reserveSize);
}

 

우웅님의 프로필 이미지
우웅
질문자

추가적으로 다른 pc 에서도 이것 저것 실험하는데 메모리 릭이 발생하네요

둘다 visual studio 2022 버젼입니다

Rookiss님의 프로필 이미지
Rookiss
지식공유자

BufferChunk를 아예 사용하지 않는 쪽으로 바꿔보면 되는데
현재 GenPackets 쪽 코드가 엮여 있어서 고치기가 힘들거에요.
궁극적으로 Part7에서는 Protobuf로 교체가 일어나는데
그 때에는 Chunk를 사용하지 않고

image요런 느낌으로 sendbuffer를 그냥 다시 생성합니다.

우웅님의 프로필 이미지
우웅

작성한 질문수

질문하기