Uma CLI para analisar os depósitos de rubi. Agradeço a Sam Saffron pela ideia e código inicial.
Adicione esta linha ao GemFile do seu aplicativo:
gem 'heapy'
E depois execute:
$ bundle
Ou instale você mesmo como:
$ gem install heapy
Execute com duas entradas para produzir os valores de hoje.dump que não estão presentes em ontem.dump
$ heapy diff tmp/yesterday.dump tmp/today_morning.dump
Allocated STRING 9991 objects of size 399640/491264 (in bytes) at: scratch.rb:24
Corra com três entradas para mostrar o diferencial entre os dois primeiros, mas apenas se os objetos ainda forem retidos no terceiro
$ 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
# ...
Passe em nome de um arquivo de saída e os objetos presentes em hoje.dump que não estão em ontem.
$ 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
Devido à maneira como o coletor de lixo na ressonância magnética gerencia objetos na pilha de rubi, heapy diff
pode produzir diffs incompletos ou incorretos nas seguintes circunstâncias:
GC.compact
ou com compactação automática ativada, o Heapy não pode produzir diferenças precisas, porque os objetos podem se mover para slots de heap diferentes e aparecerão como recém-alocados, mesmo que não estivessem. Em geral, qualquer mecanismo que mova os objetos existentes de um slot de heap para outro invalidará os relatórios diff. Sempre desligue a compactação antes de levar o depósito de peso <after>
.<after>
se o Ruby os alocar em slots de heap que foram ocupados anteriormente por diferentes objetos no despejo <before>
de Para minimizar a chance de que isso aconteça, desencadear um GC importante três ou mais vezes entre os dumps de heap pode ajudar a sobreviventes de poste e, assim, estabilizar o pilhão antes de fazer um diferencial.Etapa 1) Gere um despejo de heap. Você poderia fazer isso manualmente. Ou você pode usar uma ferramenta como Derailed_benchmarks
Etapa 2) Depois de receber o depósito de heap, você pode analisá -lo usando esta 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
# ...
Nota: O motivo pelo qual você pode estar recebendo uma geração "nula" é que esses objetos foram carregados na memória antes que seu código começasse a rastrear as alocações. Para garantir que todas as alocações sejam rastreadas, você pode executar seu script Ruby esse truque. Primeiro, crie um arquivo trace.rb
que apenas inicia o rastreamento de alocação:
# trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start
Agora, verifique se este comando está carregado antes de executar seu script, você pode usar o Ruby -I
para especificar um caminho de carga e -r
para especificar uma biblioteca para exigir, neste caso nosso arquivo de rastreamento
$ ruby -I ./ -r trace script_name.rb
Se a última linha do seu arquivo for inválida JSON, verifique se você está fechando o arquivo depois de gravar o despejo do rubi.
Você pode perfurar em uma geração específica. No exemplo anterior, a 17'ª geração parece estranhamente grande, você pode perfurar nele:
$ 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
Você pode limitar a saída passando em um valor --lines
:
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17 --lines=6
Nota: o valor das linhas padrão é 50
Se você quiser ler todas as gerações, pode usar a diretiva "All"
$ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump all
Você também pode usar o analisador Heap JS on-line baseado em T-LO para visualizações. Outra ferramenta é harb
Depois de conferir o repositório, execute $ bundle install
para instalar dependências. Em seguida, execute rake spec
para executar os testes.
Para instalar esta gema na sua máquina local, execute bundle exec rake install
. Para lançar uma nova versão, atualize o número da versão no version.rb
e, em seguida, execute bundle exec rake release
, que criará uma tag git para a versão, push git cometa e tags e pressionará o arquivo .gem
para rubygems.org.
Relatórios de bug e solicitações de puxar são bem -vindos no github em https://github.com/schneems/heapy. Este projeto deve ser um espaço seguro e acolhedor para a colaboração, e espera -se que os colaboradores sigam o Código de Conduta do Covenant colaborador.
A GEM está disponível como código aberto nos termos da licença do MIT.