Socket Pool?
글쓴이: purewell / 작성시간: 목, 2006/05/04 - 5:01오후
소켓을 하나 생성할 때마다 내부에서 그 소켓을 관리할 메모리를 할당받죠.
이것이 초당 몇 건 안 되면 그려려니 하겠지만 초당 몇 백 건 되면 할당/해체 하니라 서버가 죽어나겠죠?
그래서 소켓풀이 있으면 좋겠다...라는 생각이 듭니다.
클라이언트쪽에선 논리상으론 될 것 같아 보였습니다.
풀초기화(socket함수 왕창 부른다) -> 풀에서 소켓 요청 -> connect -> send/recv -> shutdown -> 풀에 소켓 반환
이렇게 말이죠...
그런데 서버쪽에선 @ ,.@) accept 안에서 socket에서 했던 작업을 해버리는 관계로 할 수가 없지요. (안타까운 현실이 아닐 수 없습니다)
어떻게 안 될까요? 대한민국에 안 되는게 없을텐데 말이죠.
Windows에선 AcceptEx/ConnectEx 라는 녀석이 있군요.
Forums:
원하시는 답변인지 모르겠지만.
제경험상 수천대의 client의 accept를 처리해도 커널영역에서 메모리 할당하느라 느려지거나 하는 경우는 없었습니다.^^;; (fedora core나 cent os에서 수천개씩 accept하는 테스트 해봤습니다. 부하없이 잘됩니다. ^^;;)
네트웍과 파일시스템쪽 소스를 뜯어봐야 겠지만 커널 내부에서 쓰는 데이터는 Cashing 하는것으로 알구 있고요. 대신 User Program 영역에서 사용 하는 client Data는 pooling 하셔야 합니다. 오히려 이부분처리가 잘못되서 랙을 유발시키는 경우가 많더군요.
그리고 epoll을 쓰면 socket event가 발생시 User program영역의 client data를 매치 시키는데 편하게 사용 할 수 있습니다. 안그러면 socket id와 client 자료구조를 hash map등으로 찾아줘야겠죠. ^^;;;
Never Ending 삽질.
서버 프로그램의
서버 프로그램의 경우 accept 등의 처리에 부하가 걸리는 것이 아니라 해당 소켓을 처리하기 위한 쓰레드나 프로세스를 만드는 데 부하가 많이 걸립니다. 그래서 쓰레드나 프로세스를 미리 만들어서 풀링을 하는 경우가 많습니다. 자세한 구현방법 등은 UNP를 참고하세요.
댓글 달기