tunemygc 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f335f0a411ceb5bd4af313a30c3c7df9accd3aff
4
- data.tar.gz: 208ddfc32ef3e24bd7fbe1e31b4560d6b00b3253
3
+ metadata.gz: 759855e794865c4d3a4dd7fb6eeee7789c07283d
4
+ data.tar.gz: 51e021f692c505cc6c102bac6287d17214930d9f
5
5
  SHA512:
6
- metadata.gz: e261548fe3b52cbb58c93ef5be2e58600f184ea7a5e20c91e5f2817983338547a08dc5c23e2a4cbc78f057cb33d6544b5ffb4ca33d018843253e4509d639837a
7
- data.tar.gz: c8959c605ba3bd607589ff3efacb16a658e65fe4a5c0f1738ad0be5ded8def2d5796b95ea8a33e5043b73b1528ea2edf9facbd734d4e5d724f755a812fadad87
6
+ metadata.gz: 73b470f53ef683edc2294adc3738ba8e4a329efbcfc127b18f7a2e51bf1777efc4b4fb7726108969dcc6998560b5c6a1a69c14ed93984dc150be25839be7151b
7
+ data.tar.gz: eefd05ae81273e370dd01d1087f278d13f4ed4350c3d6d8357fa4c1e42866ffac082f8c364a9d28addfc6860f4b783ae057914394f4059a70a649b29fbe9da3c
data/.travis.yml CHANGED
@@ -18,3 +18,4 @@ branches:
18
18
  only:
19
19
  - master
20
20
  - compact-samples
21
+ - minitest
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tunemygc (1.0.2)
4
+ tunemygc (1.0.6)
5
5
  activesupport (~> 4.1)
6
6
  certified (~> 1.0, >= 1.0.0)
7
7
 
data/README.md CHANGED
@@ -20,6 +20,8 @@ The Ruby garbage collector has been flagged as the crux of Ruby performance and
20
20
 
21
21
  We used [Discourse](http://www.discourse.org) as our primary test harness as it's representative of most Rails applications and has been instrumental in asserting RGenC developments on Rails as well.
22
22
 
23
+ [Discourse](http://www.discourse.org) throughput: [GC defaults](https://tunemygc.com/configs/c5214cfa00b3bf429badd2161c4b6a08) VS TuneMyGc [suggestions](https://tunemygc.com/configs/e129791f94159a8c75bef3a636c05798)
24
+
23
25
  ![tunemygc workflow diagram](https://raw.githubusercontent.com/bear-metal/tunemygc/master/assets/discourse_bench.png?token=AAABe8sM_ofiQkrCpNw7OYRbtHMLO9l5ks5UuQlYwA%3D%3D)
24
26
 
25
27
  ## Installing
@@ -42,7 +44,7 @@ Has not been tested at all.
42
44
  There isn't much setup other than adding the gem to your Gemfile and running a single command from your application root to register your application with the `https://tunemygc.com` service:
43
45
 
44
46
  ``` sh
45
- Lourenss-MacBook-Air-2:discourse lourens$ bundle exec tunemygc -r lourens@bearmetal.eu
47
+ $ bundle exec tunemygc -r lourens@bearmetal.eu
46
48
  Application registered. Use RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d51 in your environment.
47
49
  ```
48
50
 
@@ -57,7 +59,7 @@ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d51 RUBY_GC_TUNE=1 bundle exec rails
57
59
  The CLI interface supports retrieving configuration options for your application as well.
58
60
 
59
61
  ``` sh
60
- Lourenss-MacBook-Air-2:discourse lourens$ bundle exec tunemygc
62
+ $ bundle exec tunemygc
61
63
  Usage: tunemygc [options]
62
64
  -r, --register EMAIL Register this Rails app with the https://tunemygc.com service
63
65
  -c, --config TOKEN Fetch the last known config for a given Rails app
@@ -75,13 +77,13 @@ We fully embrace and encourage [12 factor](http://12factor.net) conventions and
75
77
  This application specific token is required for GC instrumentation. You can generate one from the CLI interface by registering for the service with a valid email address:
76
78
 
77
79
  ``` sh
78
- Lourenss-MacBook-Air-2:discourse lourens$ bundle exec tunemygc -r lourens@bearmetal.eu
80
+ $ bundle exec tunemygc -r lourens@bearmetal.eu
79
81
  Application registered. Use RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d51 in your environment.
80
82
  ```
81
83
 
82
84
  * `RUBY_GC_TUNE=1`
83
85
 
84
- Enables the interposer for taking a few lightweight snapshots and submitting them to `tunemygc.com`. Without this environment variable set, it won't interpose itself.
86
+ Enables the interposer for taking a few lightweight snapshots of Rails requests and submitting them to `tunemygc.com`. Without this environment variable set, it won't interpose itself.
85
87
 
86
88
  For the above command sequences, to sample my Rails app for tuning, I'd run:
87
89
 
@@ -91,9 +93,17 @@ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d51 RUBY_GC_TUNE=1 bundle exec rails
91
93
 
92
94
  #### Advanced
93
95
 
96
+ * `RUBY_GC_SPY=action_controller` (Spy on the GC for this type of processing. Either `action_controller` or `minitest`)
97
+
98
+ Defines what type of processing you would like to sample for GC activity. An Action Controller spy is the default, but [minitest](https://github.com/seattlerb/minitest) is also supported as an experimental feature.
99
+
94
100
  * `RUBY_GC_TUNE_REQUESTS=x` (a numeric value eg. `200`)
95
101
 
96
- Controls the interposer lifetime for sampling requests. It will enable itself, then remove request instrumentation after the specified number of requests. A good minimum ballpark sample set would be 200.
102
+ Controls the interposer lifetime for sampling Rails requests. It will enable itself, then remove request instrumentation after the specified number of requests. A good minimum ballpark sample set would be 200.
103
+
104
+ * `RUBY_GC_TUNE_TESTS=x` (a numeric value eg. `200`)
105
+
106
+ Controls the interposer lifetime for sampling a [minitest](https://github.com/seattlerb/minitest) based test suite. It will enable itself, then remove request instrumentation after the specified number of tests has been run. A good minimum ballpark sample set would be 200.
97
107
 
98
108
  ## How do I use this?
99
109
 
@@ -122,7 +132,7 @@ An instrumented process dumps a reccommended config to the Rails logger.
122
132
  We're still in the process of building tools and a launcher shim around this. You can also retrieve the last known configuration for you app via the CLI interface:
123
133
 
124
134
  ``` sh
125
- Lourenss-MacBook-Air-2:discourse lourens$ bundle exec tunemygc -c 3b8796e5627f97ec760f000d55d9b3f5
135
+ $ bundle exec tunemygc -c 3b8796e5627f97ec760f000d55d9b3f5
126
136
  === Suggested GC configuration:
127
137
 
128
138
  export RUBY_GC_HEAP_INIT_SLOTS=382429
@@ -22,6 +22,14 @@ module TuneMyGc
22
22
  logger.info "[TuneMyGC] #{message}"
23
23
  end
24
24
 
25
+ def spy
26
+ if ENV['RUBY_GC_SPY']
27
+ ENV['RUBY_GC_SPY'].classify
28
+ else
29
+ :ActionController
30
+ end
31
+ end
32
+
25
33
  def reccommendations
26
34
  MUTEX.synchronize do
27
35
  require "tunemygc/syncer"
@@ -1,15 +1,16 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'active_support'
4
- require 'tunemygc/spies/action_controller'
4
+ require 'tunemygc/spies'
5
5
 
6
6
  module TuneMyGc
7
7
  class Interposer
8
8
  attr_reader :spy
9
9
  attr_accessor :installed
10
10
 
11
- def initialize
11
+ def initialize(spy = TuneMyGc.spy)
12
12
  reset
13
+ @spy = TuneMyGc::Spies.const_get(spy).new
13
14
  end
14
15
 
15
16
  def on_initialized
@@ -54,7 +55,6 @@ module TuneMyGc
54
55
  private
55
56
  def reset
56
57
  @installed = false
57
- @spy = TuneMyGc::Spies::ActionController.new
58
58
  end
59
59
  end
60
60
  end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ module TuneMyGc
4
+ module Spies
5
+ autoload :ActionController, 'tunemygc/spies/action_controller'
6
+ autoload :Minitest, 'tunemygc/spies/minitest'
7
+ end
8
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ require 'minitest'
4
+
5
+ module TuneMyGc
6
+ module Spies
7
+ class Minitest
8
+ def initialize
9
+ @tests_processed = 0
10
+ @tests_limit = nil
11
+ end
12
+
13
+ def install
14
+ MiniTest::Unit::TestCase.__send__(:include, hooks_module)
15
+ TuneMyGc.log "hooked: minitest"
16
+ end
17
+
18
+ def uninstall
19
+ TuneMyGc.uninstall_gc_tracepoint
20
+ TuneMyGc.log "uninstalled GC tracepoint"
21
+ MiniTest::Unit::TestCase.__send__(:include, disabled_hooks_module)
22
+ TuneMyGc.log "uninstalled minitest spy"
23
+ end
24
+
25
+ def check_uninstall
26
+ if ENV["RUBY_GC_TUNE_TESTS"]
27
+ @tests_limit ||= Integer(ENV["RUBY_GC_TUNE_TESTS"])
28
+ @tests_processed += 1
29
+ if @tests_processed == @tests_limit
30
+ uninstall
31
+ TuneMyGc.log "kamikaze after #{@tests_processed} of #{@tests_limit} tests"
32
+ end
33
+ end
34
+ end
35
+
36
+ def hooks_module
37
+ Module.new do
38
+ def before_setup
39
+ tunemygc_before_setup
40
+ super
41
+ end
42
+
43
+ def after_teardown
44
+ super
45
+ tunemygc_after_teardown
46
+ end
47
+
48
+ private
49
+ def tunemygc_before_setup
50
+ TuneMyGc.snapshot(:TEST_PROCESSING_STARTED)
51
+ end
52
+
53
+ def tunemygc_after_teardown
54
+ TuneMyGc.snapshot(:TEST_PROCESSING_ENDED)
55
+ TuneMyGc.interposer.check_uninstall
56
+ end
57
+ end
58
+ end
59
+
60
+ def disabled_hooks_module
61
+ Module.new do
62
+ private
63
+ def tunemygc_before_setup
64
+ # noop
65
+ end
66
+
67
+ def tunemygc_after_teardown
68
+ # noop
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -39,7 +39,7 @@ module TuneMyGc
39
39
  end
40
40
 
41
41
  def environment(snapshotter)
42
- ENVIRONMENT.dup.push(snapshotter.stat_keys)
42
+ ENVIRONMENT.dup.concat([snapshotter.stat_keys, TuneMyGc.spy])
43
43
  end
44
44
 
45
45
  private
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TuneMyGc
4
- VERSION = "1.0.6"
4
+ VERSION = "1.0.7"
5
5
  end
data/test/helper.rb CHANGED
@@ -23,8 +23,23 @@ class TuneMyGcTestCase < Minitest::Test
23
23
  end
24
24
  end
25
25
 
26
- def process_request(path = '/test')
26
+ def process_tunemygc_request(path = '/test')
27
27
  ActiveSupport::Notifications.instrument('start_processing.action_controller', path: path) {}
28
28
  ActiveSupport::Notifications.instrument('process_action.action_controller', path: path) {}
29
29
  end
30
+
31
+ def run_tunemygc_test
32
+ MinitestSandboxTest.new("test_minitest_spy").run
33
+ end
34
+ end
35
+
36
+ # for Minitest spy
37
+ class MinitestSandboxTest < MiniTest::Unit::TestCase
38
+ def setup
39
+ @value = 123
40
+ end
41
+
42
+ def test_minitest_spy
43
+ assert_equal 123, @value
44
+ end
30
45
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require File.join(File.dirname(__FILE__), 'helper')
4
4
 
5
- class TestInterposer < TuneMyGcTestCase
5
+ class TestActionControllerInterposer < TuneMyGcTestCase
6
6
  def setup
7
7
  TuneMyGc.interposer.uninstall
8
8
  end
@@ -58,10 +58,21 @@ class TestInterposer < TuneMyGcTestCase
58
58
 
59
59
  ENV["RUBY_GC_TUNE_REQUESTS"] = "2"
60
60
 
61
- process_request
61
+ process_tunemygc_request
62
62
  assert_equal 2, interposer.spy.subscriptions.size
63
- process_request
63
+ process_tunemygc_request
64
64
  assert_equal 0, interposer.spy.subscriptions.size
65
+
66
+ stages = []
67
+
68
+ while !TuneMyGc.snapshotter.empty?
69
+ stages << TuneMyGc.snapshotter.deq
70
+ end
71
+
72
+ cycles = [:REQUEST_PROCESSING_STARTED]
73
+
74
+ assert stages.any?{|s| cycles.include?(s[3]) }
75
+
65
76
  interposer.uninstall
66
77
  ensure
67
78
  ENV.delete("RUBY_GC_TUNE_REQUESTS")
data/test/test_agent.rb CHANGED
@@ -11,6 +11,14 @@ class TestAgent < TuneMyGcTestCase
11
11
  assert_instance_of TuneMyGc::Snapshotter, TuneMyGc.snapshotter
12
12
  end
13
13
 
14
+ def test_spy
15
+ assert_equal :ActionController, TuneMyGc.spy
16
+ ENV['RUBY_GC_SPY'] = "minitest"
17
+ assert_equal 'Minitest', TuneMyGc.spy
18
+ ensure
19
+ ENV.delete('RUBY_GC_SPY')
20
+ end
21
+
14
22
  def test_log
15
23
  out, err = capture_io do
16
24
  TuneMyGc.logger = Logger.new($stdout)
@@ -0,0 +1,79 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestMinitestInterposer < TuneMyGcTestCase
6
+ def setup
7
+ TuneMyGc.interposer.uninstall
8
+ end
9
+
10
+ def teardown
11
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActionController)
12
+ end
13
+
14
+ def test_init
15
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:Minitest)
16
+ interposer = TuneMyGc.interposer
17
+ assert !interposer.installed
18
+ end
19
+
20
+ def test_install_uninstall
21
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:Minitest)
22
+ interposer = TuneMyGc.interposer
23
+ interposer.install
24
+ interposer.on_initialized
25
+ assert interposer.installed
26
+ assert_nil interposer.install
27
+
28
+ interposer.uninstall
29
+ end
30
+
31
+ def test_gc_hooks
32
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:Minitest)
33
+ interposer = TuneMyGc.interposer
34
+ interposer.install
35
+ TuneMyGc.interposer.on_initialized
36
+
37
+ GC.start(full_mark: true, immediate_sweep: false)
38
+ GC.start(full_mark: true, immediate_sweep: true)
39
+
40
+ stages = []
41
+
42
+ while !TuneMyGc.snapshotter.empty?
43
+ stages << TuneMyGc.snapshotter.deq
44
+ end
45
+
46
+ # Account for incremental GC on 2.2
47
+ cycles = [:GC_CYCLE_STARTED, :GC_CYCLE_ENTERED]
48
+
49
+ assert stages.any?{|s| cycles.include?(s[3]) }
50
+
51
+ interposer.uninstall
52
+ end
53
+
54
+ def test_tests_limit
55
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:Minitest)
56
+ interposer = TuneMyGc.interposer
57
+ interposer.install
58
+ TuneMyGc.interposer.on_initialized
59
+
60
+ ENV["RUBY_GC_TUNE_TESTS"] = "2"
61
+
62
+ run_tunemygc_test
63
+ run_tunemygc_test
64
+
65
+ stages = []
66
+
67
+ while !TuneMyGc.snapshotter.empty?
68
+ stages << TuneMyGc.snapshotter.deq
69
+ end
70
+
71
+ cycles = [:TEST_PROCESSING_STARTED]
72
+
73
+ assert stages.any?{|s| cycles.include?(s[3]) }
74
+
75
+ interposer.uninstall
76
+ ensure
77
+ ENV.delete("RUBY_GC_TUNE_TESTS")
78
+ end
79
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tunemygc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bear Metal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-06 00:00:00.000000000 Z
11
+ date: 2015-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -129,14 +129,17 @@ files:
129
129
  - lib/tunemygc/railtie.rb
130
130
  - lib/tunemygc/request_subscriber.rb
131
131
  - lib/tunemygc/snapshotter.rb
132
+ - lib/tunemygc/spies.rb
132
133
  - lib/tunemygc/spies/action_controller.rb
134
+ - lib/tunemygc/spies/minitest.rb
133
135
  - lib/tunemygc/subscriber.rb
134
136
  - lib/tunemygc/syncer.rb
135
137
  - lib/tunemygc/version.rb
136
138
  - test/fixtures.rb
137
139
  - test/helper.rb
140
+ - test/test_action_controller_interposer.rb
138
141
  - test/test_agent.rb
139
- - test/test_interposer.rb
142
+ - test/test_minitest_interposer.rb
140
143
  - test/test_railtie.rb
141
144
  - test/test_snapshotter.rb
142
145
  - test/test_syncer.rb
@@ -186,8 +189,9 @@ summary: TuneMyGC - optimal MRI Ruby 2.1+ Garbage Collection
186
189
  test_files:
187
190
  - test/fixtures.rb
188
191
  - test/helper.rb
192
+ - test/test_action_controller_interposer.rb
189
193
  - test/test_agent.rb
190
- - test/test_interposer.rb
194
+ - test/test_minitest_interposer.rb
191
195
  - test/test_railtie.rb
192
196
  - test/test_snapshotter.rb
193
197
  - test/test_syncer.rb