|
bcbdn에 글도 올리고 하는 일반 초보 프로그래머(실은 코더)입니다.
제가 소켓 프로그래밍으로 밥벌이를 시작한지 1년이 다 되어가는데
이상한 현상이 발생이 되어서 이렇게 글을 남기게 됩니다.
이 문제에 대해 주위에 요청할 곳이 없어서 말입니다. ( __);
일반 인트라넷에서 사용하는 게이트웨이서버의 소켓 프로그래밍에서는 문제가
안되었지만 Web과의 연동에서 부터 문제가 시작됩니다.
먼저 망의 개요는 이렇습니다.
Web요청,망내(인트라넷 내의)의 요청 -> 게이트웨이 -> 전용라인원격서버들 -> 게이트웨이 -> Web요청,망내(인트라넷 내의)응답
이렇게 한 루틴입니다. 게이트웨이 소켓 프로그램은 말 그대로 요청 받은 데이터를 던져주고 결과를 다시 받아와서 요청자에게 돌려주는 일이 기본적인 역활입니다.
여기서 메인 데몬의 구성은 이러합니다.
외부 요청 -> main.exe->Sub_server.exe->서버요청후응답->Sub_Server.exe->main.exe->외부응답
main.exe = 외부 요청의 전문을 파악하여 알맞은 Sub_server.exe와 통신후 결과를 받아 응답
Sub_server.exe =main.exe에서 받은 데이터로 서버들과의 통신 후 결과를 다시 main으로 전달
(Sub_server.exe는 다수의 개수로 각각의 특정 원격서버들과 1:1통신을 합니다.)
(디버깅이 힘들어서 따로 main,sub_server이렇게 따로 만들었습니다.)
게이트웨이 프로그램의 기본 절차
main()
{
while(1)
{
select
accept
recv
CreateThread()
}
}
Threadfn()
{
send
recv
send//main에서 받은 소켓으로 다시 send
}
모든 main이나 sub_server의 프로그램은 저러한 방식으로 처리가 되어있습니다.
서로 중간자 역활만 수행을 합니다.
그러나 문제는 Web사용자가 급증하면서 일이 커지기 시작했습니다.
Main이 데이터를 받아오고 Sub_server로 주는 과정까지는 괜찮으나
Sub_Server들이 외부원격서버들과 통신을 하는 과정에서 오동작을 일으킵니다.
그러면서 쓰레드당 VM과 메모리사용량이 평균적으로 폭발적으로 증가하면서
서버가 멎습니다.
껐다켜도 같은 현상이 일어납니다.
평소에 잘 되다가 한번 위의 상황이 일어나면 껐다켜도 같은 결과가 벌어집니다.
OS(NT쓰다가 2000Server로 바꿈 상태는 같음)를 다시까는 사태가 발생합니다.
현재 다시 깔았지만 또 같은 현상입니다.
한번 사용자가 폭등하면 그걸로 끝이 납니다. 복구가 안됩니다.
이런 경우를 경험하신 분들이나 조언 해주실분.. 글 남겨주십시오. (_ _) 꾸벅
|