tunemygc 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/test/helper.rb ADDED
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ ENV['RUBY_GC_TOKEN'] = 'testapp'
4
+
5
+ require 'rails'
6
+ require 'tunemygc'
7
+ require "tunemygc/syncer"
8
+ require 'minitest/autorun'
9
+ require 'webmock/minitest'
10
+
11
+ WebMock.disable_net_connect!
12
+
13
+ require File.join(File.dirname(__FILE__), 'fixtures')
14
+
15
+ class TuneMyGcTestCase < Minitest::Test
16
+ if ENV['STRESS_GC'] == '1'
17
+ def setup
18
+ GC.stress = true
19
+ end
20
+
21
+ def teardown
22
+ GC.stress = false
23
+ end
24
+ end
25
+
26
+ def process_request(path = '/test')
27
+ ActiveSupport::Notifications.instrument('start_processing.action_controller', path: path) {}
28
+ ActiveSupport::Notifications.instrument('process_action.action_controller', path: path) {}
29
+ end
30
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestAgent < TuneMyGcTestCase
6
+ def test_interposer
7
+ assert_instance_of TuneMyGc::Interposer, TuneMyGc.interposer
8
+ end
9
+
10
+ def test_snapshotter
11
+ assert_instance_of TuneMyGc::Snapshotter, TuneMyGc.snapshotter
12
+ end
13
+
14
+ def test_log
15
+ out, err = capture_io do
16
+ TuneMyGc.logger = Logger.new($stdout)
17
+ TuneMyGc.log 'test'
18
+ end
19
+ assert_match(/test/, out)
20
+ end
21
+ end
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestInterposer < TuneMyGcTestCase
6
+ def setup
7
+ TuneMyGc.interposer.uninstall
8
+ end
9
+
10
+ def test_init
11
+ interposer = TuneMyGc.interposer
12
+ assert !interposer.installed
13
+ assert_equal [], interposer.spy.subscriptions
14
+ end
15
+
16
+ def test_install_uninstall
17
+ interposer = TuneMyGc.interposer
18
+ interposer.install
19
+ TuneMyGc.interposer.on_initialized
20
+
21
+ assert_equal 2, interposer.spy.subscriptions.size
22
+ assert interposer.installed
23
+ assert_nil interposer.install
24
+
25
+ interposer.uninstall
26
+ assert_equal [], interposer.spy.subscriptions
27
+ end
28
+
29
+ def test_gc_hooks
30
+ interposer = TuneMyGc.interposer
31
+ interposer.install
32
+ TuneMyGc.interposer.on_initialized
33
+
34
+ GC.start(full_mark: true, immediate_sweep: false)
35
+ GC.start(full_mark: true, immediate_sweep: true)
36
+
37
+ stages = []
38
+
39
+ while !TuneMyGc.snapshotter.empty?
40
+ stages << TuneMyGc.snapshotter.deq
41
+ end
42
+
43
+ # Account for incremental GC on 2.2
44
+ cycles = [:GC_CYCLE_STARTED, :GC_CYCLE_ENTERED]
45
+
46
+ assert stages.any?{|s| cycles.include?(s[3]) }
47
+
48
+ interposer.uninstall
49
+ assert_equal [], interposer.spy.subscriptions
50
+ end
51
+
52
+ def test_requests_limit
53
+ interposer = TuneMyGc.interposer
54
+ interposer.install
55
+ TuneMyGc.interposer.on_initialized
56
+
57
+ assert_equal 2, interposer.spy.subscriptions.size
58
+
59
+ ENV["RUBY_GC_TUNE_REQUESTS"] = "2"
60
+
61
+ process_request
62
+ assert_equal 2, interposer.spy.subscriptions.size
63
+ process_request
64
+ assert_equal 0, interposer.spy.subscriptions.size
65
+ interposer.uninstall
66
+ ensure
67
+ ENV.delete("RUBY_GC_TUNE_REQUESTS")
68
+ end
69
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestRailtie < TuneMyGcTestCase
6
+ def test_init
7
+ out, err = capture_io do
8
+ Rails.logger = Logger.new($stdout)
9
+ TuneMyGc::Railtie.run_initializers
10
+ sleep 1
11
+ end
12
+ assert_equal Rails.logger, TuneMyGc.logger
13
+ assert_match(/interposing/, out)
14
+ assert_match(/after_initialize/, out)
15
+ assert_match(/at_exit/, out)
16
+ assert_match(/interposed/, out)
17
+ ensure
18
+ TuneMyGc.logger = Logger.new($stdout)
19
+ TuneMyGc.interposer.uninstall
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestSnapshotter < TuneMyGcTestCase
6
+ def test_init
7
+ snapshots = TuneMyGc::Snapshotter.new
8
+ assert_equal 0, snapshots.size
9
+ end
10
+
11
+ def test_take
12
+ snapshots = TuneMyGc::Snapshotter.new
13
+ snapshots.take(:BOOTED)
14
+ assert_equal 1, snapshots.size
15
+ snapshots.clear
16
+ end
17
+
18
+ def test_clear
19
+ snapshots = TuneMyGc::Snapshotter.new
20
+ snapshots.take(:BOOTED)
21
+ assert_equal 1, snapshots.size
22
+ snapshots.clear
23
+ assert_equal 0, snapshots.size
24
+ end
25
+
26
+ def test_max_samples
27
+ snapshots = TuneMyGc::Snapshotter.new
28
+ 1000.times do |i|
29
+ snapshots.take(:MAX)
30
+ end
31
+ assert_equal 1000, snapshots.size
32
+ out, err = capture_io do
33
+ TuneMyGc.logger = Logger.new($stdout)
34
+ snapshots.take(:MORE)
35
+ snapshots.take(:ANOTHER)
36
+ end
37
+ assert_match(/Discarding snapshot/, out)
38
+ assert_equal 1000, snapshots.size
39
+ snapshots.clear
40
+ end
41
+ end
@@ -0,0 +1,146 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+
5
+ class TestSyncer < TuneMyGcTestCase
6
+ def test_uri
7
+ syncer = TuneMyGc::Syncer.new
8
+ assert_equal "tunemygc.com", syncer.uri.host
9
+ assert_equal 443, syncer.uri.port
10
+ end
11
+
12
+ def test_client
13
+ syncer = TuneMyGc::Syncer.new
14
+ assert_instance_of Net::HTTP, syncer.client
15
+ end
16
+
17
+ def test_environment
18
+ assert_equal 7, TuneMyGc::Syncer::ENVIRONMENT.size
19
+ end
20
+
21
+ def test_sync_valid_snapshot
22
+ syncer = TuneMyGc::Syncer.new
23
+ snapshots = TuneMyGc::Snapshotter.new
24
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
25
+
26
+ stub_request(:get, "https://tunemygc.com/configs/xxxxxxx").
27
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
28
+ to_return(:status => 200, :body => ActiveSupport::JSON.encode({:Memory=>{:RUBY_GC_HEAP_INIT_SLOTS=>477268, :RUBY_GC_HEAP_FREE_SLOTS=>106607, :RUBY_GC_HEAP_GROWTH_FACTOR=>1.05, :RUBY_GC_HEAP_GROWTH_MAX_SLOTS=>10661, :RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=>1.05, :RUBY_GC_MALLOC_LIMIT=>2000000, :RUBY_GC_MALLOC_LIMIT_MAX=>4000000, :RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=>1.1, :RUBY_GC_OLDMALLOC_LIMIT=>2000000, :RUBY_GC_OLDMALLOC_LIMIT_MAX=>4000000, :RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=>1.05}, :Speed=>{:RUBY_GC_HEAP_INIT_SLOTS=>572722, :RUBY_GC_HEAP_FREE_SLOTS=>553800, :RUBY_GC_HEAP_GROWTH_FACTOR=>1.2, :RUBY_GC_HEAP_GROWTH_MAX_SLOTS=>83070, :RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=>2.0, :RUBY_GC_MALLOC_LIMIT=>64000000, :RUBY_GC_MALLOC_LIMIT_MAX=>128000000, :RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=>1.56, :RUBY_GC_OLDMALLOC_LIMIT=>64000000, :RUBY_GC_OLDMALLOC_LIMIT_MAX=>33554432, :RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=>1.32}}), :headers => {})
29
+
30
+ stub_request(:post, "https://tunemygc.com/ruby").
31
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
32
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
33
+ to_return(:status => 200, :body => "https://www.tunemygc.com/configs/xxxxxxx", :headers => {})
34
+
35
+ out, err = capture_io do
36
+ TuneMyGc.logger = Logger.new($stdout)
37
+ assert syncer.sync(snapshots)
38
+ #s = syncer.sync(snapshots)
39
+ #assert s
40
+ end
41
+ assert_match(/Syncing 1 snapshots/, out)
42
+ end
43
+
44
+ def test_not_supported
45
+ syncer = TuneMyGc::Syncer.new
46
+ snapshots = TuneMyGc::Snapshotter.new
47
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
48
+ stub_request(:post, "https://tunemygc.com/ruby").
49
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
50
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
51
+ to_return(:status => 501, :body => "", :headers => {})
52
+
53
+ out, err = capture_io do
54
+ TuneMyGc.logger = Logger.new($stdout)
55
+ assert_nil syncer.sync(snapshots)
56
+ end
57
+ assert_match(/Ruby version/, out)
58
+ assert_match(/Rails version/, out)
59
+ assert_match(/not supported/, out)
60
+ assert_match(/Failed to sync 1 snapshots/, out)
61
+ end
62
+
63
+ def test_already_configured
64
+ syncer = TuneMyGc::Syncer.new
65
+ snapshots = TuneMyGc::Snapshotter.new
66
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
67
+ stub_request(:post, "https://tunemygc.com/ruby").
68
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
69
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
70
+ to_return(:status => 412, :body => "", :headers => {})
71
+
72
+ out, err = capture_io do
73
+ TuneMyGc.logger = Logger.new($stdout)
74
+ assert_nil syncer.sync(snapshots)
75
+ end
76
+ assert_match(/The GC is already tuned by environment variables/, out)
77
+ assert_match(/Failed to sync 1 snapshots/, out)
78
+ end
79
+
80
+ def test_bad_payload
81
+ syncer = TuneMyGc::Syncer.new
82
+ snapshots = TuneMyGc::Snapshotter.new
83
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
84
+ stub_request(:post, "https://tunemygc.com/ruby").
85
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
86
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
87
+ to_return(:status => 400, :body => "snapshot timestamp", :headers => {})
88
+
89
+ out, err = capture_io do
90
+ TuneMyGc.logger = Logger.new($stdout)
91
+ assert_nil syncer.sync(snapshots)
92
+ end
93
+ assert_match(/Invalid payload/, out)
94
+ assert_match(/snapshot timestamp/, out)
95
+ assert_match(/Failed to sync 1 snapshots/, out)
96
+ end
97
+
98
+ def test_invalid_token
99
+ syncer = TuneMyGc::Syncer.new
100
+ snapshots = TuneMyGc::Snapshotter.new
101
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
102
+ stub_request(:post, "https://tunemygc.com/ruby").
103
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
104
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
105
+ to_return(:status => 404, :body => "", :headers => {})
106
+
107
+ out, err = capture_io do
108
+ TuneMyGc.logger = Logger.new($stdout)
109
+ assert_nil syncer.sync(snapshots)
110
+ end
111
+ assert_match(/Invalid application token/, out)
112
+ end
113
+
114
+ def test_upgrade_required
115
+ syncer = TuneMyGc::Syncer.new
116
+ snapshots = TuneMyGc::Snapshotter.new
117
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
118
+ stub_request(:post, "https://tunemygc.com/ruby").
119
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
120
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).
121
+ to_return(:status => 426, :body => "2", :headers => {})
122
+
123
+ out, err = capture_io do
124
+ TuneMyGc.logger = Logger.new($stdout)
125
+ assert_nil syncer.sync(snapshots)
126
+ end
127
+ assert_match(/Agent version 2 required/, out)
128
+ assert_match(/Failed to sync 1 snapshots/, out)
129
+ end
130
+
131
+ def test_sync_error
132
+ syncer = TuneMyGc::Syncer.new
133
+ snapshots = TuneMyGc::Snapshotter.new
134
+ snapshots.take_raw(Fixtures::STAGE_BOOTED)
135
+ stub_request(:post, "https://tunemygc.com/ruby").
136
+ with(:body => "[#{ActiveSupport::JSON.encode(TuneMyGc::Syncer::ENVIRONMENT)},[1420152606.1162581,\"BOOTED\",{\"count\":32,\"heap_used\":950,\"heap_length\":1519,\"heap_increment\":569,\"heap_live_slot\":385225,\"heap_free_slot\":2014,\"heap_final_slot\":0,\"heap_swept_slot\":101119,\"heap_eden_page_length\":950,\"heap_tomb_page_length\":0,\"total_allocated_object\":2184137,\"total_freed_object\":1798912,\"malloc_increase\":9665288,\"malloc_limit\":16777216,\"minor_gc_count\":26,\"major_gc_count\":6,\"remembered_shady_object\":5145,\"remembered_shady_object_limit\":6032,\"old_object\":230164,\"old_object_limit\":301030,\"oldmalloc_increase\":11715304,\"oldmalloc_limit\":24159190},{\"major_by\":null,\"gc_by\":\"newobj\",\"have_finalizer\":false,\"immediate_sweep\":false},null]]",
137
+ :headers => {'Accept'=>'application/json', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'TuneMyGC 1.0'}).to_raise(IOError.new("dang"))
138
+
139
+ out, err = capture_io do
140
+ TuneMyGc.logger = Logger.new($stdout)
141
+ assert_nil syncer.sync(snapshots)
142
+ end
143
+ assert_match(/Failed to sync 1 snapshots/, out)
144
+ assert_match(/dang/, out)
145
+ end
146
+ end
data/tunemygc-1.0.gem ADDED
Binary file
data/tunemygc.gemspec ADDED
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'tunemygc/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "tunemygc"
9
+ s.version = TuneMyGc::VERSION
10
+ s.summary = "TuneMyGC - optimal MRI Ruby 2.1+ Garbage Collection"
11
+ s.description = "Agent for the GC tuning webservice https://www.tunemygc.com - optimal settings for throughput and memory usage of Rails applications"
12
+ s.authors = ["Bear Metal OÜ"]
13
+ s.email = ["info@bearmetal.eu"]
14
+ s.license = "MIT"
15
+ s.homepage = "https://tunemygc.com"
16
+ s.date = Time.now.utc.strftime('%Y-%m-%d')
17
+ s.platform = Gem::Platform::RUBY
18
+ s.files = `git ls-files`.split($/)
19
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ s.extensions = "ext/tunemygc/extconf.rb"
21
+ s.test_files = `git ls-files test`.split($/)
22
+ s.require_paths = ["lib"]
23
+ s.required_ruby_version = '>= 2.1.0'
24
+ s.post_install_message = <<-eos
25
+ [TuneMyGC] Getting started:
26
+
27
+ Run this setup command from your application root to register your application with the `https://tunemygc.com` service:
28
+
29
+ bundle exec tunemygc -r your@email.address
30
+
31
+ You should get back a token reference to identify this Rails app:
32
+
33
+ Application registered. Use RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 in your environment.
34
+
35
+ Then sample your Rails app for tuning:
36
+
37
+ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
38
+
39
+ We require a valid email address as a canonical reference for tuner tokens for your applications.
40
+
41
+ Happy hacking,
42
+ - the Bear Metal cubs
43
+ eos
44
+
45
+ s.add_dependency('activesupport', '~> 4.1')
46
+ s.add_dependency('certified', '~> 1.0', '>= 1.0.0')
47
+ s.add_development_dependency('rake', '~> 10.3')
48
+ s.add_development_dependency('rake-compiler', '~> 0.9', '>= 0.9.5')
49
+ s.add_development_dependency('webmock', '~> 1.2', '>= 1.2.0')
50
+ end
metadata ADDED
@@ -0,0 +1,194 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tunemygc
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bear Metal OÜ
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: certified
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.0.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.0'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '10.3'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '10.3'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake-compiler
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.9'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 0.9.5
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.9'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 0.9.5
81
+ - !ruby/object:Gem::Dependency
82
+ name: webmock
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.2'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.2.0
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.2'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.2.0
101
+ description: Agent for the GC tuning webservice https://www.tunemygc.com - optimal
102
+ settings for throughput and memory usage of Rails applications
103
+ email:
104
+ - info@bearmetal.eu
105
+ executables:
106
+ - tunemygc
107
+ extensions:
108
+ - ext/tunemygc/extconf.rb
109
+ extra_rdoc_files: []
110
+ files:
111
+ - ".gitignore"
112
+ - ".travis.yml"
113
+ - Gemfile
114
+ - Gemfile.lock
115
+ - README.md
116
+ - Rakefile
117
+ - assets/discourse_bench.png
118
+ - assets/tunemygc-graphic2x-80dac1571cacc70d9b272bb62ae9f6df.png
119
+ - bin/tunemygc
120
+ - ext/tunemygc/extconf.rb
121
+ - ext/tunemygc/getRSS.c
122
+ - ext/tunemygc/tunemygc_ext.c
123
+ - ext/tunemygc/tunemygc_ext.h
124
+ - lib/tunemygc.rb
125
+ - lib/tunemygc/agent.rb
126
+ - lib/tunemygc/cli.rb
127
+ - lib/tunemygc/configurator.rb
128
+ - lib/tunemygc/interposer.rb
129
+ - lib/tunemygc/railtie.rb
130
+ - lib/tunemygc/request_subscriber.rb
131
+ - lib/tunemygc/snapshotter.rb
132
+ - lib/tunemygc/spies/action_controller.rb
133
+ - lib/tunemygc/subscriber.rb
134
+ - lib/tunemygc/syncer.rb
135
+ - lib/tunemygc/version.rb
136
+ - test/fixtures.rb
137
+ - test/helper.rb
138
+ - test/test_agent.rb
139
+ - test/test_interposer.rb
140
+ - test/test_railtie.rb
141
+ - test/test_snapshotter.rb
142
+ - test/test_syncer.rb
143
+ - tunemygc-1.0.gem
144
+ - tunemygc.gemspec
145
+ homepage: https://tunemygc.com
146
+ licenses:
147
+ - MIT
148
+ metadata: {}
149
+ post_install_message: |2
150
+ [TuneMyGC] Getting started:
151
+
152
+ Run this setup command from your application root to register your application with the `https://tunemygc.com` service:
153
+
154
+ bundle exec tunemygc -r your@email.address
155
+
156
+ You should get back a token reference to identify this Rails app:
157
+
158
+ Application registered. Use RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 in your environment.
159
+
160
+ Then sample your Rails app for tuning:
161
+
162
+ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
163
+
164
+ We require a valid email address as a canonical reference for tuner tokens for your applications.
165
+
166
+ Happy hacking,
167
+ - the Bear Metal cubs
168
+ rdoc_options: []
169
+ require_paths:
170
+ - lib
171
+ required_ruby_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 2.1.0
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ requirements: []
182
+ rubyforge_project:
183
+ rubygems_version: 2.2.2
184
+ signing_key:
185
+ specification_version: 4
186
+ summary: TuneMyGC - optimal MRI Ruby 2.1+ Garbage Collection
187
+ test_files:
188
+ - test/fixtures.rb
189
+ - test/helper.rb
190
+ - test/test_agent.rb
191
+ - test/test_interposer.rb
192
+ - test/test_railtie.rb
193
+ - test/test_snapshotter.rb
194
+ - test/test_syncer.rb