I/O Multiplexing Custom 정적 서버 구현 성능 테스트(Nginx)

taehee kim·2023년 5월 3일
0
post-thumbnail

0. 프로젝트 소개

42Seoul에서 진행하는 Webserv라는 과제이며 Nginx와 같은 I/O Multiplexing 정적 서버를 c++로 구현하는 프로젝트 입니다.
아래 링크를 들어가시면 자세한 내용을 확인하실 수 있습니다.
https://github.com/WebservKimNamKim/webserv

0-1. Siege command

  • Siege는 multi thread 기반의 HTTP요청을 생성할 수 있는 Benchmark test Command입니다. '-b' 옵션을 활용하면 Benchmark를 진행할 수 있습니다.
    https://linux.die.net/man/1/siege

1. 문제 상황

  • Siege -b command를 활용하여 테스트 시 벤치마크 테스트가 실패합니다.

2. 원인 분석

benchmark 로그를 보면 두가지 현상을 관찰할 수 있습니다.
1. 요청 초기에는 대부분의 요청이 정상 처리됩니다.
2. 요청이 지속될 수록 socket주소가 사용 불가능 하다는 로그가 나오면서 실패합니다.

해당 내용들을 종합 하여 요청이 지속되면서 자원이 제대로 회수 되지 않아서 생기는 문제라고 유추하게 되었고 응답을 보낸 후 Socket을 어떻게 처리하는 지를 점검 하였습니다.

3. 문제 해결

  • 코드를 점검해보니 응답을 보낼 때 일부 경우에서 Socket을 Close하지 않는 경우가 있음을 확인하고 수정하여 문제를 해결했습니다.
	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을 닫는 부분을 추가함.

		}

profile
Fail Fast

0개의 댓글