42Seoul에서 진행하는 Webserv라는 과제이며 Nginx와 같은 I/O Multiplexing 정적 서버를 c++로 구현하는 프로젝트 입니다.
아래 링크를 들어가시면 자세한 내용을 확인하실 수 있습니다.
https://github.com/WebservKimNamKim/webserv
benchmark 로그를 보면 두가지 현상을 관찰할 수 있습니다.
1. 요청 초기에는 대부분의 요청이 정상 처리됩니다.
2. 요청이 지속될 수록 socket주소가 사용 불가능 하다는 로그가 나오면서 실패합니다.
해당 내용들을 종합 하여 요청이 지속되면서 자원이 제대로 회수 되지 않아서 생기는 문제라고 유추하게 되었고 응답을 보낸 후 Socket을 어떻게 처리하는 지를 점검 하였습니다.
else if (currEvt.filter == EVFILT_WRITE) {
int sendStatus = SEND_OK;
req_type::iterator it = _reqMap.find(currEvt.ident);
if (it != _reqMap.end())
sendStatus = sock.sendHttpResponse(it->second, currEvt.ident);
if (it == _reqMap.end() || sendStatus == SEND_OK) {
delete it->second;
_reqMap.erase(currEvt.ident);
_updateEvt(currEvt.ident, EVFILT_READ, EV_ENABLE, 0, 0, NULL, "enabling read");
_updateEvt(currEvt.ident, EVFILT_WRITE, EV_DISABLE, 0, 0, NULL, "disabling write");
close(currEvt.ident);//socket을 닫는 부분을 추가함.
}