memcached win32 포팅 중
요새 vs를 안쓰는 관계로 그 쪽은 일단 제껴두고 mingw기반으로 포팅을 진행했다. 소켓,네트워크 프로그래밍 경험이 부족하다 보니 몇가지 부분에 있어서 애를 좀 먹었다.

가장 난관이었던 부분은 thread간의 signal handling을 위해서 pipe를 열고 signal이 발생하면 이 곳을 통해 read,write를 하는데(라고 추측하고 있다) 이 것이 정상적으로 동작하지 않아서 worker thread가 waiting으로 들어가지 못하고 바로 종료되는 현상이 발생하는 것이었다.

원인을 찾아보니 libevent가 win32환경에서는 select로 동작을 하는데, pipe로 열린 fd에 대해서는 select가 실패하는것이 원인이었다. 이 부분을 loop-back socket을 만들고 이 곳을 통해 read,write대신 각각 recv,send를 써서 해결을 했다.

두번째 난관은 get 명령어는 정상적으로 동작을 하는데 set을 하면 recv가 실패하고 접속이 끊어지는 문제였다. 이 부분은 recv를 시도할 경우 들어온 패킷보다 많은 패킷을 읽으려고 시도하면 unix계열에서는 EAGAIN을 리턴하는데 비해 win32에서는 -1을 리턴하는게 원인이었다. (사무실이 아니라 부정확할지도.. 확인후에 수정할 것)

이를 해결하기 위해서는 -1이 리턴될 경우 WSAGetLastError()를 통해 실패 원인을 조사하고 WSAEWOULDBLOCK이 리턴되면 EAGAIN과 같은 동작을 하도록 만들어 주니 해결이 되었다.

앞으로 해보고 싶은건 iocp, libev등으로 동작방식을 바꿔보고 각각에 대해 벤치마크를 좀 해보고 싶다. libev가 libevent에 비해서 성능이 훨씬 좋다고 하는데 벤치마크 해보는 것으로도 적당하지 않을까 싶다. 임시로 수정한 Makefile도 configure시에 정상적으로 생성되게도 해야되고 vs용 솔루션 파일도 만들어 보면 좋겠는데.
by 에이군 | 2011/10/09 04:50 | 트랙백 | 덧글(2)
트랙백 주소 : http://agun.egloos.com/tb/2854220
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 몽몽이 at 2011/10/09 09:54
pipe가 thread-safe한가요?
Commented by 에이군 at 2011/10/09 14:53
thread별로 pipe를 여는걸로 봐서는 그런 문제는 아닌 것 같습니다.

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶


한잔 더
by 에이군
Calendar
rss

skin by zodiac47