센드 리시브 버퍼를 살리고 싶어서 몇가지 물어봅니다.
483
작성한 질문수 3
강사님 께서는:
SendBufferHelper(버퍼)가 세션 외부에 있는 상황은 바람직 하지만
플레이어 세션중(PacketSession)하나가 send() 처리를 못하고 이런 일회용 버퍼를 계속 물고 있을 수 있다.
(ex 사용자가 엘리베이터를 타서 통신이 안되는 경우)
그럼 참조정리를 못하니 GC가 수거를 안해간다.
이 버퍼 릭킹 문제를 처리하기 위해 레퍼런스 카운트를 적용할수도 있다 라고 말씀하셨는데. C#에서 이를 구현하는데 난관이 있어서요(그점도 이미 말씀하셨었죠), 아래와 같습니다.
레퍼런스 카운트 사용 방식 (예상)
만약 100명의 사용자에게 브로드 캐스팅 할경우 이 버퍼에 대한 레퍼런스 카운트를 100으로 세팅한다.
각 세션에서(100개) 각각 send에 성공해서 버퍼에 대한 참조가 끝날 때마다 1씩 감소시킨다.
이 카운트 감소 처리를 할때 쓰레드 동기화에 신경써야 한다.
문제 1 ) 이런 동기화 처리도 성능에 영향을 준다. 레퍼런스 카운트 처리 때문에 샌드함수는 결국 지연되는 것.
문제 2) 매번 다 쓰인 버퍼의 레퍼런스 카운트가 0이 되었다 한들, 그것을 GC가 "항상" "확실히" 수거해가는지 테스트할 방법을 모른다.
문제 3) 레퍼런스 카운트가 0이 안되고 1이 유지되어서 어딘가에서 send가 막혀있는걸 확인 했을때 그 세션을 Disconnect()한다고 해도 GC가 이 버퍼를 "항상", "확실히"수거해 갈지 알 수 없다 (테스트 방법의 부재)
그래서 아래와 같은 질문을 드립니다.
!! 질문 0 !!) 강사님께서 메모리 릭에 대한 우려가 있다고 말씀하셨는데, 그게 순전히 우려인지, 혹시 테스트를 해보신건지 궁금합니다.
다시 말해서 C#에서 샌드 리시브 버퍼를 그냥 쓰기로 강행하면 나중에 낭패 볼까요?
질문 1 ) 위의 2,3번 문제를 체크할 수 있는 방법이 있을까요?
질문 2 ) 요즘 C#서버가 많이 보입니다. 모두 이런 문제를 고려했을텐데요, 그냥 매 순간 지금처럼 조각조각 패킷을 만들어 보내는게 대세인가요? 아니면 다른 방법이 있나요?
질문 3) 위의 1번 문제의 성능 감소가 클까요?
질문 4) 혹시 버퍼 크기를 4096 * 100 이 아니라 250, 300 등 작게 잡으면 이문제를 무시해도 될까요?
P.S 이 강의 시리즈가 매우 큰 도움이 되고 있습니다. 감사합니다.
답변 1
1
네 간단히 질문4처럼 버퍼를 작게 잡아 사용하면 됩니다.
지금은 큰 조각을 잘라서 쓰니 어려운 것이죠.
메모리 릭에 대한 단순한 '우려'가 아니라 정말로 특정 클라에 전송이 밀리면 당연히 회수가 안됩니다.
그리고 엄밀히 말해 C# 참조는 refCount 방식이 아니라서
억지로 refCount를 사용하는 것은 포기하는게 정신 건강에 좋습니다.
굳이 SessionBuffer 풀링을 한다면 최대 크기에 해당하는 버퍼를 여러개 준비해놓고
그걸 돌려 쓰는게 가장 나을 것 같네요. (Chunk는 포기하고)
MessagePack
0
85
1
본인 플레이어 이동 관련 질문
0
49
1
Part7 Part9 질문이 있습니다.
0
72
1
.
0
116
1
.
0
106
2
게임 로직 루프에서 게임 틱 누락으로 인한 높은 CPU 사용 문제
0
92
1
타일 팔레트 깔았는데도 안돼요
0
116
2
2D로 그냥 만들어도 되나요?
0
81
2
지난 강의와 이어지는게 맞을까요?
0
80
2
순환참조 문제로 인해 발생하는 문제는 없을까요?
0
162
2
유니티 클라와 C++서버연동
0
277
2
멀티플레이 테스트 환경 관련 질문입니다
0
207
3
강의 후반부에 순서 동기화를 위해 잡큐를 사용 안 한 부분 질문입니다!
0
150
2
코드 관련한 몇 가지 질문입니다!
0
153
2
3d 프로젝트 이동 동기화 관련
0
322
4
파트 7 스트레스 테스트 질문 드립니다.
1
189
2
맵 이동 방식
0
133
0
맵 이동 관련해서 질문드립니다.
0
91
1
안녕하세요 도저히 알 수 없는 오류가 나와서 질문드려요,,
0
201
2
안녕하세요. 일전에 질문 드린 포폴 준비 관련 질문의 추가 질문입니다!
0
160
1
[팁] 2024년 기준 버전 이슈?
0
455
1
SendBuffer.cs 삭제 후 대체 되는 부분의 장단점?
1
203
1
지금 강의의 유니티 클라를 IOCP 서버와 연동하는 것
0
336
2
PushAfter 사용 질문
0
192
1





