Header

  1. View current page

    딥뿔이 자라나는 노트

Profile_image?t=1225424611&type=big
나를 바꾼 똑똑한 생활 습관, 스프링노트 - 여러분도 지금 시작해보세요!
71

이벤트 기반 몽그렐의 성능

루비는 자체적인 스레딩 시스템(green thread)을 가지고 있다. 그런데 이 그린 스레드가 빈약한 기능과 성능, 멀티 코어에 대응되지 못하는 등 여러 문제를 가지고 있어서 많은 이슈를 만들고 있다. 그린 스레드를 루비의 장점으로 보는 시각도 있지만, 루비 2.0에서는 그린 스레드가 빠진다, 계속 남는다 등등 아직도 말이 많은 상태다.

 

레일스에서 널리 사용되는 애플리케이션 서버인 몽그렐도 그린 스레드를 이용해 동시 요청을 처리한다. 하지만 지난 RailsConf에서 루비의 Mutual Lock의 성능이 좋지 않고, 되려 스레드간의 문맥 전환에서 상태 정보를 복사하느라 오버헤드가 많다는 주장이 있었다. 그래서 멀티 스레드 몽그렐을 이벤트 기반의 싱글 스레드로 다시 작성하면 성능면에서 얻는 이득이 있다는 것이다.  메모리 사용량, IO 스루풋도 나아진다고 한다.

 

Swifitply에 포함된 evented_mongrel.rb가 바로 몽그렐을 이벤트 기반 싱글 스레드로 바꿔주는 Hotfix이다. 여기에는 EventMachine이라는 네이티브 라이브러리가 사용되었다. 이 fix를  적용하려면 gem으로 EventMachine과 Swiftiply를 모두 설치하고 몽그렐을 시작할 때 환경변수 EVENT를 1로 설정해주기만 하면 된다. Swiftiply가 mongrel_rails를 재정의하는데, 환경변수에 따라 몽그렐이 동작하는 모드를 바꿔준다.

 

  1. gem install eventmachine
  2. gem install swiftiply
  3.  
  4. env EVENT=1 mongrel_rails start -e production -d

 

실제 애플리케이션이 동작하는데 영향을 주는 부분을 바꾸는 것이 없기 때문에 이벤트 기반 몽그렐을 사용한다고 해서 기존 애플리케이션이 동작하지 않는다거나 하는 일은 일어나지 않을 것 같다. 그런데 정말 빠를까? 빠르다면 얼마나 빠를까? 스프링노트에 적용하기 전에 간단한 벤치마크 테스트를 해보았다. 결론부터 이야기하자면, 정말 더 빠르다.

 

벤치마크

테스트를 수행한 장비는 사양은 이렇다.

 

  • CPU: AMD64 2CPU
  • MEMORY 8G
  • 운영체제: RHEL4

 

벤치마크에 사용한 소프트웨는 몽그렐 1.0.1, Swiftiply 0.5.1, EventMachine 0.7.2이고, 레일스의 버전은 EdgeRails 리비전 7161이다. 그리고 테스트를 위해 간단하게 Hello World를 출력하는 애플리케이션을 작성했다.

 

  1. class TestsController < ApplicationController
      def show
        render :text => 'Hello, Rails'
      end
    end

 

위 애플리케이션을 스레드 모드와 이벤트 모드로 각각 구동하고 동시 요청 수를 1에서 1000까지 늘리면서 테스트를 해보았다.

 

결과

아파치 벤치마크 툴(ab)로 검사한 결과는 다음과 같다.

 

 

결과 중 초당 처리한 요청 수만을 표로 정리하면 아래와 같다.

 

data.png

동시 요청 수에 상관없이 항상 이벤트 기반 몽그렐이 더 나은 성능을 보여줌을 알 수 있다. 특히 주목할만한 점은 동시 요청이 늘어난 즉, 더 가혹한 상황에서 이벤트 기반 몽그렐이 실력을 발휘한다는 사실이다. 기존 몽그렐은 동시 요청이 늘어남에 따라 계속 성능이 떨어지는 모습을 보이지만, 이벤트 기반 몽그렐은 더 나은 성능을 보이기도 하고, 전체적으로 비슷한 수준을 유지함을 알 수 있다.

 

evented_mongrel.png

그래프로 그려보니 그 차이가 더 명확하다.

 

사실 스프링노트에서는 2주째 이벤트 기반 몽그렐을 사용하고 있다.  그간 이벤트 기반 몽그렐때문에 문제가 발생한 적은 한 차례도 없다. 안정적으로 서비스하는데 문제가 없다는 이야기다. 레일스 서비스를 고려한다면, 꼭 이벤트 기반 몽그렐로 바꿔서 성능 테스트를 한번 해보기를 권한다. 공짜로 얻을 수 있는 성능 향상이니까.

 

다음에는 Swiftiply 프록시를 테스해볼 생각이다.  아직 몇 가지 버그가 있는 듯 보여 본격적인 사용은 미루고 있지만, 이는 성능보다는 '안정성'에 도움이 될 수 있는 방법이니만큼 꼭 테스트해봐야겠다.

 

이 글은 스프링노트에서 작성되었습니다.

History

Last edited on 07/04/2007 09:42 by deepblue

Comments (0)

You must log in to leave a comment. Please sign in.