Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jrafanie/f9f12fb2fba548bf6f32eb4276da901e to your computer and use it in GitHub Desktop.
Save jrafanie/f9f12fb2fba548bf6f32eb4276da901e to your computer and use it in GitHub Desktop.
Trace allocations in amazon provider refresh specs
From 19f131f47fc27939374253a936e10a9d7cbe3a3b Mon Sep 17 00:00:00 2001
From: Joe Rafaniello <[email protected]>
Date: Wed, 16 Nov 2016 14:09:45 -0500
Subject: [PATCH] WIP
---
.../amazon/cloud_manager/refresher_spec.rb | 67 ++++++++++++++++++++--
1 file changed, 63 insertions(+), 4 deletions(-)
diff --git a/spec/models/manageiq/providers/amazon/cloud_manager/refresher_spec.rb b/spec/models/manageiq/providers/amazon/cloud_manager/refresher_spec.rb
index 5b3e2da..3f8eb38 100644
--- a/spec/models/manageiq/providers/amazon/cloud_manager/refresher_spec.rb
+++ b/spec/models/manageiq/providers/amazon/cloud_manager/refresher_spec.rb
@@ -1,8 +1,63 @@
+ def iter(n)
+ if n > 0
+ 1.times{
+ iter(n-1)
+ }
+ else
+ # null code
+ end
+ end
+
+ def gc
+ iter(100)
+ GC.start
+ GC.start
+ end
+
+ def start_objspace_trace
+ require "objspace"
+ ObjectSpace.trace_object_allocations_start
+ end
+
+ def stop_objspace_trace
+ ObjectSpace.trace_object_allocations_stop
+ gc
+ gc
+ gc
+ end
+
+ def log_retained_allocations(key = :line)
+ current_file = File.basename(__FILE__)
+ object_hash = {}
+ ObjectSpace.each_object do |o|
+ sourcefile = ObjectSpace.allocation_sourcefile(o) || ""
+ next if sourcefile.include?(current_file)
+
+ obj_key = "#{o.class.name}\t"
+ obj_key << sourcefile if [:line, :file, :path].include?(key)
+ obj_key << ":#{ObjectSpace.allocation_sourceline(o)}" if key == :line
+
+ object_hash[obj_key] ||= Hash.new { |h, _| h[:count] = 0; h[:memsize] = 0 }
+ object_hash[obj_key][:count] += 1
+ object_hash[obj_key][:memsize] += ObjectSpace.memsize_of(o)
+ end
+
+ object_hash.sort_by {|k, v| -v[:memsize]}[0..1000].each do |k, v|
+ puts "m: %11s | c: %7s | %s" %
+ [v[:memsize].to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,"),
+ v[:count].to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,"),
+ k ]
+ end
+ end
+
+start_objspace_trace
+
require_relative "../aws_refresher_spec_common"
describe ManageIQ::Providers::Amazon::CloudManager::Refresher do
include AwsRefresherSpecCommon
+
before(:each) do
_guid, _server, zone = EvmSpecHelper.create_guid_miq_server_zone
@ems = FactoryGirl.create(:ems_amazon, :zone => zone)
@@ -14,16 +69,20 @@ describe ManageIQ::Providers::Amazon::CloudManager::Refresher do
end
it "will perform a full refresh" do
- 2.times do # Run twice to verify that a second run with existing data does not change anything
+ #2.times do # Run twice to verify that a second run with existing data does not change anything
@ems.reload
VCR.use_cassette(described_class.name.underscore) do
EmsRefresh.refresh(@ems)
EmsRefresh.refresh(@ems.network_manager)
end
- @ems.reload
- assert_common
- end
+ @ems.reload
+# @ems.send(:clear_association_cache)
+stop_objspace_trace
+gc
+log_retained_allocations
+ #assert_common
+ #end
end
end
--
2.7.3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment