APACHE! maxclients 는 잡으시는 기준이 있으십니까?

impactbar의 이미지

IT로 밥먹고 살면서 그냥 살아있기"만" 한것 같아 간단한 기술 토론이 하고 싶어서 먼저 글을 띄웁니다.

주제는 apache 이며 그중에 maxclients 부분에 대해 이야기 해볼까 합니다.

모두 아시겠지만 간단히 설명 드리면

최대 동시접속을 의미하며 아파치 설정 중 가장 중요한 부분입니다.

소스 컴파일 설치를 하면 256이 기본 최대값(prefork, worker일 경우 ThreadsPerChild값을 수정해서 1024) 이며 소스상에서 살짝 바꿔 주거나 httpd.conf 상에서 ServerLimit 설정으로

수정없이 maxclients값을 더 올릴 수 있습니다.

가상적인 시스템을 구성해 보면

가장 기본적인 구성 (제품명은 임의로 골랐습니다만 상당히 많이 쓰이는 조합니다.눈에 들어오기 쉽게 하기 위해 그대로 기재하였습니다.)

3tier : 정적데이터처리의 apache, 동적데이터처리의 weblogic, DB의 oracle

웹서버 (apache:쿼드 1EA , 메모리 4기가) 1대
WAS (weblogic: 쿼드 2EA , 메모리 16기가) 2대
DB서버 (oracle: 쿼드 4EA , 메모리 32기가) 1대

위 시스템은 어느정도 사용자 수를 고려한 서버이나 실제 동시접속자 수는 누구도 책임 질 수 없는 상황입니다.

당신은 apache 설치 및 설정의 사명을 띄고 현장에 투입되었으며 아파치 설치는 모두 당신만을 바라 보고 있습니다.

당신은 설정에 앞서 "동접 몇으로 잡아드릴까여?" 하고 고객에게 묻습니다. 답변은 " 보통 몇으로 잡나요? " 하고 옵니다.

여기서 부터 토론입니다.

위에 같은 구성에서 어느 것을 고르겠습니까?

==================================================================================================

1) 256으로 잡고 일단 상황을 지켜본다. (정식 오픈 30분 전!!!)

2) 512 정도면 문제 없지 않을까? ( 기본으로 잡으면 웬지 성의 없지 않을까!!! )

3) 안정감 있게 1024로 잡는다. ( 1024..웬지 모르게 완벽한 숫자 )

4) 4096 잡으면 이것 때문에 문제는 없을 듯 ( 프로세스당 1메가로 계산하면 apache가 서버를 죽일 수도... )

==================================================================================================

당신의 현명한 선택을 올려주십시오. 해당 번호 선정 이유를 통해 의견 교환도 해봤으면 좋겠습니다.

사족을 달자면

실제 maxclients는 뒷단 was와 네트워크 대역폭에 영향을 받습니다.

was의 응답속도가 느려질수록 apache는 다른 요청 처리를 위해 더 많은 소켓을 열어야 되고

네트워크 대역폭이 좁아질수록 정적 데이터가 무식하게 큰 경우 데이터 전송 중에 또 다른 전송을 위하여 또 더 많은 소켓을 열어야 합니다.

같은 동시 접속자라도 maxclients가 달라지는 경우입니다. 이게 keepalive랑 겹쳐지면 사태는 더 심각해집니다.

반대의 경우 apache 프로세스는 개당 0.5MB로 계산할 수도 있지만 프로세스가 캐쉬로 비대해지면 2MB로 계산될 수도 있습니다. 더 커질 수도 있습니다.

프로세스가 비대해지면 maxclient가 시스템의 목줄을 줠 수도 있습니다.

WAS나 DB는 웹서버 엔지니어로써는 블랙박스로 가정합니다.

koseph의 이미지

아파치라면 ab도 있구요.

저는 개인적으로 윈도용 벤치마크 프로그램을 구매해서 지금까지 쓰고 있습니다.

저 같은 경우 서비스 시작 전에 죽어라 동시접속을 걸어 봅니다.

가장 취약하거나 혹은 가장 많이 쓰이는 URL을 타겟으로 걸죠.

그 상태에서 서버가 어떤 거동을 보이는지 모니터링 하시구요.

그런 상태에서 maxclients가 의미가 있을 것 같습니다.

WAS가 살아 있어도 응답시간이 너무 길다면 maxclients는 전혀 의미가 없지 않을까요?

There's always another way, dear.

---------------------------------
There's always another way, dear.

impactbar의 이미지

답변 감사 드립니다.

일단 제가 올린 글은

was 쪽 tps 계산을 끝낸 서버가 아니고

웹서버로 설정하러 간 엔지니어 입장으로서

apache 설정시 손에 아무 것도 없는 상태에서

maxclients를 어떻게 잡으시는지 토론하고자 하는 의미에서 올린 글입니다.

아무리 빠른 WAS라도 apache의 tps보다는 낮은 경우가 태반인지라

응답 시간이 적절한 WAS라면 apache의 maxclients는 얼마로 두시는지 고견을 듣고자 하는 것입니다.

비유하자면 java 코딩할 때 {를 어디에 두는지 묻는 것하고 같은 겁니다.

여기서 저의 선택은 2번 512로 설정 할 것 같습니다.

이유는

1) WAS의 최대 응답 시간을 3초로 예상하고 한유저가 3 컨넥션을 열었을 경우 170 유저를 최대 3초간 수용할 수 있으며

2) 3초간 170 유저가 동일 시간에 hit 확률을 10%라고 예상하면 1700 정도가 일반적인 동시접속이라고 예상합니다.

즉 특별한 이슈가 없으면 1700 명의 유저가 일으키는 일상적인 트래픽 정도라고 판단하는 겁니다.

위 글은 특별한 근거 자료가 있는 것은 아니며 제가 맨땅에 헤딩해야 되는 상황에서

maxclients를 설정할 때 쓰는 기준입니다. 위 설정후 maxclients를 수정하거나

로그 분석 또는 부하 테스트를 거쳐서 튜닝 포인트를 고객에게 전달합니다.

위 내용에 이견이나 좋은 경험담 있으시면 경청하겠습니다.

송효진의 이미지

4GB 면 256 이 적당할것 같습니다.
http://kldp.org/node/89218

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

koseph의 이미지

Quote:
위 시스템은 어느정도 사용자 수를 고려한 서버이나 실제 동시접속자 수는 누구도 책임 질 수 없는 상황입니다.

거기다가 keepalive까지???

너무 하시는 거 아닙니까? ㅎㅎㅎ

그러니까 일단 어떻게 설정하겠느냐를 물어 보신건가요?

제가 보기엔 얼른 답을 정하기가 그렇습니다.

전 좀 상세히 묻고 그 시나리오에 맞추어서 결정하는 편이라....

이런 상황에서라면 prefork는 일단 피하고 봅니다.

worker 모델로 가야겠죠.

그런데 같은 worker 모델이라도 ThreadsPerChild에 지정한 값에 따라 성능도 왔다갔다 하구요.
농담이 아니라 이건 해보셔야만 최적치를 찾아내실 수 있어요. 감으로 해결할 문제는 아닙니다.
사용한 배포판에 따라서도 성능이 왔다갔다 합니다.

지금 여기선 쿼드코어라 이거 직접 해보지 않은 이상 단순히 이 값을 정하는 건 큰 의미가 없을 것 같습니다.

그리고, 이미지가 좀 있는 경우라면(아마도 우리나라 대부분의 상용 사이트가 여기에 해당) 저 같으면 아파치에만 의존하지 않습니다.
Apache를 static image에 쓴다는 건 엄청난 시스템 자원낭비입니다. 사실 빠르지두 않구요.

예전엔 이미지 서버를 직접 만들어서도 사용했습니다. 요즘엔 경량 이미지 서버로 쓸만한 웹서버도 많이 있지요?
하지만 이것은 개발자들하고 손발을 맞추어야 하는 문제가 있기 때문에....
그게 안된다고 하면....

그리고 예전에 김정균님께서 지적하셨듯이 아파치를 static build 했을때라면 또 이야기는 달라집니다.

문제를 너무 일반화 하신게 아닌가 싶네요.

일단 제가 하는 걸 보죠.
1. 꼭 필요한 모듈만 설정하고 아파치를 올린 후에
2. mpm의 경우 쓰레드 하나당 얼마나 메모리를 차지하는지 확인하고
메모리 사용량을 프로세스로 보셨다면 ThreadsPerChild 갯수로 나누어 주셔야 쓰레드가 사용하는 양을 알 수 있겠죠?

3. 우선 가장 이상적인 값을 구합니다.
tmp_maxclients = int(가용메모리(실제메모리가 아니구요) / 쓰레드가 차지하는 메모리)

이걸 다시 mpm에 맞도록 숫자가 작은 쪽으로 맞추어야겠죠.

직장 생활하고 계시니깐 이게 전부가 아니라는 건 너무나 잘 알고 계실테구요. 이 숫자는 말씀하신 위의 경우에서 다른 박스가 모두 블랙박스이므로 사실 의미가 없을 가능성이 농후합니다.
There's always another way, dear.

---------------------------------
There's always another way, dear.

impactbar의 이미지

256 으로 대부분 서비스 운영하였는데 두번인가 낭패본 경험이 있습니다.

첫번째로

1500명 정도의 사용자가 있고 근무 시간에 주로 웹브라우저를 열어두고 다른 작업을 하는 경우인데요.

10% 동접으로 가정하고 셋팅했는데

웹페이지에 3초마다 리로딩하는 코드가 섞여 있더군여.

엄청난 접근로그 증가와 함께 프로세스가 256 최대값으로 유지되면서 서비스가 느려지는 상태가 되본적이 있었습니다.

maxclients를 1024로 올려주고 개발 사업단 쪽으로 연락해서 장애 원인을 설명하고 코드를 수정한 경험이 있습니다.

두번째로

256으로 설정된 평화롭던 웹서버가 있었는데

사용자의 편의를 위해서 SSO를 만들고 모든 웹서버(다른장비포함)의 인증을 평화롭던 256서버를 거치게 만들면서

서버가 먹통이 된 경우도 있었습니다.

특징은 서버가 출근시간 직후, 점심시간, 월급날 죽는다는 특징을 가집니다.

조치는 maxclient를 1024로 잡으니 해결되더군요.

또한 성능향상을 위해 접근 로그는 꺼버리고 에러로그만 유지하는 형태로 했습니다.

...

maxclients 관한 좋은 경험 있으면 올려주세요 ^^ 굽신굽신.

아니면 기억나시는 설정값(maxclients가 아니더라도)이 있으시면 올려주시면 감사하겠습니다.

추운날 감기 조심하세요.

송효진의 이미지

2G 에서 조차 1024 를 버틸만한 메모리가 되지 못한다고 판단했습니다.
(쿼리속도가 중요해서 dbms 에 메모리를 많이 할당하기도 했습니다만.)
한참 웹접속이 많을 때 1024 로 하면 SwapCached 를 마구 사용하며 엄청 느려집니다.
그때 취한 조치는 MaxClients 200 에 KeepAlive Off Timeout 30 이었습니다.

요즘은 worker MaxClients 150 KeepAlive On KeepAliveTimeout 2 로 해 놓습니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

시노의 이미지

여담입니다만

max clients 최대값을 주로소스를 수정해야지만 가능하다고 알고있는데요

요즘은 20000으로 설정되어있어서 그냥 httpd.conf만 수정하시면 될껍니다.

아래와 같이 설정되어있죠

#ifndef DEFAULT_SERVER_LIMIT
#define DEFAULT_SERVER_LIMIT 256
#endif
 
/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT.  We want
 * some sort of compile-time limit to help catch typos.
 */
#ifndef MAX_SERVER_LIMIT
#define MAX_SERVER_LIMIT 200000
#endif

단 ;
mpm 설정하실때
ServerLimit값을 MaxClients 보다 먼저써야되고 크게 잡아줘야됩니다

------------------------------------------------
Wanting someone more than looking at yourself is called addiction

------------------------------------------------
Wanting someone more than looking at yourself is called addiction

송효진의 이미지

컴파일 옵션에 주면 됩니다.
export CFLAGS="${CFLAGS} -DDEFAULT_SERVER_LIMIT=1024"

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

시노의 이미지

디폴트라는건 말그대로 디폴트이고 ...

ServerLimit 값으로 httpd.conf 에 넣으면 소스수정없이도 된다는말이었는데 제가 말을 잘못한듯하군요..

단 위에 적은것처럼 ServerLimit 도 20000이상은 안되죠 ㅋ
------------------------------------------------
Wanting someone more than looking at yourself is called addiction

------------------------------------------------
Wanting someone more than looking at yourself is called addiction

송효진의 이미지

아래와 같이 되어있는 부분의 값을 변경하기 위해 '소스'를 수정하지 않아도 된다는 답변이었습니다.^^;

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

단풍의 이미지

Apache 웹 서버 MaxClients 많이 수용 할려면 Prefork대신 Worker(으)로 가야겠죠.

KeepAlive On
KeepAliveTimeout 2

송효진님 말씀처럼 KeepAliveTimeout 값을 적절하게 잡으시고 시스템 자원 모니터링을 해야합니다.

부하 테스트를 해 보시면 아시겠지만 KeepAlive Off로 할 경우에는 타임아웃 소켓이 너무 많이 열려서 커널 로그에 보면 경고 메세지를 보시게 될겁니다. (커널 파라미터 튜닝을 해야겠죠)

다즐링의 이미지

아파치는 범용 웹서버이지..

static 전용이라면 아파치를 쓰면 안된다고 생각합니다.

웬만하면

lighttpd 나 nginx 를 쓰세요.

설정도 간편합니다.

------------------------------------------------------------------------------------------------
Life is in 다즐링

------------------------------------------------------------------------------------------------
Life is in 다즐링

impactbar의 이미지

제 의견은 조금 다릅니다.

어느 정도 퍼포먼스를 원하시는지는 잘 모르겠으나 아파치는 정적 컨텐츠만을 다루는 용도로 현업에서 사용하기에 충분히 빠릅니다.

송효진의 이미지

안된다기 보다는 현격한 차이가 난다는거죠.
현업에 쓰지 못할 정도로 느리다는 얘기는 아닙니다.^^
정적인것에 위에 언급된 서버를 사용하면 분명한 이득이 있습니다.
아직까지 서버를 여러대 쓸 수 없어 아파치만 쓰는 1人

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

emerge money
http://wiki.kldp.org/wiki.php/FuntooInstallLog - 명령어도 몇 개 안돼요~
http://xenosi.de/

다즐링의 이미지

아파치가 느리다는게 아닙니다.

위에 적으신 글에서..

apache 의 역활은 static file serving 과 proxy 정도의 역할 밖에 하지 않습니다.

아래와 같은 이유도 적어주셨는데 굳이 apache 를 사용할 이유를 못느끼겠다는 거죠. 제말은..;

apache 밖에 사용 할 수 없는 환경이라면 동접자와 예상결과치를 가지고 있어야합니다.

아파치는 현재 위의 예제에서의 스펙으로는 많은 동접을 버틸수 없는 구조가 됩니다.

L4 가 있는 것도 아니고 웹서버 여분도 없으며 얼마나 들어올지도 모르는데

( WAS 가 블랙박스라는 가정은 난 책임을 안지겠다 라고 해석을 할때 )

lighty 나 nginx 를 쓰겠다는 것이죠.

튜닝의 끝은 순정이기는 합니다만 순정을 선택할때 그 만큼 포기 하는 것이 있어야합니다.

그리고.. 그냥 궁금해서 질문을 드리는데 프로세스가 캐쉬로 비대해지는것이 무슨 뜻인가요?

보통 버퍼싸이즈는 정해져 있고 캐쉬는 아파치에서 따로 두지 않으면 시스템 단에서 io cache 를 하는 것으로 알고 있습니다만..
프로세스랑 관계가 없지 않나해서 드리는 질문입니다.

당신의 현명한 선택을 올려주십시오. 해당 번호 선정 이유를 통해 의견 교환도 해봤으면 좋겠습니다.
 
사족을 달자면
 
실제 maxclients는 뒷단 was와 네트워크 대역폭에 영향을 받습니다.
 
was의 응답속도가 느려질수록 apache는 다른 요청 처리를 위해 더 많은 소켓을 열어야 되고
 
네트워크 대역폭이 좁아질수록 정적 데이터가 무식하게 큰 경우 데이터 전송 중에 또 다른 전송을 위하여 또 더 많은 소켓을 열어야 합니다.
 
같은 동시 접속자라도 maxclients가 달라지는 경우입니다. 이게 keepalive랑 겹쳐지면 사태는 더 심각해집니다.
 
반대의 경우 apache 프로세스는 개당 0.5MB로 계산할 수도 있지만 프로세스가 캐쉬로 비대해지면 2MB로 계산될 수도 있습니다. 더 커질 수도 있습니다.
 
프로세스가 비대해지면 maxclient가 시스템의 목줄을 줠 수도 있습니다.
 
WAS나 DB는 웹서버 엔지니어로써는 블랙박스로 가정합니다.

------------------------------------------------------------------------------------------------
Life is in 다즐링

------------------------------------------------------------------------------------------------
Life is in 다즐링

impactbar의 이미지

관심 가져 주셔서 감사합니다. 죄송합니다. 제가 설명 못드린게 있는 것 같습니다.

일단

아파치하고 웹로직이 있을 경우 연동 모듈을 사용합니다.

정적 컨텐츠는 일단 아파치가 설치된 로컬 디스크에 위치하며 동적 처리(jsp, sevlet 등등)는 모두 웹로직(WAS)이 처리합니다.

위 예제에서 설명 못드린 부분은 "모든 요청은 아파치로 온다" 입니다. ( 부하 -> apache -> weblogic *2 -> oracle )

아파치에서 웹로직으로 보내도록 설정한 file, location 은 모두 웹로직으로 갑니다.

즉 연동 모듈(mod_wl_20.so같은)을 사용해야되는데 말씀하신 범용 웹서버가 아니면 구하기 힘들다는 것입니다.

또한 아파치는 정적 데이터 처리뿐만 아니라 함께 로드벨런싱을 합니다. 웹로직은 2대라고 위에 기술되어 있습니다. (정확히는 모듈에서 지원)

L4 역할은 아파치가 하며 저는 위와 같은 상황이면 WEB서버보다는 WAS의 추가 증설이 가능한지 걱정할 것 같습니다.

또한 단일 아파치가 문제가 될 것 같으면 아파치를 file 또는 location 부분 많큼 따로 기동해서 앞단에서 proxy 설정 후 부하 분산이 가능하게 설정하면 됩니다. (아파치가 아파치들을 부하분산)

네트워크 트래픽이 문제일 경우 text 데이터에 대한 압축하고 메모리 캐쉬를 설정해서 성능을 많이 향상 시킬 수 있습니다.

*예제 부분의 "캐쉬가 시스템 목줄을 ..."은 아파치 프로세스가 개당 40-50 메가를 차지하며 서버가 먹통이 되는 것을 확인해서 드린 말씀입니다.
( 정확히 상기 예제에서 캐쉬를 사용한다는 말이 아닙니다. 죄송합니다. 많은 모듈-특히 php 같은 부분에서 많이 사용합니다.)

정리하자면 아래와 같습니다.

1. 위와 같은 구조(아파치가 게이트 역할을 하는 구성)에서는 범용 웹서버(apache와 같은)가 아니면 구성하기 힘들다. ( was사 지원 문제 )
2. 아파치는 WAS 앞단에서 L4 역할을 한다. 그외에도 실시간 압축, 아파치 다중 기동과 리버스 프록시를 통한 부하 분산, 자체 캐쉬 설정을 통한 부하 감소가 가능하다.
3. 캐쉬 사이즈는 모듈 설정에 따라 결정된다.

제 의견은

정적 데이터와 연동을 위해 아파치 만을 사용해도 좋다. 입니다.

감사합니다. 이런 식의 토론이 더욱 많아 졌으면 합니다.

다즐링의 이미지

그런 이유가 있으셨군요.

제가 구성할때는 주로 앞단의 아파치는 reverse proxy 로 사용하고

static 으로 컴파일 하였고 ( 모듈 3개인가 4개인가 남기고 다 제외 ) WAS 는 역시 외부접속이 안되게 하였습니다.

keep alive 는 꺼두었고.. 갯수는 기억이 나지 않는군요.

제가 lighty 나 nginx 를 사용해야 한다고 설명드린 이유는 위와 같이

1. 접속량 측정불가
2. WAS 에 대한 책임 없음
3. 단순히 reverse proxy 로 사용 ( 위 처럼 mod_wl 이런걸 쓰지 않는 상태이며 쓴다는 가정을 하지 않습니다. )

할 경우입니다. =)

아파치도 충분히 빠릅니다. 설정을 충분히하고 환경이 맞추어진다면 말이죠.

------------------------------------------------------------------------------------------------
Life is in 다즐링

------------------------------------------------------------------------------------------------
Life is in 다즐링

mirr의 이미지

맥스클라이언트는 1024 로 적당히 충분하게 잡고, 타임아웃등을 줄여주며, 메모리리밋과 CPU로드 리밋지시자를
적절히 설정하여 페이지당 최대 메모리점유 및 프로세스 CPU 로드제한,프로세스제한, 타임아웃들 (킵포함),
최소 실행프로세스, 스페어 프로세스 등을 잡아주고 상황을 지켜 보겠습니다....

물론 메모리 4기가 기준입니다..

결과적으론 제시하신 내용대로 특별한 상태정보나 계산이 불가능 했을 경우 1024 인 3번을 택하겠습니다.
그리곤 메모리제한을 soft 하게는 12메가, 하드하게는 13메가 정도, CPU 는 소프트 7, 하드 10
또 추가적으로 ProcessLimit 을 RLimitNPROC 30 50 정도로 주고 나오겠습니다...
이유는 역시 1024가 왠지 정감이 가서입니다.... =3=33

------------------------------------------------------------------------------------------
내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

creativeidler의 이미지

뒤늦게 답글 달아봅니다. 제가 그동안 실험하고 연구한(?) 결론은 이렇습니다.

어쨋든 MaxClients는 메모리 사용량과 직접적인 상관이 있습니다. 계산을 좀 해보면..
전체 메모리 사용량 total
아파치 이외의 프로세스가 사용하는 메모리량 others
request 하나 처리하는데 드는 메모리량 per_request

이렇게 두면
total - others > per_request * MaxClients

이 한계 내에서 MaxClients 값을 정해야 합니다.

그러므로, 여기서 중요한 변수는 per_request죠. 만약에 per_request * MaxClients가 total - others보다 큰 값이 되면 어떤 일이 일어날까요? 요청이 들어오면 처리를 하기 위해 프로세스를 만들려고 하는데 메모리의 한계로 프로세스를 바로 만들지는 못합니다. 그럼 load average가 올라가겠죠. 이런 것들이 쌓이면 서버가 죽습니다. 이 때는 대개 ssh로 접속조차 안되고, snmp 모니터링까지 끊깁니다. 메모리가 모자라는데 계속 메모리를 쓸려고 하니까 쌓인 load를 해결조차 할 수 없는 상황이 됩니다. L4에서 빼버려도 load가 잘 안 풀리고, 심지어 콘솔로 들어가도 반응이 없는 상황이 오기도 합니다.

반대로, 요청이 엄청나게 들어오는데 MaxClients가 그에 비해 턱없이 낮다면 어떻게 될까요? 이 경우에도 마찬가지로 서비스가 먹통이 됩니다. 요청에 응답을 해줄 수 없으니까 요청들이 쭉 대기하고 있는 거죠. 하지만, 이 경우에는 상황에 따라 다르긴 하지만 ssh 접속도 안될 정도의 상황은 잘 안 생깁니다. load average도 올라가는 경우가 있고 아닌 경우도 있습니다. 보통은 아파치만 죽고, snmp까지 끊기지는 않습니다. 어쨋든 시스템 자원에 병목이 있는 상황이 아니라 MaxClients가 제한된 상황이기 때문에 기다리면 load가 풀립니다.

그래서, 가장 좋은 것은 메모리 허용량 이내에서 최대값으로 MaxClients를 잡는 것입니다.

만약 static 자원만 서비스한다면 per_request는 아주 작습니다. 서비스하는 파일의 용량과의 상관 관계는 별로 없습니다. 그래서, 이 경우는 MaxClient를 정말 2천, 3천까지 팍 늘려도 괜찮은 경우가 있습니다. 실제 서버의 throughput도 좋아집니다.

자바처럼 proxy 역할만 하는 경우도 마찬가지입니다. 어차피 처리는 자바 쓰레드에서 하는 것이므로 static 서비스와 같은 조건입니다.

하지만 php라면 경우는 다릅니다. php는 아파치 프로세스에 직접 붙어서 돌아가죠. 그러면 php의 메모리 사용량이 고스란히 아파치 프로세스의 메모리 사용량이 됩니다. 그러므로 이 경우는 대개 256 이상 주면 앞서 두 경우 중 전자의 경우에 해당되서 죽습니다. mod_python도 같을 테고, mod_wsgi는 아직 잘 모르지만 비슷하리라 짐작됩니다.

어쨋든 최적값을 찾아내려면 테스트를 해보는 것이 정답입니다만, 사실 웹 서비스 운영하면서 정말 서버의 극한까지 필요한 경우는 드물기 때문에 그런 테스트를 해보는 것이 사치일 수도 있겠죠. 그런 경우는 어지간하면 기본 설정값 건드리지 말라고 권하고 싶습니다. 256이란 숫자도 그냥 나온 숫자가 아니고 아파치 그룹에서 열심히 테스트를 거쳐서 만들어낸 숫자입니다.

그리고, 이건 사족인데, 때때로 "이렇게 하니까 안되었는데 저렇게 하니까 되네"라는 상황에서 "저렇게"가 정답이 아닌 경우가 많기 때문에 단지 죽던 서버 안 죽게 만들었다고 그 방법을 정답으로 여겨서는 안됩니다. 전에 어떤 회사에서는 "매일 자정에 아파치를 리스타트시키는 스크립트를 만들어두니까 서버가 안 죽더라"라고 해서 매일 아파치를 리스타트시키는 것을 정답으로 알고 있는 경우도 있었죠. 그 리스타트시키는 사이 수만 pv가 날아가는데 말입니다. 미신을 믿지 말고, 이론을 확인하고 실험으로 검증합시다.

아, 한가지 덧붙이면, lighttpd는 괜찮은데 nginx는 벤치마크를 하면 fail이 꽤 많은 비율로 떨어집니다. 혹시 안정성을 희생시켜서 성능을 얻는 것은 아닌지 좀 의심이 되는 중입니다.

jaurang2908의 이미지

apache 아직도 쓰는 사람있나요?

왜그래요 다들 nginx 도 모르는 사람들처럼..

jinoos의 이미지

nginx 얘기랑 proxy 얘기가 나와서 하는 말인데, traffic server(TS)도 있습니다.

L7 으로도 사용할수 있으며, Cache Server로도 사용 가능합니다.

http://trafficserver.apache.org/

목적을 찾아서... jiNoos

juy0215의 이미지

웹서버 8대(LVS) 이미지서버 4대(LVS) 로 운영중인 사람이구요~
성능은 웹서버 쿼드 4기가 / 이미지서버는 P4(2.8~3.0싱글) 1기가

여러번 밴치마크 해본결과 (Apache ,Nginx)
웹서버는 apache
이미지서버는 nginx 로 하는것이
최적의 결과값을 주더군요~~

말그대로 동적컨텐츠는 Nginx 보다 Apache가 더 좋은 퍼포먼스와 TPS 를 보였고요
정적컨텐츠는 Nginx 가 더 좋은 퍼포먼스와 TPS 를 보여주었습니다.

접속자는.. 뭐.. 엄청 많다고만 하겠습니다... 정말 엄청 많음..
처음에.. 서비스하기전 .. 쿼드 4기가로 방심하고 Maxclient 4096 줬다가.. 낭패봄.. 순식간에 스왑오버가 ㅋㅋㅋㅋㅋㅋㅋ
뭐 결국 타엽 하고 타엽 하면서 1024로 간간히 버티고있습니다. 조만 간 수치를 더 떨굴지도 ? 메모리 증설하고 2048 로 가보던지 좀더 타엽을 해보려고 하는중이구요 ㅎ

뭐 여튼 그렇다구요~~ ㅎㅎ

-@Naver의 이미지

건강보험공단 그룹웨어 프로젝트를 재작년인가에 했는데. (웹로직 , ohs , jennifer)
웹서버는 apache 기반의 ohs(oracle http server) 썼습니다.
웹서버 4대. 각 16core, 64gb 이엇나??

각 서버별 maxclient 3096 주었습니다. 공단그룹직원 1만6천명 접속이 가능하게 하기 위함이죠.
평소 다같이 저 인원이 들어올일은 없고, 인사발령 때는 정말 1만6천명이 게시판에 동시접속합니다 ㅋㅋ

worker-mpm 튜닝하면서, maxclient 3096을 위해
ThreadPerChild 를 늘리면 CPU 사용률은 낮아지고 메모리 점유율은 높아지고
ServerLimit 을 늘리면 CPU 사용률은 높아지고 메모리 점유율은 낮아지고
여기서 타협점을 찾아 적절히 해줬습니다.

ThreadPerChild를 무작정 늘리기에는, 각 스레드끼리 공유메모리 Lock 발생 횟수가 높아져 전체적인 서비스 지연이 있을것 같은것도 결정에 한몫 했구요..물론 그냥 back-end bypass 용이라 의미는 없습니다.

Keep alive timeout은 업무 분석하여 15초로 주었습니다.
평소 또는 피크타임에 os의 netstat 분석 해보니 대부분 업무 패턴이 15초 이내로 새로고침또는 페이지 이동을 하더라고요. 15초 주니까 os 소켓 재활용 잘되었네요.
hp 서버였던거같은데.. os 커널값에서 time_wait 을 60초로 튜닝했고요.

뭐.. 지금까지 건보 지원하면서 살펴보니 쌩쌩 잘돌아가네요.