소켓 접속을 늘리고 싶은데요...

popome의 이미지

소켓서버를 개발하고 있는데...
접속수를 무진장 늘리고 싶은데...간단한 방법이 없는지요?

테스트를 해보니까..서버마다 특성을 타기는 하는거 같은데
정확히 문서상의 숫자와도 틀리고 ㅠㅠ

보통은 1000개 미만으로 접속이 되는거 같은데..
이걸 10000개 이상으로 늘릴려고 하는데...혹시 시도해서 성공하신분 있으시면 조언을 부탁드립니다.

그리고..추가 질문이있는데..

select를 이용해서 클라이언트를 보고 있는데
아주 동시에 많은 클라이언트가 접속을 종료하면 select 가 인식을 못하는 경우가 발생하고 있습니다.

보통은 32개 이상은 안돼는거 같은데..이유가 뭔지...

좀 급해서 그런데..꼭 답변을 부탁드립니다...꾸벅...

lutanist의 이미지

getrlimit(), setrlimit() 함수를 참조하세요.
자세한 사항은 man 페이지를 :wink:

간략히 설명 드리자면 한 process가 열 수 있는 최대 파일의
숫자가 제한되어 있습니다. 이걸 늘리기 위해서는 위의 것들을
사용하시면 되고 기본값이 가장 컸던 녀석은 AIX 계열로 기억
나네요. Solaris나 Linux쪽은 1024-2048 정도 였던 걸로
기억나구요.
그리고 select를 쓴다면 감시할 수 있는 최대 숫자는 fd 숫자는
FD_SETSIZE(역시 man을...)로 정의되어 있습니다.
조작에 관해서는 역시 man을... :roll:

client 접속 종료에 관해서는 잘 모르겠습니다.
다른 분의 답변을 저도 기다리겠습니다.

mach의 이미지

lutanist wrote:

client 접속 종료에 관해서는 잘 모르겠습니다.
다른 분의 답변을 저도 기다리겠습니다.


client접속종료시 select에서 read이벤트가 발생합니다.
해당 fd에 대해 읽으려고 할때(read()호출시) 0바이트가 읽히게 됩니다.
즉,
nReadSize = read(...);
위 코드에서 nReadSize에 0값이 들어간다는 것이지요.
select()에서 read에 대한 이벤트 검출이 되었을때, 이것의 의미는 1바이트이상 데이터가 로컬소켓에 도착해 있다는 가정입니다. 그런데, 실제로 로컬버퍼에서 읽고, 읽혀진 바이트의 크기가 0이라면 이는 원격지가 연결종료했음을 의미합니다. 원격지가 연결종료한 경우에는, 또한 signal도 발생되는데, SIG_PIPE가 바로 그 시그널입니다. 그러나, 시그널의 경우는 어느 소켓에서 단절되어 SIG_PIPE가 발생했는지를 가르쳐주지 않습니다. 그래도 시그널 처리는 해주어야 하고, 클라이언트 단절은 select() -> read() -> 읽혀진 바이트수 검사로 처리하게 됩니다.
* 참고
- read()가 -1을 리턴하는 경우도 처리해야 합니다.
- read()가 >0인 값을 리턴하면 서버프로그램수준(사용자 프로그램수준에서 버퍼관리를 수행해야겠지요.)

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

baram4x의 이미지

소켓도 하나의 자원입니다.

그래서 제한을 합니다.

소켓이나 장치 등은 유닉스/리눅스에서 하나의 파일로 인식됩니다.

[baram4x@sign baram4x]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1535
virtual memory (kbytes, -v) unlimited
[baram4x@sign baram4x]$

로 확인해 보시면 open files 갯수가 나올 겁니다. 현재 1024개이군여.
이것이 사용자가 열수 있는 최대 파일 오픈 갯수입니다.

이 제한을 벗어나고자 한다면 다음과 같이 하시면 됩니다.

root 사용자에서

sysctl fs.file-max 로 확인해 보시면 시스템에서 설정된
최대 파일 오픈 갯수가 나옵니다.

sysctl -n fs.file-max=2048

로 하신 후 확인해 보시면 최대 오픈할 갯수가 2048로 된 것을
확인 하실수 있습니다.

그런 후 일반 사용자에서
ulimit -n 2048

하시면 위의 시스템에서 설정한 2048개까지 오픈 할 수 있게 됩니다.

물론 새로 부팅후에서는 원래 상태가 되는데...
계속해서 반영하고자 한다면

/etc/sysctl.conf

fs.file-max=2048

을 설정해 주시고,

각 사용자의 .bash_profile

ulimit -n 2048로 설정해 주시면 됩니다.

자세한 내용은 man sysctl 또는 man sysctl.conf 해 보세여..

그럼.

호호호의 이미지

커널의 fs.h 쪽의 값을 변경해 주셔야합니다.

diff -urN linux-2.4.17.orig/include/linux/fs.h linux-2.4.17/include/linux/fs.h
--- linux-2.4.17.orig/include/linux/fs.h        Sat Dec 22 02:42:03 2001
+++ linux-2.4.17/include/linux/fs.h     Mon Dec 24 15:49:01 2001
@@ -41,7 +41,7 @@
 /* Fixed constants first: */
 #undef NR_OPEN
 #define NR_OPEN (1024*1024)    /* Absolute upper limit on fd num */
-#define INR_OPEN 1024          /* Initial setting for nfile rlimits */
+#define INR_OPEN 2048          /* Initial setting for nfile rlimits */

 #define BLOCK_SIZE_BITS 10
 #define BLOCK_SIZE (1<<BLOCK_SIZE_BITS)
diff -urN linux-2.4.17.orig/include/linux/limits.h linux-2.4.17/include/linux/limits.h
--- linux-2.4.17.orig/include/linux/limits.h    Thu Jul 29 02:30:10 1999
+++ linux-2.4.17/include/linux/limits.h Mon Dec 24 15:49:09 2001
@@ -1,12 +1,12 @@
 #ifndef _LINUX_LIMITS_H
 #define _LINUX_LIMITS_H

-#define NR_OPEN                1024
+#define NR_OPEN                2048

 #define NGROUPS_MAX       32   /* supplemental group IDs are available */
 #define ARG_MAX       131072   /* # bytes of args + environ for exec() */
 #define CHILD_MAX        999    /* no limit :-) */
-#define OPEN_MAX         256   /* # open files a process may have */
+#define OPEN_MAX         512   /* # open files a process may have */
 #define LINK_MAX         127   /* # links a file may have */
 #define MAX_CANON        255   /* size of the canonical input queue */
 #define MAX_INPUT        255   /* size of the type-ahead buffer */

더 자세한것들은 kernel.pe.kr 같은 곳을 찾아보시면 좋을꺼 같네요

mach의 이미지

Quote:

select의 맨페이지중 발췌
NOTES
The default value for FD_SETSIZE (currently 1024) is larger
than the default limit on the number of open files. To
accommodate 32-bit applications that wish to use a larger
number of open files with select(), it is possible to
increase this size at compile time by providing a larger
definition of FD_SETSIZE before the inclusion of
<sys/types.h>. The maximum supported size for FD_SETSIZE is
65536. The default value is already 65536 for 64-bit appli-
cations.

하나를 더 고려해야 합니다.
위처럼 시스템 리미트를 세팅하고 나서, 컴파일시점 이전에 FD_SETSIZE를 1024보다 큰 수준으로 놓고 컴파일해주어야 합니다.

* 혹시나해서 말씀드리면, FD_SETSIZE만 바꿔서는 아무것도 안된다는것이지요.
* 64비트 운영체제에서는 이미 그 값이 65536이라는 군요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

purewell의 이미지

커널 컴파일을 새로 해줘야 하는데 새로 해주기 전에 몇몇 군데에서 수치를 바꿔줘야 합니다.

만약 커널 소스가 /usr/src/linux 에 있다고 가정한다면...

/usr/src/linux/include/linux/fs.h 의 INR_OPEN

/usr/src/linux/include/linux/posix_types.h 의 fd_SETSIZE

/usr/src/linux/include/linux/limits.h 의 NR_OPEN, OPEN_MAX

/usr/include/bits/types.h 의 fd_SETSIZE

각각의 수치를 올려주고 커널 컴파일 하면 됩니다.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.