|
이유는 많이 틀리구, 서버를 보통 Linux를 사용하다보니 차이가 있을것 같습니다.
저도, 사용자가 폭주를 했을때 문제가 생겨서 보니, netstat -a 를 쳤을때, web에서 정보를 요청한 클라이언트의 접속이 끊어지지 않고 계속 물려있는 겁니다. -_-;;
web은 보통 한번만 돌아가고 접속을 끊는게 원칙이지만 그렇지 않다보니, 이상하게 쓰레드가 늘어나고 컴퓨터가 느려지더니 다운 현상까지 일으키더군요.
클라이언트에서는 Indy를 사용했습니다. Http->Disconnect() 라는 메소드를 썼는데, 이것이 접속을 정확히 끊지는 않는가 보더군요. 그래서 Http->DiscconectSocket() 를 먼저 썼더니, 그제서야 정상적으로 접속이 끊고 쓰레드가 안정적으로 돌아가더군요.
만약 이런 비정상적인 문제가 아니라면, 서버가 충족할 수 있는 만큼 쓰레드를 제한하는 방법도 괜찮으실것 같네요.
나우시카 님이 쓰신 글 :
: 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로 바꿈 상태는 같음)를 다시까는 사태가 발생합니다.
:
: 현재 다시 깔았지만 또 같은 현상입니다.
:
: 한번 사용자가 폭등하면 그걸로 끝이 납니다. 복구가 안됩니다.
:
: 이런 경우를 경험하신 분들이나 조언 해주실분.. 글 남겨주십시오. (_ _) 꾸벅
:
:
:
:
:
|