몽그렐 사용자를 위한 몇가지 팁

지난 글 변하지 않는 것은 없다. 이제 대세는 Passenger(aka. mod_rails)에서 말한대로 Passenger가 현재 시점에서 가장 추천할만한 환경임에 변함이 없다. 게다가 최근 Global Queuing 기능이 들어갔다는 소식은 기존 애플리케이션도 Passenger로 옮겨타는 것을 고려하도록 유혹한다.

 

하지만, 이런 저런 이유로 아직도(?) 몽그렐을 사용하고 있는 곳을 위해 몇가지 팁을 공유한다.

 

이벤트 머신을 활용한 Swiftiply

루비 1.8(MRI)의 경우, 설계상의 이유(그린 쓰레드) 때문에 이벤트 기반 몽그렐의 성능이 더 낫다. 단순히 swiftiply 젬을 설치하고 환경변수만 설정하면 되는 문제이므로, 이벤트 기반 몽그렐을 사용하는게 더 낫다. 안정성 문제는 전혀 없는 것으로 알려져있다.

 

HAProxy를 이용한 글로벌 큐잉(Global Queuing)

보통 사용하는 HTTP 서버에서 제공하는 로더 밸런서(예를들어, 아파치라면 mod_proxy_balancer)를 사용하지만, HAProxy를 이용한 글로벌 큐잉을 도입히는게 낫다.

 

  1.     server myapp_3000 127.0.0.1:3000 check inter 60000 minconn 1 maxconn 1

 

위처럼 HAProxy의 설정에서 maxconn을 1로 제한하면, HAProxy가 요청을 큐잉하면, 몽그렐에는 한번에 하나의 요청만을 보낸다. 약간 더 자세한 설명은 스프링노트 배포 환경 Before & After: Capistrano, God, HAProxy, Seesaw!을 참고하면 좋겠다.

 

현 상태를 신고받는 mongrel_proctitle

mongrel_proctitle 젬을 설치하면 현재 처리하고 있는 요청에 대한 정보를 프로세스 타이틀로 표시해준다. 이런 식이다.

 

  1. mongrel_rails [10010/2/358]: handling 127.0.0.1: HEAD /feed/cal/global/91/6de4

 

여기 담긴 정보는 왼쪽부터 보자면 다음과 같다.

 

 

간단한 아이디어에서 시작했지만, 문제를 찾는데 걸리는 시간을 꽤 단축해주는 유용한 녀석이기도 하다.

 

참고로, Evented Mongrel의 경우는 mongrel_proctitle이 동작하지 않는다. mongrel_proctitle.rb 파일을 열어 아래 코드를 추가해주자.

 

  1.     def dispatch_to_handlers_with_proctitle(handlers,request,response)
          unless @handler
            @handler = ProctitleHandler.new(@titler)
            register("/", @handler, true)
          end
          @titler.request do
            return dispatch_to_handlers_without_proctitle(handlers,request,response)
          end
          end 
          alias_method :dispatch_to_handlers_without_proctitle, :dispatch_to_handlers
        alias_method :dispatch_to_handlers, :dispatch_to_handlers_with_proctitle
      end 

 

참고