- Community Home
- >
- HPE Community, Korea
- >
- HP-UX
- >
- Socket : pthread_create 시 "not enough space .." 에...
HP-UX
1821985
회원
3400
온라인
109638
솔루션
포럼
범주
Company
Local Language
뒤로
포럼
토론 게시판
포럼
- Data Protection and Retention
- Entry Storage Systems
- Legacy
- Midrange and Enterprise Storage
- Storage Networking
- HPE Nimble Storage
토론 게시판
토론 게시판
토론 게시판
포럼
토론 게시판
뒤로
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
- BladeSystem Infrastructure and Application Solutions
- Appliance Servers
- Alpha Servers
- BackOffice Products
- Internet Products
- HPE 9000 and HPE e3000 Servers
- Networking
- Netservers
- Secure OS Software for Linux
- Server Management (Insight Manager 7)
- Windows Server 2003
- Operating System - Tru64 Unix
- ProLiant Deployment and Provisioning
- Linux-Based Community / Regional
- Microsoft System Center Integration
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
Discussion Boards
블로그
정보
커뮤니티 언어
언어
포럼
블로그
- 신규로 표시
- 북마크
- 구독
- 소거
- RSS 피드 구독
- 강조
- 인쇄
- 부적절한 컨텐트 신고
날짜: 10-02-2007 10:00 PM
날짜: 10-02-2007 10:00 PM
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);
}
위에 명시된 의견은 Hewlett Packard Enterprise가 아닌 저자의 개인 의견입니다. 이 사이트를 사용하면 이용 약관에 동의하게되며 참여 규칙 .
회사
주요 내용 알아보기
뉴스 및 이벤트
© Copyright 2025 Hewlett Packard Enterprise Development LP