2008-08-26 3 views
4

My RubyOnRails 앱은 Apache 구성 뒤에 일반 잡동사니 팩으로 설정됩니다. 우리는 Mongrel 웹 서버의 메모리 사용량이 특정 작업에서 상당히 커질 수 있다는 것을 알고 있으며, 언제든지 선택한 Mongrel 프로세스의 동적 재시작을 동적으로 수행 할 수 있기를 바랍니다.정상적으로 Mongrel 웹 서버를 종료하는 방법

그러나, 나는 여기에 가지 않을 이유는 때때로 요청을 서비스하는 동안 우리는 잡종을 방해하지 않는 것이 매우 중요 할 수있다, 그래서 나는 간단한 프로세스 킬 대답없는 가정 .

이상적으로, 나는 잡종에게 "당신이하고있는 일을 끝내고 더 이상 연결을 받아들이 기 전에 종료하십시오"라는 신호를 보내고 싶습니다.

표준 기술이나 이에 대한 모범 사례가 있습니까?

답변

12

우리의 메모리 풋 프린트를 감소 정상적인 종 료를해야하기 때문에 특별한 절차가 필요하지 않습니다.

요청을 처리하는 동안 잡종을 죽이면 얻을 수있는 로그 결과에서 알 수 있습니다. 예 :

** TERM signal received. 
Thu Aug 28 00:52:35 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown' 
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:41 +0000 2008: Reaping 2 threads for slow workers because of 'shutdown' 
Waiting for 2 requests to finish, could take 60 seconds.Thu Aug 28 00:52:43 +0000 2008 (13051) Rendering layoutfalsecontent_typetext/htmlactionindex within layouts/application 
+0

다른 하나를 수락하지 않으면 적어도이 것을 먼저 "올바르게"주문하게됩니다. – Otto

+0

이제 내 답변을 수락 할 수있게 된 것 같습니다. – AndrewR

0

는 사용해보십시오 :

mongrel_cluster_ctl stop 

을 당신은 또한 사용할 수 있습니다

mongrel_cluster_ctl restart 
1

더 나은 질문이 수시로 놈아를 재부팅해야합니다 너무 많은 메모리를 소모에서 응용 프로그램을 유지하는 방법입니다 .

www.modrails.com

내가 잡종 소스에 조금 더 조사를 한 적이하고 잡종은 표준 프로세스 킬 (TERM)와 잡으려고 신호 처리기를 설치하는 것으로 나타났다 크게

+0

modrails는 전체 메모리 사용량을 줄입니다. 그것은 메모리 누수를 해결하지 못합니다. 아마도 이것은 잡종을 다시 시작해야하는 근본 원인 일 것입니다. – ryantm

5

monit을 사용하여보십시오. 메모리 또는 CPU 사용량에 따라 mongrel을 동적으로 다시 시작할 수 있습니다. 다음은 내 클라이언트 용으로 작성한 설정 파일의 행입니다.

check process mongrel-8000 with pidfile /var/www/apps/fooapp/current/tmp/pids/mongrel.8000.pid 
    start program = "/usr/local/bin/mongrel_rails cluster::start --only 8000" 
    stop program = "/usr/local/bin/mongrel_rails cluster::stop --only 8000" 

    if totalmem is greater than 150.0 MB for 5 cycles then restart  # eating up memory? 
    if cpu is greater than 50% for 8 cycles then alert     # send an email to admin 
    if cpu is greater than 80% for 5 cycles then restart    # hung process? 
    if loadavg(5min) greater than 10 for 3 cycles then restart   # bad, bad, bad 
    if 3 restarts within 5 cycles then timeout       # something is wrong, call the sys-admin 

    if failed host 192.168.106.53 port 8000 protocol http request /monit_stub 
     with timeout 10 seconds 
     then restart 
    group mongrel 

그런 다음 모든 mongrel 클러스터 인스턴스에 대해이 구성을 반복하십시오. monit_stub 라인은 monit이 다운로드하려고하는 빈 파일입니다. 그렇지 않으면 인스턴스를 다시 시작하려고 시도합니다.

참고 : Darwin 커널을 사용하는 OS X에서는 리소스 모니터링이 작동하지 않는 것 같습니다.

0

는 트리거/usr/지방/빈/mongrel_rails 클러스터 --only 8000을 시작 :: 때 발생하는 질문

있어?

은이 특정 프로세스에서 제공 한 모든 요청입니다. 또는 그들은 낙태 되었습니까?

나는 호기심이 모든 시작/재시작 것은 ... 최종 사용자에 영향을주지 않고

1

습지를 할 수 있으면 :

당신이 하나 개의 프로세스 실행, 그것은 정상적으로 종료 할 경우

(서비스의 모든 큐에있는 요청은 올바른로드 균형 조정을 사용하는 경우에만 1이어야합니다.문제는 이전 서버가 종료 될 때까지 새 서버를 시작할 수 없기 때문에 사용자가로드 균형 조정기에 대기열에 대기하게된다는 것입니다. 내가 성공한 것은 잡종의 '캐스 캐 이드'또는 롤링 재시작이다. 그것들을 모두 멈추고 그것들을 모두 시작하는 대신에 (따라서 하나의 잡종이 끝날 때까지 대기열에 넣기, 멈추고, 다시 시작하고 연결을 수락 할 때까지 대기열에 넣기), 순종을 멈추고 순차적으로 각 잡목을 시작하여 다음 잡종이 다시 시작될 때까지 호출을 막을 수 있습니다 백업 (/ 상태 컨트롤러에 실제 HTTP 검사 사용). 귀하의 잡종이 굴러 갈 때 한 번에 하나씩 만 다운되며 두 개의 코드베이스를 통해 서비스하고 있습니다.이 작업을 수행 할 수 없다면 1 분 동안 유지 보수 페이지를 던져야합니다. 카피 스트라노 또는 배포 도구가 무엇이든간에 이것을 자동화 할 수 있어야합니다.

그래서 나는 3 개의 작업을 가지고 있습니다 : cap : deploy - 전통적인 유지 보수 페이지를 올리는 훅으로 모든 메소드를 다시 시작한 다음 HTTP 검사 후에 걸리게합니다. cap : deploy : rolling - 유지 관리 페이지가없는이 머신에서이 캐스케이드를 수행합니다 (iClassify에서 해당 머신에있는 잡종의 수를 확인합니다). cap deploy : 마이그레이션 - 유지 관리 페이지 + 마이그레이션은 일반적으로 '라이브'마이그레이션을 실행하는 것이 좋지 않기 때문에 수행됩니다.

관련 문제