루비 힙 덤프 분석을위한 CLI. 아이디어와 초기 코드에 대한 Sam Saffron에게 감사드립니다.
이 라인을 응용 프로그램의 보석에 추가하십시오.
gem 'heapy'
그런 다음 실행 :
$ bundle
또는 직접 설치하십시오.
$ gem install heapy
오늘의 값을 출력하기 위해 두 개의 입력으로 실행하십시오.
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
처음 두 가지의 차이를 보여주기 위해 세 개의 입력으로 실행하지만 객체가 세 번째에 여전히 유지되는 경우에만
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump tmp/today_afternoon.dump
Retained STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
출력 파일의 이름과 오늘에 존재하는 객체의 이름을 전달합니다. 어제에없는 Dump.
$ heapy diff tmp/yesterday.dump tmp/today.dump --output_diff=output.json
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
# ...
Writing heap dump diff to output.json
MRI의 쓰레기 수집가가 루비 힙의 물체를 관리하는 방법으로 인해 heapy diff
다음과 같은 상황에서 불완전하거나 잘못된 차이를 생성 할 수 있습니다.
GC.compact
통해 또는 자동 경쟁 활성화를 통해 Ruby 힙을 수동으로 압축 할 때, Hepy는 객체가 다른 힙 슬롯으로 이동할 수 있고 그렇지 않은 경우에도 새로 할당 된 것으로 보일 수 있기 때문에 정확한 차이를 생성 할 수 없습니다. 일반적으로, 기존 객체를 한 힙 슬롯에서 다른 힙으로 이동시키는 메커니즘은 Diff 보고서를 무효화합니다. <after>
힙 덤프를 가져 가기 전에 항상 압축을 끄십시오.<after>
덤프에서 다른 물체에 의해 이전에 차지한 힙 슬롯에 할당 된 경우 Diffs는 <before>
덤프에서 물체를 생략하고 두 덤프 사이에 처리되었습니다. 이런 일이 일어날 가능성을 최소화하기 위해 힙 덤프 사이의 주요 GC를 3 번 이상 트리거하면 생존자를 대리하고 차이를 취하기 전에 힙을 안정화시키는 데 도움이 될 수 있습니다.단계 1) 힙 덤프를 생성합니다. 수동으로 할 수 있습니다. 또는 Derailed_benchmarks와 같은 도구를 사용할 수 있습니다
2 단계) 힙 덤프가 있으면이 CLI를 사용하여 분석 할 수 있습니다.
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump
Generation: nil object count: 209191
Generation: 14 object count: 407
Generation: 15 object count: 638
Generation: 16 object count: 748
Generation: 17 object count: 1023
Generation: 18 object count: 805
# ...
참고 : 코드가 할당을 추적하기 시작하기 전에 이러한 객체가 메모리에로드 되었기 때문입니다. 모든 할당이 추적되도록하려면 루비 스크립트를 실행할 수 있습니다. 먼저 할당 추적 만 시작하는 파일 trace.rb
만듭니다.
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
이제 스크립트를 실행하기 전에이 명령이로드되어 있는지 확인하십시오. Ruby 's -I
사용하여로드 경로를 지정하고 -r
지정하여 필요한 라이브러리를 지정할 수 있습니다.
$ ruby -I ./ -r trace script_name.rb
파일의 마지막 줄이 잘못된 JSON 인 경우 Ruby Heep Dump를 작성한 후 파일을 닫고 있는지 확인하십시오.
특정 세대로 드릴 다운 할 수 있습니다. 이전 예에서는 17 세대가 이상하게 크게 보이며 드릴 수 있습니다.
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17
Analyzing Heap (Generation: 17)
-------------------------------
allocated by memory (44061517) (in bytes)
==============================
39908512 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/timeout.rb:79
1284993 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/openssl/buffering.rb:182
201068 /app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:223
189272 /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.13.2.302/lib/new_relic/agent/stats_engine/stats_hash.rb:39
172531 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/net/http/header.rb:172
92200 /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/conversions.rb:131
--lines
값을 전달하여 출력을 제한 할 수 있습니다.
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
참고 : 기본 행 값은 50입니다
모든 세대를 읽으려면 "모든"지시문을 사용할 수 있습니다.
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
시각화에 T-Lo의 온라인 JS 기반 힙 분석기를 사용할 수도 있습니다. 또 다른 도구는 Harb입니다
Repo를 확인한 후 $ bundle install
실행하여 종속성을 설치하십시오. 그런 다음 rake spec
실행하여 테스트를 실행하십시오.
이 보석을 로컬 컴퓨터에 설치하려면 bundle exec rake install
실행하십시오. 새 버전을 해제하려면 version.rb
에서 버전 번호를 업데이트 한 다음 버전에 대한 bundle exec rake release
태그를 생성하고 GIT 커밋 및 태그를 누르고 .gem
파일을 rubygems.org로 누릅니다.
https://github.com/schneems/hapy에서 Github에서 버그 보고서 및 풀 요청을 환영합니다. 이 프로젝트는 협력을위한 안전하고 환영하는 공간이되기위한 것이며, 기고자들은 기고자 계약 규범을 준수 할 것으로 예상됩니다.
보석은 MIT 라이센스의 조건에 따라 오픈 소스로 제공됩니다.