2008-08-27 4 views
29

Ruby on Rails에서 컨트롤러 작업을 프로파일 링하는 가장 좋은 방법은 무엇입니까? 현재 나는 병목 현상이 될 것이라고 생각하는 것 사이에 puts Time.now 번의 호출을 던지는 무차별 대항 (brute-force) 방법을 사용하고 있습니다. 그러나 그것은 정말로, 정말로 더럽다고 느낀다. 더 나은 방법이 있어야합니다.레일 컨트롤러 프로파일 작업

답변

9

벤치 마크 표준 라이브러리와 Rails에서 사용할 수있는 다양한 테스트 (유닛, 기능, 통합)를 사용하십시오. 다음 예는 다음과 같습니다

def test_do_something 
    elapsed_time = Benchmark.realtime do 
    100.downto(1) do |index| 
     # do something here 
    end 
    end 
    assert elapsed_time < SOME_LIMIT 
end 

을 그래서 여기에 우리가 벤치 마크 라이브러리를 통해 뭔가 100 번, 시간이 그것을 할, 그리고 시간의 SOME_LIMIT 금액에 미달했다 있는지 확인합니다.

Benchmark.realtime referenceTest::Unit reference과 같은 유용한 링크가 유용 할 수도 있습니다. 또한 '독서'작업을하는 경우 Agile Web Development with Rails의 예제 아이디어를 얻었는데, 이는 다양한 테스트 유형과 성능 테스트에 대해 모두 설명합니다. 정말 오히려 인상적으로,

http://railscasts.com/episodes/98-request-profiling

+3

이 답변이 당신의 작업을 신속하게 실행되고 있는지 확인하는 방법을 알려줍니다. 프로파일 링을 사용하면 어떤 부분이 가장 많은 시간을 소비하는지 알아내는 데 도움이되지 않습니다. –

9

. 면책 조항 : 나는 어떤 식 으로든 FiveRuns와 관련이 없으며 방금이 서비스를 시도했습니다.

TuneUp은 플러그인을 다운로드하는 무료 서비스로, 응용 프로그램을 실행할 때 화면 상단에 자세한 성능 메트릭을 표시 할 수있는 패널을 삽입합니다.

모델,보기 및 컨트롤러에 소요 된 시간의 비율을 보여주는 그래프를 포함하여 멋진 그래프를 제공합니다. 필요한 경우 ActiveRecord가 실행중인 개별 SQL 쿼리를 보면서 드릴 다운 할 수도 있으며 클릭 한 번으로 기본 데이터베이스 스키마를 보여줄 수도 있습니다.

마지막으로 선택적으로 커뮤니티 성능 분석 및 조언을 위해 프로파일 링 데이터를 FiveRuns 사이트에 업로드 할 수 있습니다.

1

당신은 FiveRuns TuneUp 서비스 시도해 할 수 있습니다보고 잘 가치가 프로파일에 Railscast가있다

+3

링크가 끊어졌습니다 (DNS 만료). – mrzasa

39

나는이 기술을 오래 동안 집어 들었고 아주 편리하다고 생각했다.

제자리에 있으면 컨트롤러에 닿는 모든 URL에 ?profile=true을 추가 할 수 있습니다. 당신의 행동은 평소대로 돌아가지만, 렌더링 된 페이지를 브라우저에 전달하는 대신에, 당신의 행동이 그 시간을 보낸 곳을 보여주는 멋지게 형식화 된 루비 프로필 페이지를 보낼 것입니다.

첫째, 아마도 개발 그룹에, 당신의 Gemfile에 루비 교수를 추가

group :development do 
    gem "ruby-prof" 
end 

이 그런 다음와 ApplicationController에 around filter을 추가

around_filter :profile if Rails.env == 'development' 

def profile 
    if params[:profile] && result = RubyProf.profile { yield } 

    out = StringIO.new 
    RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0 
    self.response_body = out.string 

    else 
    yield 
    end 
end 

루비 - 교수 출력을 읽는 것은입니다 조금은 예술이지만, 나는 그것을 운동으로 남겨 둘 것입니다.ScottJShea에 의해

추가 참고 : 당신이 측정 유형 곳이 변경하려면 : 응용 프로그램 컨트롤러의 프로필 방법에

RubyProf.measure_mode = RubyProf::GC_TIME #example

if 전합니다. 사용 가능한 측정 값 목록은 ruby-prof page에서 확인할 수 있습니다. 이 글을 쓰는 시점에서 memoryallocations 데이터 스트림이 손상된 것 같습니다 (see defect).

+4

이 작업을 수행하는 사람은 ApplicationController 상단에 "require 'ruby-prof'를 추가해야합니다. 또한 나를 위해 "self.response_body ="를 "self.response.body ="(Rails 2.3.14)로 변경해야했습니다. – Pavling

+0

개조 해 주셔서 감사합니다. 'response_body'는 Rails 3.0에 추가되었습니다. 그리고 만약 당신이 bundler를 사용한다면, 당신은 루비 - 교수를 요구할 필요는 없지만,이 기술은 이전 버전의 레일스에 꽤 적응할 수있어서 기쁩니다. –

+0

팁 주셔서 감사합니다. 또한 레일 2.3.14를 사용하고 있으며이 문제를 해결하는 데 어려움을 겪고 있습니다. graph_html_printer.rb : 98 :'full_name '에, 내가 설치 한 루비 - 프로의 버전이 무엇이든 상관없이, "잘못된 인자 (0을위한 1)"를 얻습니다. 어떤 아이디어가 그 원인 일 수 있습니까? – jsarma

0

이 레일 4.2.6에서 작동 :

o=OpenStruct.new(logger: Rails.logger) 
    o.extend ActiveSupport::Benchmarkable 
    o.benchmark 'name' do 
     # ... your code ... 
    end