memory 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bake/memory/profiler.rb +37 -0
- data/lib/memory.rb +34 -2
- data/lib/memory/aggregate.rb +128 -0
- data/lib/memory/cache.rb +62 -0
- data/lib/memory/deque.rb +72 -0
- data/lib/memory/report.rb +70 -0
- data/lib/memory/sampler.rb +194 -0
- data/lib/memory/version.rb +25 -0
- metadata +96 -85
- data.tar.gz.sig +0 -2
- data/CHANGELOG +0 -6
- data/LICENSE +0 -339
- data/Manifest +0 -8
- data/README +0 -14
- data/Rakefile +0 -11
- data/lib/memory/object.rb +0 -66
- data/lib/memory/profile.rb +0 -94
- data/lib/memory/usage.rb +0 -65
- data/memory.gemspec +0 -32
- metadata.gz.sig +0 -0
data/Manifest
DELETED
data/README
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
|
2
|
-
Memory
|
3
|
-
|
4
|
-
Some libraries for reporting memory usage.
|
5
|
-
|
6
|
-
== Requirements
|
7
|
-
|
8
|
-
* Linux or OS X
|
9
|
-
|
10
|
-
== License
|
11
|
-
|
12
|
-
Copyright 2007, 2008 Cloudburst, LLC. Licensed under the AFL 3. See the included LICENSE file. Portions copyright 2005 John Carter and used with permission.
|
13
|
-
|
14
|
-
The public certificate for the gem is here[http://rubyforge.org/frs/download.php/25331/evan_weaver-original-public_cert.pem].
|
data/Rakefile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'echoe'
|
3
|
-
|
4
|
-
Echoe.new("memory") do |p|
|
5
|
-
p.author = "Evan Weaver"
|
6
|
-
p.project = "fauna"
|
7
|
-
p.summary = "Some libraries for reporting memory usage."
|
8
|
-
p.url = "http://blog.evanweaver.com/files/doc/fauna/memory/"
|
9
|
-
p.docs_host = 'blog.evanweaver.com:~/www/bax/public/files/doc/'
|
10
|
-
p.require_signed = true
|
11
|
-
end
|
data/lib/memory/object.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
|
2
|
-
include ObjectSpace
|
3
|
-
|
4
|
-
MEMORY_PROFILE_BAD_SIZE_METHOD = {FileTest => true, File => true, File::Stat => true}
|
5
|
-
|
6
|
-
class Object
|
7
|
-
def memory_profile_size_of_object(seen={})
|
8
|
-
return 0 if seen.has_key? object_id
|
9
|
-
seen[object_id] = true
|
10
|
-
count = 1
|
11
|
-
if kind_of? Hash
|
12
|
-
each_pair do |key,value|
|
13
|
-
count += key.memory_profile_size_of_object(seen)
|
14
|
-
count += value.memory_profile_size_of_object(seen)
|
15
|
-
end
|
16
|
-
elsif kind_of? Array
|
17
|
-
count += size
|
18
|
-
each do |element|
|
19
|
-
count += element.memory_profile_size_of_object(seen)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
count += instance_variables.size
|
24
|
-
instance_variables.each do |var|
|
25
|
-
count += instance_variable_get(var.to_sym).memory_profile_size_of_object(seen)
|
26
|
-
end
|
27
|
-
|
28
|
-
count
|
29
|
-
end
|
30
|
-
|
31
|
-
def memory_profile_inspect(seen={},level=0)
|
32
|
-
return object_id.to_s if seen.has_key? object_id
|
33
|
-
seen[object_id] = true
|
34
|
-
result = ' '*level
|
35
|
-
if kind_of? Hash
|
36
|
-
result += "{\n" + ' '*level
|
37
|
-
each_pair do |key,value|
|
38
|
-
result += key.memory_profile_inspect(seen,level+1) + "=>\n"
|
39
|
-
result += value.memory_profile_inspect(seen,level+2) + ",\n" + ' '*level
|
40
|
-
end
|
41
|
-
result += "}\n" + ' '*level
|
42
|
-
elsif kind_of? Array
|
43
|
-
result += "[\n" + ' '*level
|
44
|
-
each do |element|
|
45
|
-
result += element.memory_profile_inspect(seen,level+1) + ",\n" + ' '*level
|
46
|
-
end
|
47
|
-
result += "]\n" + ' '*level
|
48
|
-
elsif kind_of? String
|
49
|
-
result += self
|
50
|
-
elsif kind_of? Numeric
|
51
|
-
result += self.to_s
|
52
|
-
elsif kind_of? Class
|
53
|
-
result += to_s
|
54
|
-
else
|
55
|
-
result += "---"+self.class.to_s + "---\n" + ' '*level
|
56
|
-
end
|
57
|
-
|
58
|
-
|
59
|
-
instance_variables.each do |var|
|
60
|
-
result += var + "=" + instance_variable_get(var.to_sym).memory_profile_inspect(seen,level+1) + "\n" + ' '*level
|
61
|
-
end
|
62
|
-
|
63
|
-
result
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
data/lib/memory/profile.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
|
2
|
-
require "#{File.dirname(__FILE__)}/object"
|
3
|
-
|
4
|
-
module Memory
|
5
|
-
module Profile
|
6
|
-
|
7
|
-
LOG_FILE = "/tmp/memory_profile.log"
|
8
|
-
|
9
|
-
def self.report
|
10
|
-
Dir.chdir "/tmp"
|
11
|
-
ObjectSpace::garbage_collect
|
12
|
-
sleep 10 # Give the GC thread a chance
|
13
|
-
all = []
|
14
|
-
ObjectSpace.each_object do |obj|
|
15
|
-
next if obj.object_id == all.object_id
|
16
|
-
|
17
|
-
all << obj
|
18
|
-
end
|
19
|
-
|
20
|
-
tally = Hash.new(0)
|
21
|
-
max_obj = nil
|
22
|
-
max_count = 0
|
23
|
-
all.each do |obj|
|
24
|
-
count = obj.memory_profile_size_of_object
|
25
|
-
if max_count < count
|
26
|
-
max_obj = obj
|
27
|
-
max_count = count
|
28
|
-
end
|
29
|
-
|
30
|
-
tally[obj.class]+=count
|
31
|
-
end
|
32
|
-
|
33
|
-
open( LOG_FILE, 'a') do |outf|
|
34
|
-
outf.puts '+'*70
|
35
|
-
tally.keys.sort{|a,b|
|
36
|
-
if tally[a] == tally[b]
|
37
|
-
a.to_s <=> b.to_s
|
38
|
-
else
|
39
|
-
-1*(tally[a]<=>tally[b])
|
40
|
-
end
|
41
|
-
}.each do |klass|
|
42
|
-
outf.puts "#{klass}\t#{tally[klass]}"
|
43
|
-
end
|
44
|
-
|
45
|
-
outf.puts '-'*70
|
46
|
-
outf.puts "Max obj was #{max_obj.class} at #{max_count}"
|
47
|
-
outf.puts "Maximum object is..."
|
48
|
-
outf.puts max_obj.memory_profile_inspect
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.simple_count
|
53
|
-
Dir.chdir "/tmp"
|
54
|
-
ObjectSpace::garbage_collect
|
55
|
-
sleep 10 # Give the GC thread a chance
|
56
|
-
|
57
|
-
tally = Hash.new(0)
|
58
|
-
ObjectSpace.each_object do |obj|
|
59
|
-
next if obj.object_id == tally.object_id
|
60
|
-
tally[obj.class]+=1
|
61
|
-
end
|
62
|
-
|
63
|
-
open( LOG_FILE, 'a') do |outf|
|
64
|
-
outf.puts '='*70
|
65
|
-
outf.puts "Memory::Profile report for #{$0}"
|
66
|
-
outf.puts `cat /proc/#{Process.pid}/status`
|
67
|
-
|
68
|
-
tally.keys.sort{|a,b|
|
69
|
-
if tally[a] == tally[b]
|
70
|
-
a.to_s <=> b.to_s
|
71
|
-
else
|
72
|
-
-1*(tally[a]<=>tally[b])
|
73
|
-
end
|
74
|
-
}.each do |klass|
|
75
|
-
outf.puts "#{klass}\t#{tally[klass]}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# if $0 == __FILE__ then
|
83
|
-
# File.unlink Memory::Profile::LOG_FILE if File.exist? Memory::Profile::LOG_FILE
|
84
|
-
#
|
85
|
-
# at_exit{ system("cat #{Memory::Profile::LOG_FILE}")}
|
86
|
-
# end
|
87
|
-
|
88
|
-
at_exit do
|
89
|
-
Memory::Profile::simple_count
|
90
|
-
Memory::Profile::report
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
|
data/lib/memory/usage.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
|
2
|
-
module System
|
3
|
-
LINUX_PAGE_SIZE = 1024
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def memory
|
7
|
-
result = {}
|
8
|
-
if RUBY_PLATFORM =~ /darwin/
|
9
|
-
# OS X
|
10
|
-
output = `vm_stat`.split("\n")
|
11
|
-
result['page size'] = output.shift[/page size of (\d+) bytes/, 1].to_i
|
12
|
-
output.each do |line|
|
13
|
-
line =~ /([\w\s]+)"{0,1}:\s*(\d+)/
|
14
|
-
key, value = $1, $2
|
15
|
-
|
16
|
-
key.downcase!
|
17
|
-
key = case key
|
18
|
-
when /Pages (.*)/
|
19
|
-
$1 + " memory"
|
20
|
-
when "pageouts"
|
21
|
-
"pages paged out"
|
22
|
-
when "pageins"
|
23
|
-
"pages paged in"
|
24
|
-
else
|
25
|
-
key
|
26
|
-
end
|
27
|
-
result[key] = value.to_i
|
28
|
-
end
|
29
|
-
else
|
30
|
-
# Linux
|
31
|
-
output = `vmstat -s -S K`.split("\n")
|
32
|
-
page_size = 1
|
33
|
-
output.each do |line|
|
34
|
-
line =~ /(\d+)\s*([\w\s]+)/
|
35
|
-
key, value = $2, $1
|
36
|
-
key.gsub!(/^K /, '')
|
37
|
-
result[key] = value.to_i
|
38
|
-
end
|
39
|
-
end
|
40
|
-
normalize_pages(result)
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def normalize_pages(hash)
|
46
|
-
hash.each do |key, value|
|
47
|
-
if key =~ /memory/
|
48
|
-
hash[key] = value * (hash['page size'] or LINUX_PAGE_SIZE)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
hash
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
module Process
|
58
|
-
class << self
|
59
|
-
def memory
|
60
|
-
a = `ps -o vsz,rss -p #{Process.pid}`.split(/\s+/)[-2..-1].map{|el| el.to_i}
|
61
|
-
{:virtual => a.first - a.last, :total => a.first, :real => a.last, }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
data/memory.gemspec
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
Gem::Specification.new do |s|
|
4
|
-
s.name = %q{memory}
|
5
|
-
s.version = "0.0.3"
|
6
|
-
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["Evan Weaver"]
|
9
|
-
s.cert_chain = ["/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-public_cert.pem"]
|
10
|
-
s.date = %q{2009-11-18}
|
11
|
-
s.description = %q{Some libraries for reporting memory usage.}
|
12
|
-
s.email = %q{}
|
13
|
-
s.extra_rdoc_files = ["CHANGELOG", "lib/memory/object.rb", "lib/memory/profile.rb", "lib/memory/usage.rb", "lib/memory.rb", "LICENSE", "README"]
|
14
|
-
s.files = ["CHANGELOG", "lib/memory/object.rb", "lib/memory/profile.rb", "lib/memory/usage.rb", "lib/memory.rb", "LICENSE", "Manifest", "README", "memory.gemspec", "Rakefile"]
|
15
|
-
s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/memory/}
|
16
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Memory", "--main", "README"]
|
17
|
-
s.require_paths = ["lib"]
|
18
|
-
s.rubyforge_project = %q{fauna}
|
19
|
-
s.rubygems_version = %q{1.3.5}
|
20
|
-
s.signing_key = %q{/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-private_key.pem}
|
21
|
-
s.summary = %q{Some libraries for reporting memory usage.}
|
22
|
-
|
23
|
-
if s.respond_to? :specification_version then
|
24
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
-
s.specification_version = 3
|
26
|
-
|
27
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
-
else
|
29
|
-
end
|
30
|
-
else
|
31
|
-
end
|
32
|
-
end
|
metadata.gz.sig
DELETED
Binary file
|