Eine CLI zur Analyse von Ruby Heap -Dumps. Vielen Dank an Sam Safran für die Idee und den ersten Code.
Fügen Sie diese Zeile der GemFile Ihrer Anwendung hinzu:
gem 'heapy'
Und dann ausführen:
$ bundle
Oder installieren Sie es selbst als:
$ gem install heapy
Führen Sie mit zwei Eingängen aus, um die Werte von heute auszugeben. Dump, die in gestern nicht vorhanden sind.dump
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
Führen Sie mit drei Eingängen aus, um den Unterschied zwischen den ersten beiden zu zeigen, jedoch nur, wenn die Objekte noch im dritten beibehalten werden
$ 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
# ...
Geben Sie den Namen einer Ausgabedatei und die in Today vorhandenen Objekte ein.
$ 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
Aufgrund der Art und Weise, wie der Garbage Collector in MRT Objekte auf dem Ruby -Haufen verwaltet, kann heapy diff
unter folgenden Umständen unvollständige oder falsche Diffs erzeugen:
GC.compact
oder mit aktivierter automatischem Kompraktikum verdichten, kann Heapy keine genauen Diffs erzeugen, da Objekte möglicherweise in verschiedene Haufen Slots übergehen und auch dann als neu zugewiesen werden, selbst wenn sie nicht waren. Im Allgemeinen wird jeder Mechanismus, der vorhandene Objekte von einem Heap -Steckplatz zu einem anderen verschiebt, differenzieren. Schalten Sie die Verdichtung immer aus, bevor Sie den <after>
Heap -Müllkippe nehmen.<after>
-Dump weglassen, wenn Ruby sie in Haufen Slots zugewiesen hat, die zuvor von verschiedenen Objekten im <before>
-Dump besetzt waren und dann zwischen beiden Dumps behandelt wurden. Um die Wahrscheinlichkeit zu minimieren, dass dies geschieht, kann das Auslösen eines großen GC drei oder mehr Male zwischen Heap -Dumps dazu beitragen, Überlebende zu veranstalten und so den Haufen zu stabilisieren, bevor er einen Diff nimmt.Schritt 1) Erstellen Sie einen Heap -Dump. Sie könnten das manuell tun. Oder Sie können ein Tool wie entderailed_benchmarks verwenden
Schritt 2) Sobald Sie den Heap -Dump haben, können Sie ihn mit dieser CLI analysieren:
$ 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
# ...
Hinweis: Der Grund, warum Sie möglicherweise eine "NIL" -Gerstellung erhalten, ist, dass diese Objekte in den Speicher geladen wurden, bevor Ihr Code begann, die Zuteilungen zu verfolgen. Um sicherzustellen, dass alle Zuordnungen nachverfolgt werden, können Sie Ihren Ruby -Skript diesen Trick ausführen. Erstellen Sie zunächst eine Datei trace.rb
, die nur die Zuordnungsverfolgung startet:
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
Stellen Sie nun sicher, dass dieser Befehl geladen wird -r
bevor Sie Ihr -I
ausführen
$ ruby -I ./ -r trace script_name.rb
Wenn die letzte Zeile Ihrer Datei ungültig ist, stellen Sie sicher, dass Sie die Datei schließen, nachdem Sie den Ruby Heap -Dump darauf geschrieben haben.
Sie können in eine bestimmte Generation einbohren. Im vorherigen Beispiel sieht die Generation der 17'th -Generation seltsam groß aus, Sie können in sie einbohren:
$ 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
Sie können die Ausgabe einschränken, indem Sie einen Wert --lines
übergeben:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
HINWEIS: Standardzeilen Wert beträgt 50
Wenn Sie alle Generationen lesen möchten, können Sie die "All" -Richtlinie verwenden
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
Sie können auch den Online-Basis von T-Lo für Visualisierungen verwenden. Ein weiteres Werkzeug ist Harb
Führen Sie nach dem Auschecken des Repo $ bundle install
aus, um Abhängigkeiten zu installieren. Führen Sie dann rake spec
aus, um die Tests auszuführen.
Um dieses Juwel auf Ihrem lokalen Computer zu installieren, führen Sie bundle exec rake install
aus. Um eine neue Version zu veröffentlichen, aktualisieren Sie die Versionsnummer in version.rb
und führen Sie bundle exec rake release
aus, die ein Git -Tag für die Version erstellt, Git Commits und Tags drücken und die .gem
-Datei auf rubygemems.org weitergeben.
Fehlerberichte und Pull -Anfragen sind auf Github unter https://github.com/schneems/heapy willkommen. Dieses Projekt soll ein sicherer, einladender Raum für die Zusammenarbeit sein, und die Mitwirkenden sollen sich an den Verhaltenskodex für den Mitwirkenden halten.
Das Edelstein ist unter den Bedingungen der MIT -Lizenz als Open Source erhältlich.