넌블럭 예제를 돌려보는데...
아래 URL 을 보면, 넌블럭 소켓으로 connect 하는 예제가 있읍니다.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Sockettimeout
이 예제를 약간 변형해서, 몇 개까지의 넌블럭 소켓을 만들 수 있는지 테스트 해봤읍니다.
main() 함수만 약간 바꾸었읍니다.
int main(int argc, char **argv)
{
struct sockaddr_in* vp_serveraddr;
int conncnt=0;
int sockfd;
int len, i;
if(argc
{
printf("※※ Need IP, Port, Connect Cnt, IsNonBlock.\n"); return 0;
}
conncnt =atoi(argv[3]);
isNonBlock=atoi(argv[4]);
vp_serveraddr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in)*conncnt);
for(i=0;i
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0))
{
printf("error"); return 1;
}
vp_serveraddr[i].sin_family = AF_INET;
vp_serveraddr[i].sin_family = AF_INET;
vp_serveraddr[i].sin_addr.s_addr = inet_addr(argv[1]);
vp_serveraddr[i].sin_port = htons(atoi(argv[2]));
len = sizeof(vp_serveraddr[i]);
if (ConnectWait(sockfd, (struct sockaddr *)&vp_serveraddr[i], len, 10)
{
printf("◇ %dth Connect Error(errno=%d,msg=%s)\n",i+1,errno,strerror(errno)); break;
}
else
{
printf("※ %dth Connect OK(SockNo=%d)\n",i+1,sockfd);
}
}
printf("◆ Program End ◆");
return 0;
}
그런데 돌려보니까, 소켓을 1201 개까지만 생성하고, 그 이상은 생성하지를 못하고 있읍니다.
근데 이상한 것은 저것을 블럭 소켓으로 돌리면 5000 개도 무난하게 생성이 됩니다.
ulimit -n 10000 으로 설정했읍니다. CentOS 서버 정보는 이렇습니다.
# uname -ar 실행 결과
Linux localhost 2.6.18-164.el5 #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
구매한지 한 1 년 되어가는 서버입니다. 또 이상한 문제는, 서버 부하테스트를 하는데,
넌블럭 소켓을 멀리 쓰레드의 클라이언트로 만들어 테스트하면, 소켓이 약 1500 개 까지 밖에
생성이 안되고, 프로세스가 뻗어버립니다. core dump 를 봐도 connect 하고 리턴하는 부분에서
에러가 났다고는 하고, 그 이상은 전혀 알려주지 않습니다. 근데 이것도 블럭 소켓으로 하면,
5000 개 클라이언트도 멀티쓰레드 환경에서 정확하게 동작을 하고 있읍니다.
암만해도 OS 의 버그가 아닌가 의심하고 있는데,
혹시 비슷한 넌블럭 문제를 겪으신 분이 있다면 고견을 청합니다.
댓글 달기