소켓 접속을 늘리고 싶은데요...
글쓴이: popome / 작성시간: 금, 2003/08/22 - 2:34오전
소켓서버를 개발하고 있는데...
접속수를 무진장 늘리고 싶은데...간단한 방법이 없는지요?
테스트를 해보니까..서버마다 특성을 타기는 하는거 같은데
정확히 문서상의 숫자와도 틀리고 ㅠㅠ
보통은 1000개 미만으로 접속이 되는거 같은데..
이걸 10000개 이상으로 늘릴려고 하는데...혹시 시도해서 성공하신분 있으시면 조언을 부탁드립니다.
그리고..추가 질문이있는데..
select를 이용해서 클라이언트를 보고 있는데
아주 동시에 많은 클라이언트가 접속을 종료하면 select 가 인식을 못하는 경우가 발생하고 있습니다.
보통은 32개 이상은 안돼는거 같은데..이유가 뭔지...
좀 급해서 그런데..꼭 답변을 부탁드립니다...꾸벅...
Forums:
소켓
getrlimit(), setrlimit() 함수를 참조하세요.
자세한 사항은 man 페이지를 :wink:
간략히 설명 드리자면 한 process가 열 수 있는 최대 파일의
숫자가 제한되어 있습니다. 이걸 늘리기 위해서는 위의 것들을
사용하시면 되고 기본값이 가장 컸던 녀석은 AIX 계열로 기억
나네요. Solaris나 Linux쪽은 1024-2048 정도 였던 걸로
기억나구요.
그리고 select를 쓴다면 감시할 수 있는 최대 숫자는 fd 숫자는
FD_SETSIZE(역시 man을...)로 정의되어 있습니다.
조작에 관해서는 역시 man을... :roll:
client 접속 종료에 관해서는 잘 모르겠습니다.
다른 분의 답변을 저도 기다리겠습니다.
Re: 소켓
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@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 쪽의 값을 변경해 주셔야합니다.[code:1]
커널의 fs.h 쪽의 값을 변경해 주셔야합니다.
더 자세한것들은 kernel.pe.kr 같은 곳을 찾아보시면 좋을꺼 같네요
[quote]select의 맨페이지중 발췌NOTES Th
하나를 더 고려해야 합니다.
위처럼 시스템 리미트를 세팅하고 나서, 컴파일시점 이전에 FD_SETSIZE를 1024보다 큰 수준으로 놓고 컴파일해주어야 합니다.
* 혹시나해서 말씀드리면, FD_SETSIZE만 바꿔서는 아무것도 안된다는것이지요.
* 64비트 운영체제에서는 이미 그 값이 65536이라는 군요.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
커널 컴파일을 새로 해줘야 하는데 새로 해주기 전에 몇몇 군데에서 수치를
커널 컴파일을 새로 해줘야 하는데 새로 해주기 전에 몇몇 군데에서 수치를 바꿔줘야 합니다.
만약 커널 소스가 /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
댓글 달기