해결된 질문
작성
·
141
0
처음에 send할때 sendArgs 동적 할당해서 보내다가 부하때문에 sendArgs멤버로 하나 만들어서 그걸 재사용하는걸로 변경 하시고 다음 send가 있으면 이전에 보낸 send가 OnComplete되어야지 다음 send를 보내잖아요 이렇게 하면 보내는 send는 많고 OnComeplete처리가 느리면 대기하는 패킷이 큐에 계속 쌓일 수도 있을 것같은데 sendArgs를 미리 할당을 많이 한다음 풀링방식으로 가져온다음 이전에 보냈떤 send가 comeplete가 되었든 안되었든 상관없이 바로바로 SendAsnyc호출 해주면 문제가 되나요? SendAsnyc호출을 바로바로 해주면 받는쪽에서 왠지 뭉쳐서 받을 것같아서 그럼 더 효율이 나오지 않을까 생각해봤어요. 이전에 보낸 Send가 완료가 되고나서 다음 send를 보내면 받는쪽에서는 뭉쳐서 받질않을 거잖아요..? 만약 실시간으로 많은 양의 send를 보내는 서버라면 어떤 방식이 좋을까요?
답변 2
0
0
먼저 패킷을 작게 작게 여러번 Send 하는 것은 오히려 더 효율이 안 좋습니다.
네트워크 패킷을 1바이트 보낸다고 진짜 1바이트가 가는게 아니라,
Layer마다 이런 저런 헤더가 붙기 때문이죠.
오히려 그래서 패킷 큐에 쌓인 걸 한방에 뭉쳐서 보내는 쪽이 훨씬 경제적입니다.
빼빼로 100개를 보내는데, 빼빼로 1개마다 택배를 보내기 보다는,
100개를 한 박스에 넣어서 택배를 한 방에 보내는 쪽이 좋은 것과 유사합니다.
두번째로 OnCompleted 처리가 느린 상황이 발생한다면,
그건 상대방에서 그걸 미처 패킷을 다 못 받은 상황이라는건데
그 상황에서 굳이 더 Send를 호출한다고 상황이 좋아질 확률은 낮습니다.
TCP 통신은 내부적으로 Congestion Control의 개념이 있어서
어차피 나와 상대방의 커널 버퍼 상황에 따라 패킷 보내는 양을 조절합니다.
마지막으로 sendArgs를 풀링해서
SendAsync 호출을 바로바로 해준다면
보내는 패킷량은 많아지는 대신 해당 유저의 반응 속도는 조금 좋아질 수는 있습니다.
다만 MMO 서버는 반응성이 FPS처럼 중요하진 않기 때문에
거시적인 관점에서 모든 유저를 효율적으로 처리하는 관점에서 생각을 하는 쪽이 더 좋다고 봅니다.