동시접속이 1000명이 넘는 서버를 구성할 경우..
글쓴이: sunbee / 작성시간: 화, 2004/11/09 - 11:28오전
소켓은 nonblocking으로 설정하고, prefork로 프로세스를 여러개 생성합니다.
여러개의 프로세스가 하나의 listen port를 공유하여 select 하고 있습니다..
client의 요청이 계속적으로 일어날 경우 listen port를 공유하다보니, 하나의 프로세스가 client의 접속을 계속 받아들여 "Too many open files" 에러가 뜨더군요...
select를 이용해서 i/o multiplexing을 하는데 select는 하되 accept만 못하게 해야하나요~? 이럴때는 어떻게 처리합니까~?
아님 저런 에러를 감수해야 하는것입니까~?
Forums:
동시접속 1000명이라도 별 문제가 생기지 않아야 할 것으로 보입니다.
동시접속 1000명이라도 별 문제가 생기지 않아야 할 것으로 보입니다.
일단은 프로그램에서 소켓을 닫아주어야 하는 부분을 어디선가
놓친 부분이 있는 것이 아닌가 생각됩니다.
아니면 프로세스에서 열 수 있는 파일의 수가 너무 작게 설정이 되어있든가요.
too many open files 를 내는 프로세스의 pid를 알아내서
lsof 등으로 한번 검사해 보시기 바랍니다.
아마 안 닫으신 것이 있지 않을까 생각이 됩니다.
현재 문제와는 상관없겠지만,
하나의 소켓을 여러 프로세스에서 같이 listen하고 있는 경우
thundering herd 문제가 발생할 수 있지 않을까 하는 생각이 듭니다.
이 문제가 성능에 영향을 미치기 시작한다면 accept를 전담하는
프로세스를 앞단에 두거나 포트수를 늘리거나
처리로직을 개선해서 처리능력을 높이는 -_-;; 방향을 잡으셔야 할 것으로 생각됩니다.
[quote]동시접속 1000명이라도 별 문제가 생기지 않아야 할 것
최대 접속을 테스트 하기위해서 client에서 접속을 하고 끊지않고 대기 하였습니다... 이부분은 설명되었겠죠~?^^
프로세스가 열수있는 파일의 수는 256으로 기본설정 그대로 놔 두고 테스트 하였습니다.. 일부러 늘이지 않았습니다.
thundering herd 문제는 없어졌다고 들었는데요...
현재 시스템은 solaris9 입니다..
님께서 말씀하신데로 다른 방향도 생각해 봐야겠습니당..^_^
답변 감사드립니다.
아무리 사용자가 많아도 open file max까지 다다를정도로 되도록
아무리 사용자가 많아도 open file max까지 다다를정도로 되도록 서버가 운영되게 놔두기 보다는, max_user같은 한계값을 두어서 접속을 못하게 막는것이 바람직하지 않을까 합니다. open file max상황이 되면 서버의 동작에 영향을 미칠 수 있으니깐요. 굳이 처리하려 한다해도 accept()에서 저 에러가 나올테니 저절로 처리되지 않겠습니까. 어찌되었든 accept()를 안할수는 없는 노릇이니깐요.
제 어떤 서버의 경우엔 프로그램 설치시 limit 설정을 전부 변경해주기도 합니다. solaris엔 이런게 표준화가 잘되어있어서 좋더라구요. linux는 시스템마다 틀려서 manual을 잘 작성하게했지요.
댓글 달기