io event dispatching 관련문의요.
현재 C언어로, solaris 환경에서 개발중인 프로젝트가 하나 있는데, UDP,TCP 를 모두 지원해야하는 프로세스입니다.
대략적으로 기능을 말씀드리자면, 동일한 일을 수행하는 쓰레드가 여러개 실행이 되고, 각 쓰레드가 하는 일은 다음과 같습니다.
===================================================================================================
udp,tcp 소켓에 대한 read이벤트 등록 ( libevent 사용 )
while(1){
polling : UDP, TCP 의 소켓 디스크립터에 대한 'read 이벤트'에 대한 폴링 ( libevent 사용 )
accept : listen 하고 있는 TCP 소켓에 read 이벤트가 감지되면, accept 후 연결소켓생성, 새로 생성된 소켓에 대한 read 이벤트 등록.
read(fd,....) : read 이벤트가 인지된 소켓에 대해서, 데이터 읽기
processData : 위에서 읽은 데이터에 대한 처리
timer polling : 내부적으로 관리하는 타이머에 대한 폴링 및 타임아웃 콜백 실행
}
====================================================================================================
한 쓰레드가 위와 같은 단계를 밟으면서 실행이 됩니다.
문제는, 저 위에 소켓에 대한 polling 하는 과정을 libevent라는 많은 분들이 추천하는 오픈소스 라이브러리를 채용해서 쓰고
있는데, TCP 를 이용해서 데이터 수신을 할 때, 저 libevent가 등록한 소켓 디스크립터에 대한 read 이벤트를 감지하지 못 하는 현상이
발생을 하고 있습니다.한 10만개 중에 5~10 개 정도의 패킷을 감지 못 하는데..
libevent 라이브러리를 사용자들이 보고한 버그리포트를 보니, 저와 같은 문제를 앓고 있는 사람들이 한두명 있는 것 같더라구요.
libevent가 io event dispatching 하는 기능으로 참 편하고, 코딩을 깔끔하게 하는 장점이 있었는데, 저런 문제가 있는 한
교체할 수 밖에 없는데,
위와같은 구조를 유지하면서 쓰레드별로 poll이나 select를 호출하는 형식으로, 소켓 모니터링 하는 기능을 구현하려고 하는데
어떻게 해야할지 좀 난감합니다.
자료를 조금 찾아봐도, poll, select 같은 경우는 1프로세스 환경에서 아주 기본적인 동작만 수행하는 것들만 나와있고,
signal driven 방식으로 쓰자니, solaris 환경이라서 제대로된 real-time 시그널 지원이 되질 않습니다.
참고자료나 참고할 수 있는 라이브러리, 혹은 조언 좀 부탁드릴게요 ^^;;
하나의 머신에서
하나의 머신에서 하나의 프로세스가 동시에 10만 접속을 유지하고 있습니까? 굉장히 버거운 상황일 것 같습니다.
먼저 의심해볼만 부분은 테스트를 위해서 상대편을 가정하고 보내는 쪽이 있을텐데, 그쪽에서 write 하는 부분이 최소한 소켓 버퍼에 제대로 데이터를 썼다는 것을 확인하고 있는가가 궁금합니다. write의 리턴값이 정확한지 한번 알아봐주시고요. (제 경험으로 제대로 못쓰는 경우가 있었습니다.) 이 문제 때문에 보내는 부분의 처리를 신경을 많이 써서 구현했었습니다. 저같은 경우에는 write하려고 한 값보다 작거나 에러이면 버퍼를 보관했다가 EV_WRITE를 등록하고 이 이벤트가 떴을 때 저장한 버퍼를 재전송하도록 했었는데, 이런 형태의 처리가 보내는 쪽에 되어 있는지요?
다음은 패킷을 감지하지 못한다는 것이 정확하게 어떤 것인지 설명이 필요할 것 같습니다. 예를 들어, 보내는 쪽에서 A B C 데이터를 보냈는데, 뭔가 읽을게 있어서 읽어보니 A가 있었고 B를 보낸건 맞는데 B가 왔는지 모르고 있다가 C를 보내고 나서야 뭔가 읽을게 있다고 알아채고 B C를 읽었다는 것인지, 아니면 B라는 것 자체가 없고 C만 읽을 수 있다는 것인지요?
그리고 현재 접속 테스트를 하는 상황도 좀 알려주세요. 각 접속당 초당 어느정도의 데이터를 주고 받는지, 물리적인 접속은 어떻게 하고 있으며, 반대편 클라이언트의 성능은 서버에 비해서 어느정도이고 몇개를 사용하고 있는지요? 클라이언트 쪽의 부하도 만만치 않을테고 물리적인 접속도 일반 기가비트 이더넷이라고 하더라도 쉽지않을 것 같습니다.
댓글 달기