작성
·
471
0
안녕하세요! 강사님. 클라이언트를 500명으로 늘렸을 때 말로 설명해주신 부분에서 이해는 가는데, 일부분이 정확하게는 이해가 가지 않는 부분이 있습니다.
작업이 밀려버리면 스레드풀에서 보낸 스레드가 돌아오지 않으니 새로운 스레드를 만들기때문에 메모리가 점점 찬다
-> 스레드가 패킷을 async하게 recv한 다음 jobqueue에 push를 할 때, push 하기위해 lock이 있으니 해당영역에서 병목현상이 발생하고, 그로인해 blocking된 스레드가 오지 않으니 스레드풀에서 새 recv가 오면 스레드 재사용이 아니라 새 스레드를 할당하기 때문에 스레드는 각 스레드별로 stack을 가지고 있기 때문에 이런 스레드별로 가지고있는 용량이 계속 증가하는거라서 메모리가 늘어난다.
라고 이해를 했었습니다.
그런데 나중에 다시 말씀해 주셨을 때,
일이 계속 밀리면, 스레드풀에서 스레드가 돌아오지 않으니 새로운 스레드를 만들고, sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는걸로 구현했기 때문에 메모리가 계속 늘어난다.
라고 하셨는데, sendbuffer는 여러 스레드가 큰 버퍼에서 짤라서 각자 쓰는 것으로 이해를 했었어서 여러 스레드가 써도 큰 버퍼는 그대로고 얼마나 sendbuffer를 사용하는 횟수가 많아지냐. 가 달라지는거라고 생각이 들었는데,,, 그게 아닌가요? sendbuffer에서 큰 단위의 버퍼에서 짤라서 사용하는 것이 메모리 증가에 무슨 영향이 있는지 잘 이해가 되지 않습니다.
답변 1
1
잘라 쓰는게 문제는 아니고 sendBuffer 참조값을 1개라도 들고 있으면
메모리 해제가 되지 않는게 문제입니다.
잘라 쓴다는건 말 그대로 특정 영역을 약속대로 사용한다는 개념이지
어차피 sendBuffer의 참조를 들고 있는 것은 동일하죠
C#에선 그렇다면 GC에 의해 회수가 되지 않습니다