CLI untuk menganalisis dump heap ruby. Terima kasih kepada Sam Saffron untuk ide dan kode awal.
Tambahkan baris ini ke gemfile aplikasi Anda:
gem 'heapy'
Dan kemudian mengeksekusi:
$ bundle
Atau instal sendiri sebagai:
$ gem install heapy
Jalankan dengan dua input untuk menghasilkan nilai hari ini. Dump yang tidak ada di kemarin.dump
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
Jalankan dengan tiga input untuk menunjukkan perbedaan antara dua yang pertama, tetapi hanya jika objek masih dipertahankan di ketiga
$ 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
# ...
Lulus atas nama file output dan objek yang ada di hari ini. Dump yang tidak ada kemarin.dump akan ditulis ke file itu
$ 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
Karena bagaimana pengumpul sampah di MRI mengelola objek pada tumpukan ruby, heapy diff
dapat menghasilkan diff yang tidak lengkap atau salah dalam keadaan berikut:
GC.compact
. Secara umum, setiap mekanisme yang menggerakkan objek yang ada dari satu slot heap ke yang lain akan membatalkan laporan diff. Selalu matikan pemadatan sebelum mengambil tumpukan <after>
tumpukan.<after>
jika Ruby mengalokasikannya ke dalam heap slot yang sebelumnya ditempati oleh objek yang berbeda di dump <before>
, dan yang kemudian dialokasikan di antara kedua dump. Untuk meminimalkan kemungkinan hal ini terjadi, memicu GC utama tiga kali atau lebih di antara tumpukan tumpukan dapat membantu menangani para penyintas dan dengan demikian menstabilkan tumpukan sebelum mengambil diff.Langkah 1) Hasilkan tumpukan tumpukan. Anda bisa melakukan ini secara manual. Atau Anda dapat menggunakan alat seperti Delailed_Benchmarks
Langkah 2) Setelah Anda mendapatkan tumpukan tumpukan, Anda dapat menganalisisnya menggunakan CLI ini:
$ 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
# ...
Catatan: Alasan Anda mungkin mendapatkan generasi "nihil" adalah objek -objek ini dimuat ke dalam memori sebelum kode Anda mulai melacak alokasi. Untuk memastikan semua alokasi dilacak, Anda dapat menjalankan skrip ruby Anda trik ini. Pertama -tama buat file trace.rb
yang hanya memulai penelusuran alokasi:
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
Sekarang pastikan perintah ini dimuat sebelum menjalankan skrip Anda, Anda dapat menggunakan Ruby's -I
untuk menentukan jalur beban dan -r
untuk menentukan perpustakaan yang dibutuhkan, dalam hal ini file jejak kami
$ ruby -I ./ -r trace script_name.rb
Jika baris terakhir dari file Anda tidak valid JSON, pastikan Anda menutup file setelah menulis dump heap ruby untuk itu.
Anda dapat menelusuri ke generasi tertentu. Dalam contoh sebelumnya, generasi ke -17 terlihat sangat besar, Anda dapat mengebornya:
$ 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
Anda dapat membatasi output dengan meneruskan nilai --lines
:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
Catatan: Nilai garis default adalah 50
Jika Anda ingin membaca semua generasi, Anda dapat menggunakan arahan "Semua"
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
Anda juga dapat menggunakan heap analyzer berbasis JS online T-Lo untuk visualisasi. Alat lain adalah Harb
Setelah memeriksa repo, jalankan $ bundle install
untuk menginstal dependensi. Kemudian, jalankan rake spec
untuk menjalankan tes.
Untuk menginstal permata ini ke mesin lokal Anda, jalankan bundle exec rake install
. Untuk merilis versi baru, perbarui nomor versi di version.rb
, dan kemudian jalankan bundle exec rake release
, yang akan membuat tag git untuk versi, Push Git Commits and Tag, dan tekan file .gem
ke rubygems.org.
Laporan bug dan permintaan tarik dipersilakan di GitHub di https://github.com/schneems/heapy. Proyek ini dimaksudkan untuk menjadi ruang yang aman dan ramah untuk kolaborasi, dan kontributor diharapkan untuk mematuhi Kode Perilaku Perjanjian Kontributor.
Permata tersedia sebagai open source di bawah ketentuan lisensi MIT.