넌블럭 예제를 돌려보는데...

sauron의 이미지

아래 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 의 버그가 아닌가 의심하고 있는데,
혹시 비슷한 넌블럭 문제를 겪으신 분이 있다면 고견을 청합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.