perftools.rb 0.5.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +16 -9
- data/bin/pprof.rb +1 -2
- data/ext/extconf.rb +6 -5
- data/ext/perftools.c +5 -0
- data/ext/src/gperftools-2.0.tar.gz +0 -0
- data/patches/perftools-notests.patch +24 -6
- data/patches/perftools-objects.patch +28 -21
- data/patches/perftools-realtime.patch +22 -0
- data/perftools.rb.gemspec +1 -2
- metadata +8 -7
- data/ext/src/google-perftools-1.6.tar.gz +0 -0
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# perftools.rb
|
2
2
|
|
3
|
-
|
4
|
-
(c)
|
3
|
+
gperftools for ruby code
|
4
|
+
(c) 2012 Aman Gupta (tmm1)
|
5
5
|
http://www.ruby-lang.org/en/LICENSE.txt
|
6
6
|
|
7
|
+
gperftools (formerly known as google-perftools): http://gperftools.googlecode.com
|
8
|
+
|
7
9
|
## Usage (in a webapp)
|
8
10
|
|
9
11
|
Use [rack-perftools_profiler](https://github.com/bhb/rack-perftools_profiler):
|
@@ -81,7 +83,7 @@ The sampling interval of the profiler can be adjusted to collect more
|
|
81
83
|
pprof.rb --text --ignore=Gem /tmp/my_app_profile
|
82
84
|
|
83
85
|
|
84
|
-
For more options, see [pprof documentation](http://
|
86
|
+
For more options, see [pprof documentation](http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html#pprof)
|
85
87
|
|
86
88
|
|
87
89
|
### Examples
|
@@ -108,7 +110,7 @@ The sampling interval of the profiler can be adjusted to collect more
|
|
108
110
|
|
109
111
|
## Installation
|
110
112
|
|
111
|
-
Just install the gem, which will download, patch and compile
|
113
|
+
Just install the gem, which will download, patch and compile gperftools for you:
|
112
114
|
|
113
115
|
sudo gem install perftools.rb
|
114
116
|
|
@@ -119,12 +121,17 @@ The sampling interval of the profiler can be adjusted to collect more
|
|
119
121
|
gem build perftools.rb.gemspec
|
120
122
|
gem install perftools.rb
|
121
123
|
|
124
|
+
Use via a Gemfile:
|
125
|
+
|
126
|
+
gem 'perftools.rb', :git => 'git://github.com/tmm1/perftools.rb.git'
|
122
127
|
|
123
128
|
You'll also need graphviz to generate call graphs using dot:
|
124
129
|
|
125
130
|
sudo brew install graphviz ghostscript # osx
|
126
131
|
sudo apt-get install graphviz ps2pdf # debian/ubuntu
|
127
132
|
|
133
|
+
If graphviz fails to build on OSX Lion, you may need to recompile libgd, [see here](https://github.com/mxcl/homebrew/issues/6645#issuecomment-1806807)
|
134
|
+
|
128
135
|
## Advantages over ruby-prof
|
129
136
|
|
130
137
|
* Sampling profiler
|
@@ -138,9 +145,9 @@ The sampling interval of the profiler can be adjusted to collect more
|
|
138
145
|
|
139
146
|
Download:
|
140
147
|
|
141
|
-
wget http://
|
142
|
-
tar zxvf
|
143
|
-
cd
|
148
|
+
wget http://gperftools.googlecode.com/files/gperftools-2.0.tar.gz
|
149
|
+
tar zxvf gperftools-2.0.tar.gz
|
150
|
+
cd gperftools-2.0
|
144
151
|
|
145
152
|
Compile:
|
146
153
|
|
@@ -172,6 +179,6 @@ The sampling interval of the profiler can be adjusted to collect more
|
|
172
179
|
|
173
180
|
* [Ilya Grigorik's introduction to perftools.rb](http://www.igvita.com/2009/06/13/profiling-ruby-with-googles-perftools/)
|
174
181
|
|
175
|
-
* [Google Perftools](http://code.google.com/p/
|
182
|
+
* [Google Perftools](http://code.google.com/p/gperftools/)
|
176
183
|
|
177
|
-
* [Analyzing profiles and interpreting different output formats](http://
|
184
|
+
* [Analyzing profiles and interpreting different output formats](http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html#pprof)
|
data/bin/pprof.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'rbconfig'
|
3
|
-
|
4
|
-
exec(cmd)
|
3
|
+
exec(File.join(File.dirname(__FILE__), 'pprof'), File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']), *ARGV)
|
data/ext/extconf.rb
CHANGED
@@ -3,7 +3,7 @@ CWD = File.expand_path(File.dirname(__FILE__))
|
|
3
3
|
def sys(cmd)
|
4
4
|
puts " -- #{cmd}"
|
5
5
|
unless ret = xsystem(cmd)
|
6
|
-
raise "#{cmd} failed, please report to
|
6
|
+
raise "#{cmd} failed, please report to https://github.com/tmm1/perfools.rb/issues/new with #{CWD}/src/mkmf.log and #{CWD}/src/gperftools-2.0/config.log"
|
7
7
|
end
|
8
8
|
ret
|
9
9
|
end
|
@@ -27,7 +27,7 @@ if RUBY_VERSION >= "1.9"
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
perftools = File.basename('
|
30
|
+
perftools = File.basename('gperftools-2.0.tar.gz')
|
31
31
|
dir = File.basename(perftools, '.tar.gz')
|
32
32
|
|
33
33
|
puts "(I'm about to compile google-perftools.. this will definitely take a while)"
|
@@ -36,7 +36,7 @@ ENV["PATCH_GET"] = '0'
|
|
36
36
|
Dir.chdir('src') do
|
37
37
|
FileUtils.rm_rf(dir) if File.exists?(dir)
|
38
38
|
|
39
|
-
sys("tar
|
39
|
+
sys("tar zpxvf #{perftools}")
|
40
40
|
Dir.chdir(dir) do
|
41
41
|
if ENV['DEV']
|
42
42
|
sys("git init")
|
@@ -48,10 +48,11 @@ Dir.chdir('src') do
|
|
48
48
|
['perftools-notests', true],
|
49
49
|
['perftools-pprof', true],
|
50
50
|
['perftools-gc', true],
|
51
|
-
['perftools-osx',
|
51
|
+
['perftools-osx', false], # fixed in 2.0
|
52
52
|
['perftools-debug', true],
|
53
53
|
['perftools-objects', true],
|
54
|
-
['perftools-frames', true]
|
54
|
+
['perftools-frames', true],
|
55
|
+
['perftools-realtime', true]
|
55
56
|
].each do |patch, apply|
|
56
57
|
if apply
|
57
58
|
sys("patch -p1 < ../../../patches/#{patch}.patch")
|
data/ext/perftools.c
CHANGED
@@ -123,6 +123,11 @@ static VALUE Isend;
|
|
123
123
|
#include <vm_core.h>
|
124
124
|
#include <iseq.h>
|
125
125
|
|
126
|
+
// Fix compile error in ruby 1.9.3
|
127
|
+
#ifdef RTYPEDDATA_DATA
|
128
|
+
#define ruby_current_thread ((rb_thread_t *)RTYPEDDATA_DATA(rb_thread_current()))
|
129
|
+
#endif
|
130
|
+
|
126
131
|
int
|
127
132
|
rb_stack_trace(void** result, int max_depth)
|
128
133
|
{
|
Binary file
|
@@ -1,15 +1,33 @@
|
|
1
1
|
diff --git a/Makefile.in b/Makefile.in
|
2
|
-
index
|
2
|
+
index be6bce7..423baba 100644
|
3
3
|
--- a/Makefile.in
|
4
4
|
+++ b/Makefile.in
|
5
|
-
@@ -
|
6
|
-
@ENABLE_FRAME_POINTERS_TRUE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@
|
7
|
-
@ENABLE_FRAME_POINTERS_FALSE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@
|
8
|
-
@MINGW_TRUE@
|
5
|
+
@@ -66,26 +66,8 @@ host_triplet = @host@
|
6
|
+
@ENABLE_FRAME_POINTERS_TRUE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@am__append_5 = -fno-omit-frame-pointer
|
7
|
+
@ENABLE_FRAME_POINTERS_FALSE@@X86_64_AND_NO_FP_BY_DEFAULT_TRUE@am__append_6 = -DNO_FRAME_POINTER
|
8
|
+
@MINGW_TRUE@am__append_7 = -Wl,-u__tcmalloc
|
9
|
+
-TESTS = low_level_alloc_unittest$(EXEEXT) atomicops_unittest$(EXEEXT) \
|
10
|
+
- $(am__EXEEXT_9) tcmalloc_minimal_unittest$(EXEEXT) \
|
11
|
+
- tcmalloc_minimal_large_unittest$(EXEEXT) $(am__append_17) \
|
12
|
+
- addressmap_unittest$(EXEEXT) $(am__EXEEXT_10) \
|
13
|
+
- packed_cache_test$(EXEEXT) frag_unittest$(EXEEXT) \
|
14
|
+
- markidle_unittest$(EXEEXT) \
|
15
|
+
- current_allocated_bytes_test$(EXEEXT) \
|
16
|
+
- malloc_hook_test$(EXEEXT) malloc_extension_test$(EXEEXT) \
|
17
|
+
- $(am__EXEEXT_11) $(am__EXEEXT_12) page_heap_test$(EXEEXT) \
|
18
|
+
- pagemap_unittest$(EXEEXT) realloc_unittest$(EXEEXT) \
|
19
|
+
- stack_trace_table_test$(EXEEXT) \
|
20
|
+
- thread_dealloc_unittest$(EXEEXT) $(am__EXEEXT_13) \
|
21
|
+
- $(am__EXEEXT_14) $(am__EXEEXT_15) $(am__append_29) \
|
22
|
+
- $(am__EXEEXT_16) $(am__EXEEXT_17) $(am__EXEEXT_18) \
|
23
|
+
- $(am__EXEEXT_19) $(am__append_49) $(am__EXEEXT_20) \
|
24
|
+
- $(am__append_58) $(am__append_60) $(am__EXEEXT_21) \
|
25
|
+
- $(am__EXEEXT_22)
|
9
26
|
-noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
|
10
27
|
- $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \
|
11
28
|
- $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_23)
|
29
|
+
+TESTS =
|
12
30
|
+noinst_PROGRAMS =
|
13
31
|
bin_PROGRAMS =
|
14
|
-
@MINGW_TRUE@
|
32
|
+
@MINGW_TRUE@am__append_8 = libwindows.la libspinlock.la
|
15
33
|
|
@@ -1,53 +1,60 @@
|
|
1
|
+
commit 7a33a39f5b31e41f87a47bcadff818208fcc6c05
|
2
|
+
Author: Aman Gupta <aman@tmm1.net>
|
3
|
+
Date: Wed Mar 7 22:55:33 2012 -0800
|
4
|
+
|
5
|
+
perftools-objects
|
6
|
+
|
1
7
|
diff --git a/src/profile-handler.cc b/src/profile-handler.cc
|
2
|
-
index
|
8
|
+
index f9d8d8b..91f6f72 100644
|
3
9
|
--- a/src/profile-handler.cc
|
4
10
|
+++ b/src/profile-handler.cc
|
5
|
-
@@ -
|
6
|
-
|
7
|
-
|
8
|
-
|
11
|
+
@@ -426,6 +426,8 @@ void ProfileHandler::StartTimer() {
|
12
|
+
if (!allowed_) {
|
13
|
+
return;
|
14
|
+
}
|
9
15
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return;
|
10
16
|
+
|
11
17
|
struct itimerval timer;
|
12
18
|
timer.it_interval.tv_sec = 0;
|
13
19
|
timer.it_interval.tv_usec = 1000000 / frequency_;
|
14
|
-
@@ -
|
15
|
-
|
16
|
-
|
17
|
-
|
20
|
+
@@ -437,6 +439,8 @@ void ProfileHandler::StopTimer() {
|
21
|
+
if (!allowed_) {
|
22
|
+
return;
|
23
|
+
}
|
18
24
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return;
|
19
25
|
+
|
20
26
|
struct itimerval timer;
|
21
27
|
memset(&timer, 0, sizeof timer);
|
22
28
|
setitimer(timer_type_, &timer, 0);
|
23
|
-
|
24
|
-
|
25
|
-
|
29
|
+
@@ -446,6 +450,8 @@ bool ProfileHandler::IsTimerRunning() {
|
30
|
+
if (!allowed_) {
|
31
|
+
return false;
|
32
|
+
}
|
26
33
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return false;
|
27
34
|
+
|
28
35
|
struct itimerval current_timer;
|
29
36
|
RAW_CHECK(0 == getitimer(timer_type_, ¤t_timer), "getitimer");
|
30
37
|
return (current_timer.it_value.tv_sec != 0 ||
|
31
|
-
@@ -
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
@@ -456,6 +462,8 @@ void ProfileHandler::EnableHandler() {
|
39
|
+
if (!allowed_) {
|
40
|
+
return;
|
41
|
+
}
|
35
42
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return;
|
36
43
|
+
|
37
44
|
struct sigaction sa;
|
38
45
|
sa.sa_sigaction = SignalHandler;
|
39
46
|
sa.sa_flags = SA_RESTART | SA_SIGINFO;
|
40
|
-
@@ -
|
41
|
-
|
42
|
-
|
43
|
-
|
47
|
+
@@ -468,6 +476,8 @@ void ProfileHandler::DisableHandler() {
|
48
|
+
if (!allowed_) {
|
49
|
+
return;
|
50
|
+
}
|
44
51
|
+ if (getenv("CPUPROFILE_OBJECTS") || getenv("CPUPROFILE_METHODS")) return;
|
45
52
|
+
|
46
53
|
struct sigaction sa;
|
47
54
|
sa.sa_handler = SIG_IGN;
|
48
55
|
sa.sa_flags = SA_RESTART;
|
49
56
|
diff --git a/src/profiler.cc b/src/profiler.cc
|
50
|
-
index
|
57
|
+
index 6538299..8e92b91 100644
|
51
58
|
--- a/src/profiler.cc
|
52
59
|
+++ b/src/profiler.cc
|
53
60
|
@@ -102,6 +102,10 @@ class CpuProfiler {
|
@@ -0,0 +1,22 @@
|
|
1
|
+
commit 2c428e120733fdbf4ae2399046d9d63e6845b18d
|
2
|
+
Author: Aman Gupta <aman@tmm1.net>
|
3
|
+
Date: Thu Mar 8 22:39:12 2012 -0800
|
4
|
+
|
5
|
+
perftools-realtime
|
6
|
+
|
7
|
+
diff --git a/src/profile-handler.cc b/src/profile-handler.cc
|
8
|
+
index dfc8cf4..567ca45 100644
|
9
|
+
--- a/src/profile-handler.cc
|
10
|
+
+++ b/src/profile-handler.cc
|
11
|
+
@@ -491,6 +491,11 @@ bool ProfileHandler::IsSignalHandlerAvailable() {
|
12
|
+
const int signal_number = (timer_type_ == ITIMER_PROF ? SIGPROF : SIGALRM);
|
13
|
+
RAW_CHECK(sigaction(signal_number, NULL, &sa) == 0, "is-signal-handler avail");
|
14
|
+
|
15
|
+
+#ifdef BUILD_FOR_RUBY
|
16
|
+
+ // Inside ruby, there's a default signal handler set for SIGALRM.
|
17
|
+
+ return true;
|
18
|
+
+#endif
|
19
|
+
+
|
20
|
+
// We only take over the handler if the current one is unset.
|
21
|
+
// It must be SIG_IGN or SIG_DFL, not some other function.
|
22
|
+
// SIG_IGN must be allowed because when profiling is allowed but
|
data/perftools.rb.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'perftools.rb'
|
3
|
-
s.version = '0.
|
4
|
-
s.date = '2011-01-23'
|
3
|
+
s.version = '2.0.0'
|
5
4
|
s.rubyforge_project = 'perftools-rb'
|
6
5
|
s.summary = 'google-perftools for ruby code'
|
7
6
|
s.description = 'A sampling profiler for ruby code based on patches to google-perftools'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perftools.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
|
+
- 2
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.5.6
|
9
|
+
- 0
|
10
|
+
version: 2.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Aman Gupta
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-03-17 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -32,7 +32,7 @@ files:
|
|
32
32
|
- bin/pprof.rb
|
33
33
|
- ext/extconf.rb
|
34
34
|
- ext/perftools.c
|
35
|
-
- ext/src/
|
35
|
+
- ext/src/gperftools-2.0.tar.gz
|
36
36
|
- patches/perftools-debug.patch
|
37
37
|
- patches/perftools-frames.patch
|
38
38
|
- patches/perftools-gc.patch
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- patches/perftools-objects.patch
|
41
41
|
- patches/perftools-osx.patch
|
42
42
|
- patches/perftools-pprof.patch
|
43
|
+
- patches/perftools-realtime.patch
|
43
44
|
- patches/perftools.patch
|
44
45
|
- perftools.rb.gemspec
|
45
46
|
has_rdoc: false
|
@@ -72,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
73
|
requirements: []
|
73
74
|
|
74
75
|
rubyforge_project: perftools-rb
|
75
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.6.2
|
76
77
|
signing_key:
|
77
78
|
specification_version: 3
|
78
79
|
summary: google-perftools for ruby code
|
Binary file
|