bleak_house 5.2 → 5.3
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.
- data/CHANGELOG +1 -0
- data/README +5 -5
- data/lib/bleak_house/analyze.rb +33 -8
- data/lib/bleak_house/bleak_house.rb +2 -1
- data/lib/bleak_house/dispatcher.rb +2 -2
- data/lib/bleak_house/support_methods.rb +3 -0
- data/tasks/bleak_house_tasks.rake +1 -1
- metadata +4 -4
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
BleakHouse
|
3
3
|
|
4
|
-
REQUIREMENTS
|
4
|
+
REQUIREMENTS
|
5
5
|
|
6
6
|
A *nix operating system. Windows is not supported.
|
7
7
|
|
@@ -11,7 +11,7 @@ It is highly recommended that you compile the bleak_house patched
|
|
11
11
|
Ruby build. In the plugin directory:
|
12
12
|
rake ruby:build
|
13
13
|
|
14
|
-
USAGE
|
14
|
+
USAGE
|
15
15
|
|
16
16
|
To profile your application:
|
17
17
|
RAILS_ENV=production BLEAK_HOUSE=true ruby-bleak-house ./script/server
|
@@ -20,20 +20,20 @@ Browse around manually, thrash your entire app with a script,
|
|
20
20
|
target troublesome controllers/actions, etc.
|
21
21
|
|
22
22
|
Then, to analyze:
|
23
|
-
RAILS_ENV=production SMOOTHNESS=
|
23
|
+
RAILS_ENV=production SMOOTHNESS=1 rake bleak_house:analyze
|
24
24
|
|
25
25
|
And then look in log/bleak_house/.
|
26
26
|
|
27
27
|
TROUBLESHOOTING
|
28
28
|
|
29
29
|
If you see the error "Symbol not found: _rb_gc_heaps_used",
|
30
|
-
it means you installed the patched binary, but tried to
|
30
|
+
it means you installed the patched binary, but tried to profile the
|
31
31
|
server with the regular binary.
|
32
32
|
|
33
33
|
You may get library require errors if you install ruby-bleak-house (1.8.6)
|
34
34
|
alongside a different verson of Ruby. You could try to patch your local
|
35
35
|
version of Ruby instead, or you could just upgrade to 1.8.6, which has
|
36
|
-
a good trackrecord
|
36
|
+
a good trackrecord of stability anyway.
|
37
37
|
|
38
38
|
COPYRIGHT AND LICENSING
|
39
39
|
|
data/lib/bleak_house/analyze.rb
CHANGED
@@ -18,7 +18,7 @@ Gruff::Base::MAX_LEGENDS = 28
|
|
18
18
|
class BleakHouse
|
19
19
|
class Analyze
|
20
20
|
|
21
|
-
SMOOTHNESS =
|
21
|
+
SMOOTHNESS = ENV['SMOOTHNESS'].to_i.zero? ? 1 : ENV['SMOOTHNESS'].to_i
|
22
22
|
MEM_KEY = "memory usage"
|
23
23
|
DIR = "#{RAILS_ROOT}/log/bleak_house/"
|
24
24
|
|
@@ -28,6 +28,10 @@ class BleakHouse
|
|
28
28
|
@name = name
|
29
29
|
end
|
30
30
|
|
31
|
+
def d
|
32
|
+
self.class.d
|
33
|
+
end
|
34
|
+
|
31
35
|
def draw
|
32
36
|
g = Gruff::Line.new("1024x768")
|
33
37
|
g.title = @name
|
@@ -49,6 +53,7 @@ class BleakHouse
|
|
49
53
|
@increments.each_with_index do |increment, index|
|
50
54
|
labels[index] = increment if (index % mod).zero?
|
51
55
|
end
|
56
|
+
|
52
57
|
g.labels = labels
|
53
58
|
|
54
59
|
g.minimum_value = 0
|
@@ -63,12 +68,17 @@ class BleakHouse
|
|
63
68
|
data.each_with_index do |frameset, index|
|
64
69
|
increments << frameset.time
|
65
70
|
frameset.data.keys.select do |key|
|
66
|
-
|
71
|
+
# aggregate common keys based on the selection regexs
|
72
|
+
key =~ selector
|
67
73
|
end.each do |key|
|
68
74
|
aggregate_data[key.to_s[namer, 1]] ||= []
|
69
75
|
aggregate_data[key.to_s[namer, 1]][index] += frameset.data[key].to_i
|
70
76
|
end
|
71
|
-
end
|
77
|
+
end
|
78
|
+
aggregate_data.each do |key, value|
|
79
|
+
# extend the length of every value set to the end of the run
|
80
|
+
aggregate_data[key][increments.size - 1] ||= nil
|
81
|
+
end
|
72
82
|
[aggregate_data, increments]
|
73
83
|
end
|
74
84
|
|
@@ -83,20 +93,32 @@ class BleakHouse
|
|
83
93
|
Dir.chdir(DIR) do
|
84
94
|
|
85
95
|
puts "parsing data"
|
86
|
-
data = YAML.load_file(filename)
|
96
|
+
data = YAML.load_file(filename)
|
97
|
+
|
98
|
+
# subtract core counts from action
|
99
|
+
data = data[0..(-1 - data.size % 2)]
|
100
|
+
data = data.in_groups_of(2).map do |frames|
|
101
|
+
core, action = frames.first, frames.last
|
102
|
+
action.data.each do |key, value|
|
103
|
+
action.data[key] = value - core.data[key[/::::(.*)/,1]].to_i
|
104
|
+
end
|
105
|
+
[action.time, core.data.merge(action.data)]
|
106
|
+
end
|
107
|
+
|
108
|
+
# smooth
|
87
109
|
data = data[0..(-1 - data.size % SMOOTHNESS)]
|
88
110
|
data = data.in_groups_of(SMOOTHNESS).map do |frames|
|
89
111
|
timestamp = frames.map(&:time).sum / SMOOTHNESS
|
90
112
|
values = frames.map(&:data).inject(Hash.new(0)) do |total, this_frame|
|
91
113
|
this_frame.each do |key, value|
|
92
|
-
|
93
|
-
total[key] += (value / SMOOTHNESS.to_f * (key =~ /^#{MEM_KEY}/ ? 1.0 : 2.0))
|
114
|
+
total[key] += value / SMOOTHNESS.to_f
|
94
115
|
end
|
95
116
|
end
|
96
117
|
[Time.at(timestamp).strftime("%H:%M:%S"), values]
|
97
118
|
end
|
98
119
|
puts "#{data.size} frames after smoothing"
|
99
|
-
|
120
|
+
|
121
|
+
# generate initial controller graph
|
100
122
|
puts "entire app"
|
101
123
|
controller_data, increments = aggregate(data, //, /^(.*?)($|\/|::::)/)
|
102
124
|
if controller_data.has_key? MEM_KEY
|
@@ -110,7 +132,6 @@ class BleakHouse
|
|
110
132
|
# in each controller, by action
|
111
133
|
controller_data.keys.each do |controller|
|
112
134
|
@mem = (controller == MEM_KEY)
|
113
|
-
next unless @mem
|
114
135
|
puts(@mem ? " #{controller}" : " action for #{controller} controller")
|
115
136
|
Dir.descend(controller) do
|
116
137
|
action_data, increments = aggregate(data, /^#{controller}($|\/|::::)/, /\/(.*?)($|\/|::::)/)
|
@@ -132,5 +153,9 @@ class BleakHouse
|
|
132
153
|
end
|
133
154
|
end
|
134
155
|
|
156
|
+
def self.d
|
157
|
+
require 'ruby-debug'; Debugger.start; debugger
|
158
|
+
end
|
159
|
+
|
135
160
|
end
|
136
161
|
end
|
@@ -20,13 +20,14 @@ class BleakHouse
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
LOGFILE = "#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.
|
23
|
+
LOGFILE = "#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.yaml.log"
|
24
24
|
if File.exists?(LOGFILE)
|
25
25
|
File.rename(LOGFILE, "#{LOGFILE}.old")
|
26
26
|
warn "renamed old logfile"
|
27
27
|
end
|
28
28
|
|
29
29
|
WITH_SPECIALS = false
|
30
|
+
GC = true
|
30
31
|
|
31
32
|
MEMLOGGER = if ENV['MEMLOGGER'] !~ /ruby/i and (ENV['MEMLOGGER'] =~ /c/i or
|
32
33
|
`which ruby-bleak-house` !~ /no ruby_bleak_house/)
|
@@ -6,13 +6,13 @@ class Dispatcher
|
|
6
6
|
def prepare_application_with_bleak_house
|
7
7
|
prepare_application_without_bleak_house
|
8
8
|
BleakHouse::MEMLOGGER.snapshot(BleakHouse::LOGFILE, 'core rails', BleakHouse::WITH_SPECIALS)
|
9
|
-
GC.start
|
9
|
+
GC.start if BleakHouse::GC
|
10
10
|
end
|
11
11
|
alias_method_chain :prepare_application, :bleak_house
|
12
12
|
|
13
13
|
def reset_after_dispatch_with_bleak_house
|
14
14
|
BleakHouse::MEMLOGGER.snapshot(BleakHouse::LOGFILE, BleakHouse.last_request_name || 'unknown', BleakHouse::WITH_SPECIALS)
|
15
|
-
GC.start
|
15
|
+
GC.start if BleakHouse::GC
|
16
16
|
reset_after_dispatch_without_bleak_house
|
17
17
|
end
|
18
18
|
alias_method_chain :reset_after_dispatch, :bleak_house
|
@@ -8,7 +8,7 @@ namespace :bleak_house do
|
|
8
8
|
rescue LoadError
|
9
9
|
require 'bleak_house/analyze'
|
10
10
|
end
|
11
|
-
BleakHouse::Analyze.build_all("#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.
|
11
|
+
BleakHouse::Analyze.build_all("#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.yaml.log")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: bleak_house
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "5.
|
7
|
-
date: 2007-05-
|
6
|
+
version: "5.3"
|
7
|
+
date: 2007-05-08 00:00:00 -04:00
|
8
8
|
summary: BleakHouse is a Rails plugin for finding memory leaks. It tracks ObjectSpace for your entire app, and produces charts of references by controller, by action, and by object class.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -27,7 +27,7 @@ signing_key:
|
|
27
27
|
cert_chain:
|
28
28
|
post_install_message: |+
|
29
29
|
|
30
|
-
Thanks for installing Bleak House 5.
|
30
|
+
Thanks for installing Bleak House 5.3.
|
31
31
|
|
32
32
|
For each Rails app you want to profile, you will need to add the following
|
33
33
|
rake task in RAILS_ROOT/lib/tasks/bleak_house_tasks.rake to be able to run
|
@@ -38,7 +38,7 @@ post_install_message: |+
|
|
38
38
|
task :analyze do
|
39
39
|
rescue LoadError
|
40
40
|
end
|
41
|
-
BleakHouse::Analyze.build_all("#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.
|
41
|
+
BleakHouse::Analyze.build_all("#{RAILS_ROOT}/log/bleak_house_#{RAILS_ENV}.yaml.log")
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|