쓰레드 메시지 큐 처리에 대한 조언 부탁드립니다.
제가 개발하고 있는 부분을 설명 드리면 TCP/IP통신을 하고 있는 통신 서버가 있고 통신 프로세스로부터 절달받을 가공서버가 있습니다.
데이터 초당 정보이며 클라이언트는 1000개 정도 됩니다.
또한 통신서버와 가공서버는 서로 UDP통신을 하고 있습니다.
통신서버는 클라이언트 갯수당 쓰레드를 생성하고 있구요
주고받는 데이터는 255바이트를 넘지 않습니다.
통신서버의 TCP/IP 쓰레드에서 데이터를 수신받으면 쓰레드가 그 정보를 가공서버와 통신하는 UDP프로세스로 메시지 큐로 전달합니다.
그리고 가공서버는 UDP프로세스에서 수신을 받고 데이터를 각 해당 프로세스로 메시지 큐로 분산 합니다.
근데 400 클라이언트까지는 1초당 정보를 운영프로그램에서 모니터링 하는데 전혀 문제 없었는데
그 이상이 넘어가면서 초당 정보가 늦게 온다거나 혹은 건너 뛴다거나 데이터 손실이 이루어지고 있습니다.
설명이 길었지만 지금부터 질문을 아래와 같이 질문 드립니다.
1. 1000개의 쓰레드에서 메시지 큐에 보내는데 쓰레드간 문맥전환이 발생할 것 같고 그렇게 되면 하나의 쓰레드가 데이터를 큐에 다 넣기 전에
다른쓰레드가 메시지 큐에 전송하는 일이 발생하지 않을까요?
그래서 패킷이 꼬일것 같구요 실질적으로 트래픽이나 혹은 CPU과부하가 아닌 패킷꼬임으로 인한 버림 패킷으로 속도가 늦어져 보이지 않나 생각됩니다.
제 생각이 맞는지요?
그렇다면 어떻게 이걸 동기화 시켜야 하는지요?
2. TCP/IP소켓은 BLOCK소켓을 개발되었는데 찾아보니 NON BLOCK이 멀티 환경에선 더 유리하다고 하더군요
근데 이해가 안가는게 쓰레드의 갯수가 증가하면 문맥전환이 자주 발생하고 그로인해 CPU쪽에 과부하가 걸린다고 알고있는데요
그래서 윈도우에서 IOCP나 리눅스/유닉스 계열에 쓰레드 풀이나 사용하는거 아닙니까?
그렇다면 BLOCK소켓을 사용해야 대기하고 있을때 블락이 걸려 문맥전환이 발생하지 않아서 더 유리하지 않을까 생각하는데요
아닌가요?
테스트 해보고 찾아보면 되지 왜 이런데 질문하나 하시는 분도 있겠지만 제가 워낙에 급한 상황이고 실제로 돌고 있는 서버를 테스트를 위해 죽였다
살렸다 할 수 없는 상황이라 이렇게 염치 불구하고 질문 올립니다.
통신쪽 관련된 고수님들 깊이있는 조언좀 부탁드립니다. 꾸벅
1. 메시지큐에 기록하는 단위는 서로 꼬이지
1.
메시지큐에 기록하는 단위는 서로 꼬이지 않습니다. 즉 두 번의 send 동작이 거의 동시에 일어났는데 하나가 끝나지 않아 데이터가 덮어 씌워지는 일은 없습니다. 연이은 두개의 메시지가 서로 의미가 있는 경우라면 중간에 끼어들 수는 있겠습니다만 그렇게 설계되진 않았을것 같네요.
2.
윈도우의 IOCP와 리눅스의 쓰레드풀은 비교대상이 아닙니다. epoll이 비교대상이지요.
1000개의 쓰레드라면 문맥 전환하는데 CPU 부하를 일으킬만한 상황입니다.
전환자체가 문제가 아니라 갯수가 문제입니다.
---
http://coolengineer.com
댓글 달기