perftools.rb 0.5.6 → 2.0.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.
- 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
|