반응형
[Tip] 1000명의 동시접속자를 수용하는 서버
작성일 2001-6-14 조회수 7507
작성자 조대협 e-mail 조대협
파일 첨부된 파일이 없습니다.
자바를 공부하는데만 쓰다가 실제로 개발에 적용하려니까 의외의 문제들에
부딪치게 되더군요. 제가 개발하려는 프로그램은 소켓을 이용한 동시
접속자 1000 명 이상을 수용할 수 있는 서버 애플리케이션을 만드는 것입니다.
일반적으로 발생하는 몇 가지 문제점을 지적해 보겠습니다.
1. Socket & Port 개수의 제한
소켓과 포트는 운영체제에게 File descriptor 로 인식됩니다. 저는 Solaris로
테스트를 해봤는데 최고 1024 개까지만 동시에 열 수 있도록 허용을 합니다.
다른 운영체제도 큰 차이는 없을 겁니다. 코바나 RMI를 쓰지 않고 소켓으로
클라이언트와 통신을 할 경우 한 서버에서 겨우 1000명 정도밖에 감당 못하면
문제가 있죠. 참고로 유닉스/리눅스의 경우 limit, ulimit. unlimit 등의
명령어를 이용하면 됩니다.
해결법은
1. 운영체제의 커널을 뜯어 고쳐서 컴파일 하는 방법이 있습니다. 박사과정에
계신 분에게 질문 했더니 이 답변을 주시더군요. 미치는 줄 알았습니다.
2. 이 제한은 한 프로세스에게 해당하는 이야기이므로 여러 프로세스를 포크
시켜서 사용하면 문제가 없습니다. 즉, 각 프로세스가 1000명씩의 사용자를
받으면 되는 겁니다.
3. 코바 쓰세요. 참 편하고 좋습니다. 단, ORB 가 매우 비싸므로 배보다 배꼽이
더 크게 되는 수가 있으니까 중대형 프로젝트 이상일 경우에만 고려를...
2. 스레드의 메모리 사용
일반적으로 클라이언트 하나당 스레드 하나씩 할당해서 Interactive하게 작성
하는 경우가 대부분이죠.
그런데 스레드를 하나 생성하면 그 스레드의 하는 일이나 데이터 크기에 관계없이
무조건 1메가를 그 스레드에게 할당합니다. NT의 경우 4기가의 메모리 영역중
OS가 2기가를 쓰고 우리가 쓰는건 2기가니까 스레드 2000개쯤 열면 끝이죠.
참고로 이거는 가상메모리의 얘기입니다. 실제 램은 256메가라도 스레드
2000개 여는거 가능합니다. 물론 하드가 엄청나게 긁어대기 시작하고 그것
때문에 문제가 발생하는 것도 충분히 가능합니다. 스팍은 상관 없겠지만요...
해결법은
1. JDK 1.x 의 경우 -ms -mx 옵션으로 힙 영역을 늘려주고
JDK 1.2x 의 경우 -Xms 등으로 늘려줍니다.
2. IBM 의 Win32 용 JDK의 경우 옵션을 이용해서 스레드가 1메가가 아닌
256K 를 사용할 수 있도록 허용했습니다. 이미 다른 언어에서는 이런
식의 지원이 많은 걸로 아는데 자바만은 현재 IBM 밖에 없는 걸로 압니다.
3. 위에서도 썼지만 이 문제 역시 한 프로세스에게 적용되는 문제이므로
여러 프로세스가 스레드 1000개씩 나눠서 쓰면 문제 없습니다.
3. 운영체제의 선택
운영체제마다 여러가지 이유로 감당할 수 있는 사용자 수에 제한이 있습니다.
대략 Solaris > Windows NT > Linux > FreeBSD 정도의 순입니다. 말 그대로
대략(!!)입니다. 어떤 VM을 쓰냐에 따라 이 순서는 틀려집니다. 하지만
솔라리스의 경우 항상 최강의 성능을 보여주더군요. 다른 OS는 사용자가
많아지면 아예 감당을 못하거나 성능이 떨어지는데 솔라리스는 약 4000명까지
별 성능 저하없이 받아들였습니다.
그리고 FreeBSD 가 가장 약한 모습을 보여줬는데 한가지 간과해선 안
될 점은 FreeBSD는 개발 목표가 안정성이었습니다. 그래서 성능 같은 문제는
떨어질지 몰라도 안정성은 거의 최강일 겁니다. 결정적으로 무료입니다.
4. VM의 선택
TowerJ for Linux의 경우 처음 900명 정도까지는 강한 모습을 보여줬지만
그 이후로는 맥을 못 춥니다. 반대로 Sun JDK for Solaris 의 경우 처음은
TowerJ 보다 느렸지만 2000명이 넘어도 처음과 비슷한 수준의 성능을
보여줬습니다. 음... 이 경우는 운영체제가 틀리니 적절한 비교가 아니군요.
IBM JDK for Windows는 2000명이 넘는 사용자를 수용했지만 Sun JDK for Windows
의 경우 1000명도 수용 못 했습니다.
이런 식으로 자바 가상 머신의 선택도 매우 중요한 영향을 미칩니다.
5. 결론
경제 사정과 문제 영역에 적합하게 잘 골라서 사용하세요. ^^
참고로 이 글은 Volano mark(http://www.volano.com) 와 제가 직접 테스트 해
본 결과들을 토대로 작성한 겁니다. 위의 사이트에 상당히 자세한 정보가
있으니까 관심있는 분들은 한 번 가보세요. 연도별로도 정리가 돼서 자바
가상머신의 속도 변천사도 볼 수 있습니다.
ps> 10번 게시판에 질문을 올렸을 때 자바 VM으로 1000명을 수용하는 건
불가능 하다는 얘기를 들었는데 CPU는 잘 기억이 안나고 램 256메가에서
2200명의 클라이언트를 소켓으로 연결받아서 각각의 스레드(2200개)에서
BufferedInputStream과 PrintStream을 열어서 2초 간격으로 간단한 메시지를
주고 받는 프로그램을 무사히(그러나 하드는 죽어라 드르륵...) 돌렸습니다.
물론 이 경우 별 하는 일도 없었고 다른 프로그램도 안 돌아가는 상황이긴
했지만 그 컴퓨터 별로 사양도 좋지 않은 컴인데도 잘 돌더군요.
from http://fortest.dhs.org/board/view.asp?id=javastudy&page=1&num=19&lnum=19&ref=0
작성일 2001-6-14 조회수 7507
작성자 조대협 e-mail 조대협
파일 첨부된 파일이 없습니다.
자바를 공부하는데만 쓰다가 실제로 개발에 적용하려니까 의외의 문제들에
부딪치게 되더군요. 제가 개발하려는 프로그램은 소켓을 이용한 동시
접속자 1000 명 이상을 수용할 수 있는 서버 애플리케이션을 만드는 것입니다.
일반적으로 발생하는 몇 가지 문제점을 지적해 보겠습니다.
1. Socket & Port 개수의 제한
소켓과 포트는 운영체제에게 File descriptor 로 인식됩니다. 저는 Solaris로
테스트를 해봤는데 최고 1024 개까지만 동시에 열 수 있도록 허용을 합니다.
다른 운영체제도 큰 차이는 없을 겁니다. 코바나 RMI를 쓰지 않고 소켓으로
클라이언트와 통신을 할 경우 한 서버에서 겨우 1000명 정도밖에 감당 못하면
문제가 있죠. 참고로 유닉스/리눅스의 경우 limit, ulimit. unlimit 등의
명령어를 이용하면 됩니다.
해결법은
1. 운영체제의 커널을 뜯어 고쳐서 컴파일 하는 방법이 있습니다. 박사과정에
계신 분에게 질문 했더니 이 답변을 주시더군요. 미치는 줄 알았습니다.
2. 이 제한은 한 프로세스에게 해당하는 이야기이므로 여러 프로세스를 포크
시켜서 사용하면 문제가 없습니다. 즉, 각 프로세스가 1000명씩의 사용자를
받으면 되는 겁니다.
3. 코바 쓰세요. 참 편하고 좋습니다. 단, ORB 가 매우 비싸므로 배보다 배꼽이
더 크게 되는 수가 있으니까 중대형 프로젝트 이상일 경우에만 고려를...
2. 스레드의 메모리 사용
일반적으로 클라이언트 하나당 스레드 하나씩 할당해서 Interactive하게 작성
하는 경우가 대부분이죠.
그런데 스레드를 하나 생성하면 그 스레드의 하는 일이나 데이터 크기에 관계없이
무조건 1메가를 그 스레드에게 할당합니다. NT의 경우 4기가의 메모리 영역중
OS가 2기가를 쓰고 우리가 쓰는건 2기가니까 스레드 2000개쯤 열면 끝이죠.
참고로 이거는 가상메모리의 얘기입니다. 실제 램은 256메가라도 스레드
2000개 여는거 가능합니다. 물론 하드가 엄청나게 긁어대기 시작하고 그것
때문에 문제가 발생하는 것도 충분히 가능합니다. 스팍은 상관 없겠지만요...
해결법은
1. JDK 1.x 의 경우 -ms -mx 옵션으로 힙 영역을 늘려주고
JDK 1.2x 의 경우 -Xms 등으로 늘려줍니다.
2. IBM 의 Win32 용 JDK의 경우 옵션을 이용해서 스레드가 1메가가 아닌
256K 를 사용할 수 있도록 허용했습니다. 이미 다른 언어에서는 이런
식의 지원이 많은 걸로 아는데 자바만은 현재 IBM 밖에 없는 걸로 압니다.
3. 위에서도 썼지만 이 문제 역시 한 프로세스에게 적용되는 문제이므로
여러 프로세스가 스레드 1000개씩 나눠서 쓰면 문제 없습니다.
3. 운영체제의 선택
운영체제마다 여러가지 이유로 감당할 수 있는 사용자 수에 제한이 있습니다.
대략 Solaris > Windows NT > Linux > FreeBSD 정도의 순입니다. 말 그대로
대략(!!)입니다. 어떤 VM을 쓰냐에 따라 이 순서는 틀려집니다. 하지만
솔라리스의 경우 항상 최강의 성능을 보여주더군요. 다른 OS는 사용자가
많아지면 아예 감당을 못하거나 성능이 떨어지는데 솔라리스는 약 4000명까지
별 성능 저하없이 받아들였습니다.
그리고 FreeBSD 가 가장 약한 모습을 보여줬는데 한가지 간과해선 안
될 점은 FreeBSD는 개발 목표가 안정성이었습니다. 그래서 성능 같은 문제는
떨어질지 몰라도 안정성은 거의 최강일 겁니다. 결정적으로 무료입니다.
4. VM의 선택
TowerJ for Linux의 경우 처음 900명 정도까지는 강한 모습을 보여줬지만
그 이후로는 맥을 못 춥니다. 반대로 Sun JDK for Solaris 의 경우 처음은
TowerJ 보다 느렸지만 2000명이 넘어도 처음과 비슷한 수준의 성능을
보여줬습니다. 음... 이 경우는 운영체제가 틀리니 적절한 비교가 아니군요.
IBM JDK for Windows는 2000명이 넘는 사용자를 수용했지만 Sun JDK for Windows
의 경우 1000명도 수용 못 했습니다.
이런 식으로 자바 가상 머신의 선택도 매우 중요한 영향을 미칩니다.
5. 결론
경제 사정과 문제 영역에 적합하게 잘 골라서 사용하세요. ^^
참고로 이 글은 Volano mark(http://www.volano.com) 와 제가 직접 테스트 해
본 결과들을 토대로 작성한 겁니다. 위의 사이트에 상당히 자세한 정보가
있으니까 관심있는 분들은 한 번 가보세요. 연도별로도 정리가 돼서 자바
가상머신의 속도 변천사도 볼 수 있습니다.
ps> 10번 게시판에 질문을 올렸을 때 자바 VM으로 1000명을 수용하는 건
불가능 하다는 얘기를 들었는데 CPU는 잘 기억이 안나고 램 256메가에서
2200명의 클라이언트를 소켓으로 연결받아서 각각의 스레드(2200개)에서
BufferedInputStream과 PrintStream을 열어서 2초 간격으로 간단한 메시지를
주고 받는 프로그램을 무사히(그러나 하드는 죽어라 드르륵...) 돌렸습니다.
물론 이 경우 별 하는 일도 없었고 다른 프로그램도 안 돌아가는 상황이긴
했지만 그 컴퓨터 별로 사양도 좋지 않은 컴인데도 잘 돌더군요.
from http://fortest.dhs.org/board/view.asp?id=javastudy&page=1&num=19&lnum=19&ref=0
반응형
'공부 > 컴퓨터' 카테고리의 다른 글
Queue (0) | 2003.08.27 |
---|---|
Stack (0) | 2003.08.25 |
[정보처리기사] 군 관련 경력 증명 (0) | 2003.08.06 |
스크립트를 이용한 HTML 페이지 작성 (0) | 2003.07.15 |
[HTTP] 자바 스크립트를 사용한 HTML 출력 (0) | 2003.07.15 |