HP-UX
1821985 회원
3400 온라인
109638 솔루션
새 메시지

Socket : pthread_create 시 "not enough space .." 에러

 
유경관
신규 회원

Socket : pthread_create 시 "not enough space .." 에러





아래 내용중에 Main_Server() Thread에서 Client의 접속을 기다리다가

Client가 접속하면 새로운 Thread로 내려보내

접속한 Client의 작업을 처리하도록 되어 있습니다.



그런데 1년이상 잘 돌던 프로세스가 어느 순간부터

(Client의 수도 늘고, Client와의 접속이 끊어졌다 붙었다 지속도 하지만)

Client의 작업을 처리하는 Thread를 생성시

"not enough space ... "하면서 Thread가 생성이 되지 않습니다.



glance, sam등으로 보아도 해당 프로세스의 Thread는 접속한 Client의 숫자와 프로세스 내부에서 사용되는 Thread의 숫자를 더한 값과 일치하는데도 에러가 나서 Thread 생성이 안됩니다.



한번 발생하면 프로세스를 재시작하기 전까지는 계속 같은 에러로 Thread생성이 되지 않습니다.





--------------------------

1. Client의 접속과 종료는 특정 Client라 할것 없이 계속 접속을 맺고 있는 상태에서 서비스 제공

2. Client는 비 주기적으로 접속이 종료되어 Thread가 종료됨

3. 접속이 끊어진 Client는 초당 몇번~몇십번의 Socket 접속이 있을수 있으며, 해당 Client에 대한 작업 Thread가 생성됨

4. 하나의 Client는 하나의 접속만 서버에서 인정(확인하여 중복 접속이면 해당 Client의 이전 작업 Thhread에 대해 Socket 종료 및 Thread도 종료시킴)

5. 시스템에 적용된 Thread 숫자는 28000 으로,

테스트 프로그램으로 6200 ~ 6600 개 까지 생성이 되며

그 이상일 경우는 "not enough space..."에러 발생

6. 현재 Client의 숫자는 30개 미만.

7. 아래 소스와 같은 방법의 Socket 생성 및 Thread 생성

Thread 내부 작업 로직만 다르게 하여 Sun Sparc 장비에서는 돌고 있는 프로세스는 문제가 없음





--------------------------

다음의 내용이 궁금합니다.

1. 왜 "not enough space.." 메시지가 나오게 되는지

2. 한번만이 아니고 지속적으로 "not enough space.."에러가 나면서 Thread 생성이 되지 않는지 (어느 순간에는 복구가 되어 생성이 되어야 하는것 아닌지)

3. 실제 Thread는 종료되었지만, 시스템 내부의 메모리가 비워지지 않아 그런것인지



--------------------------





==========================================================

void main()

{

if ( pthread_create(Server_Tid, NULL, Main_Server, NULL) != 0 )

{

.....................

return NULL;

}



while(1)

{

.........

}

}





void *Main_Server()

{

int setsockopt_error ;

......................

struct linger ㅊㅊㅊ ;

struct sockaddr_in cli_addr;







listen_fd = 0;

listen_fd = Server_Open(SERVER_PORT);



/********************************************************************/

While_Sock=HR_TYPES_TRUE ;

if (listen_fd < 0)

{

..........



while(While_Sock)

{

sock_close (&listen_fd);

listen_fd = Server_Open(SERVER_PORT);



if (listen_fd > -1 )

{

...............

break ;

}



milli_sleep(1000) ;

}

} /* end of : if (listen_fd < 0) */

else

{

.........................

} /* end of : else */

/************************************************************/





/************************************************************/

while ( runManager )

{

......................

addrlen = sizeof(cli_addr) ;

sockfd = accept( listen_fd, (struct sockaddr*)&cli_addr, &addrlen );



if (sockfd < 0 )

{

..............

printf("Main_Server> Client Socket Accept Error !!!" ) ;

...........

continue;

}



..........



............................



printf("Main_Server> Client VALID Sock Info -> sock_fd<%d>, ip_addr<%s>, port<%d>",

sockfd, client_ip, client_port )) ;



/* 각 Client에서 전송결과를 다 처리하지 못할경우 */

/* -> 다음 함수를 이용 : 서버에서 Socket Buffer에 쌓지 않고 바로 전송함 */

fcntl(sockfd, F_SETFL, O_NONBLOCK);



if ( pthread_create(&tid, NULL, AAA, (void *)pfd_info) != 0 )

{

printf("Main_Server> pthread_create() error:<%d:%s>", errno, strerror(errno) );



................

}

}

/************************************************************/



..................

SIP_LOG_ERROR((slFD, "Main_Server> Destoryed or User Kill !!!" )) ;

pthread_exit(0);



return (NULL);

}







void *AAA(void *arg)

{

int r_size ;

int retcode ;

..........

AAA_PTR aaa_info = (AAA_PTR)arg;

...............





...............

free(arg);





/********************************************************************/

while ((runManager) && (sock_fd != 0))

{

/* 30동안 마무런 데이타가 없으면 해당 접속 종료 */

retcode = sock_readable(&sock_fd, 30, &rset);



if (retcode > 0)

{

if (!FD_ISSET(sock_fd, &rset) )

{

continue;

}



memset(buffer, 0x00, AAAA_SIZE);



r_size = recv(sock_fd, buffer, AAAA_SIZE, 0);



....................

........................

}



} /* end of : while ((runManager) && (sock_fd != 0)) */

/********************************************************************/





AAAA_LOG((slFD, "AAA> Thread Terminated -> sock_fd<%d>, ip_addr<%s> !!!! **** \n",

back_sock_fd,

client_ip ) ;



sock_close(&sock_fd) ;



pthread_exit(0);



return (NULL);

}