[질문]다중서버 개발시 주의해야 할 사항..
리눅스 환경에서 프로그램을 개발을 한지 얼마되지 않은 개발자입니다.
얼마전까지만 해도 윈도우 환경에서 프로그램을 개발하였는데 회사에서 리눅스로 환경을 전환하고 있어서
기존 윈도우로 되어 있는 프로그램을 리눅스로 포팅 작업을 하고 있습니다.
윈도우 환경에서 IOCP 환경에서 돌아가는 서버 프로그램을 리눅스로 포팅을 하여야 해서
이리저리 자료를 찾다가 epoll을 선택하여 개발을 들어갔습니다.
개발을 어느 정도 완료를 하여 프로그램 테스트를 하였는데
간략하게 구조는 다음과 같이 설계를 하였습니다.
소켓 이벤트를 처리하는 thread와 비지니스 로직을 처리할 thread pool로 설계하였습니다.
기타 데이터 동기화는 mutex, 자료구조는 STL(QUEUE, FIFO)을 사용하였습니다.
프로그램 구동시 소켓 이벤트를 처리하는 쓰레드를 돌립니다.(while문)
쓰레드에서 accept인지 recv인지 판단하여 accept면 epoll에 등록하고 recv면 queue에 데이터를 넣어서
비지니스 로직을 처리하는 쓰레드로 pthread_cond_signal을 이용하여 잠자고 있는 쓰레드를 wakeup하여서 처리하도록
하였습니다. 비지니스 로직을 처리하는 쓰레드에서는 WAS(Web Server)를 호출하여 응답 받은 데이터를 파싱하여
해당 클라이언트로 데이터를 송신합니다. 이러면 한 flow가 끝납니다.
이렇게 하면 어느정도 구동이 될거라고 생각하였습니다.
그런데 여기서 문제점이 발생하였습니다.
[문제1]QUEUE를 STL QUEUE를 사용하였습니다. FIFO방식으로 하다 보니 recv/send가 순차적으로 일어납니다.
각각의 테스트 프로그램에서 100 세션씩 접속을 해서 데이터 처리 상황을 보니 먼저 send가 된 테스트 프로그램쪽에 응답을
다 한후 다른 테스트 프로그램에 응답을 주는 문제가 발생하였습니다.
[문제2] thread pool
쓰레드 생성 갯수에 제한이 없는줄 알았습니다.
어느 정도 쓰레드를 생성하고 나니 더이상 생성이 되지 않아 찾아보니 쓰레드 생성갯수가 제한이 되어 있더군요
첨에는 300으로 갯수를 지정하였다가 MAX값이 256이라 하여 256으로 값을 지정하였습니다.
그런데 테스트 프로그램에서 접속은 리눅스 환경상 설정된 갯수 만큼(1024)접속이 되는데 데이터 처리할때 쓰레드 풀로 설정한
갯수만큼만 데이터를 처리하여 테스트 프로그램에 송신을 하더군요
가만히 소스를 살펴보니 session당 thread가 1:1로 되어 있는거 같았습니다.
여기 사이트에서 찾아보니 1thread당 여러 session을 처리하게끔 하라고 되어 있는데
그 방법을 잘 몰르겠습니다.
동접 4000 이상을 생각하고 있습니다.
아시는 고수님들의 많은 도움 부탁드립니다.
그럼 오늘 하루도 행복한 하루 보내세요..*^^*
댓글 달기