rmemlimit 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTIxNDQ2YTNjYjg5ODFiZjdmOTcyYmZmMmMwODg0ZjhiMTY1NmJlZA==
5
+ data.tar.gz: !binary |-
6
+ N2I5YmNkYThjZWE5MWE0MzdhYjQ1Yjc1NDE3NzgzZGM3ZjIxNmQ3OQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZTYwODA4M2Q3MTRjYTVmMDExZTVkN2U4ZTA0MzlmM2UxOTVlMDgxZTE1Yzdi
10
+ ZTVlZWE2NDRlOTNmZGQxMzg1YTNjOTlkZDk3MDYxN2UzZTZiNzEzNTk0ZTE0
11
+ ZjRkOTIxNTJkNzRjODJiOTMyMjk0NjllYTE1ZjZmM2YxOGIzNmI=
12
+ data.tar.gz: !binary |-
13
+ YWQzMTRkNzU4N2IxZjg5YjBiYTkzNmI4MTAyM2QyNTI2NDczNTM0MTE2NDk0
14
+ NDc0NGY0ZDA2ZWM0MGNkZGEwMTJmZWFlMzA5NGUzYjY4ZTUwYWRjZDkwYmU5
15
+ NDMzNDM2Mzg2YmNlMjhiNmI4OTAxN2E3MGNhOGI2ZjJmMzY1OTQ=
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.3. Only stop GC if gc_mb is set
2
+
1
3
  v0.2. Changes to support forking
2
4
 
3
5
  v0.1. Proof of concept
data/lib/rmemlimit.rb CHANGED
@@ -1,53 +1,55 @@
1
-
2
1
  class Rmemlimit
3
2
 
4
3
  class << self
5
- attr_accessor :gc_mb, :kill_mb
6
-
4
+ attr_accessor :gc_mb, :kill_mb, :sleep_time
5
+
7
6
  def gcthread
8
7
  if !@gcthread || !@gcthread.alive?
9
8
  @gcthread = Thread.new do
10
- loop do
11
- mb = rss_mb
12
- if kill_mb && mb > kill_mb
13
- STDERR.puts "#{self}: Exceeded kill memory limit (#{mb} > #{kill_Mb} MB)"
14
- Process.kill(9, $$)
15
- elsif gc_mb && mb > gc_mb
16
- run_gc
17
- elsif mb == 0 || !gc_mb || !kill_mb
18
- run_gc
9
+ begin
10
+ loop do
11
+ mb = rss_mb
12
+ if kill_mb && mb > kill_mb
13
+ STDERR.puts "#{self}: Exceeded kill memory limit (#{mb} > #{kill_mb} MB)"
14
+ Process.kill(9, $$)
15
+ elsif gc_mb && mb > gc_mb
16
+ run_gc
17
+ end
18
+ sleep sleep_time
19
19
  end
20
- sleep 1
20
+ rescue
21
+ puts "Exception: #{$!.class} #{$!}"
21
22
  end
22
23
  end
23
24
  end
24
25
  end
25
-
26
+
26
27
  def run_gc
27
28
  GC.enable
28
29
  GC.start
29
30
  GC.disable
30
31
  end
31
-
32
+
32
33
  def pagesize
33
34
  4096
34
35
  end
35
-
36
+
36
37
  def rss_mb
37
38
  rss_kb >> 10
38
39
  end
39
-
40
+
40
41
  def rss_kb
41
42
  pagesize * (File.read("/proc/#{$$}/statm").split(' ')[1].to_i rescue 0) >> 10
42
43
  end
43
-
44
+
44
45
  def setup
46
+ self.sleep_time ||= 1
45
47
  self.gc_mb = ENV['RUBY_GC_MB'].to_i if ENV['RUBY_GC_MB']
46
48
  if ENV['RUBY_KILL_MB']
47
- self.kill_mb = ENV['RUBY_KILL_MB'].to_i
49
+ self.kill_mb = ENV['RUBY_KILL_MB'].to_i
48
50
  self.kill_mb = nil unless Rmemlimit.kill_mb > 1
49
51
  end
50
- GC.disable
52
+ GC.disable if gc_mb
51
53
  self.gcthread
52
54
  end
53
55
  end
data/rmemlimit.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rmemlimit"
5
- s.version = "0.2"
5
+ s.version = "0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Andrew Snow"]
9
- s.date = "2013-01-11"
9
+ s.date = "2013-08-15"
10
10
  s.description = "Slow down garbage collector & limit ruby process memory"
11
11
  s.email = "andrew@modulus.org"
12
12
  s.extra_rdoc_files = ["CHANGELOG", "README.md", "lib/rmemlimit.rb"]
@@ -15,16 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rmemlimit", "--main", "README.md"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = "rmemlimit"
18
- s.rubygems_version = "1.8.24"
18
+ s.rubygems_version = "2.0.3"
19
19
  s.summary = "Slow down garbage collector & limit ruby process memory"
20
20
  s.test_files = ["test/test_all.rb"]
21
-
22
- if s.respond_to? :specification_version then
23
- s.specification_version = 3
24
-
25
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
- else
27
- end
28
- else
29
- end
30
21
  end
data/test/test_all.rb CHANGED
@@ -5,6 +5,7 @@ require 'test/unit'
5
5
  class TestRmemlimit < Test::Unit::TestCase
6
6
 
7
7
  def test_rss_kb
8
+ Rmemlimit.run_gc
8
9
  kb = Rmemlimit.rss_kb
9
10
  assert(kb > 0)
10
11
 
@@ -12,18 +13,13 @@ class TestRmemlimit < Test::Unit::TestCase
12
13
  File.read("/proc/#{$$}/status").lines.grep(/VmRSS/).first
13
14
  end
14
15
 
15
- def test_run_gc
16
- gccount = GC.stat[:count] + 1
17
- sleep 1.1
18
- assert_equal gccount, GC.stat[:count]
19
- end
20
-
21
16
  def test_gc_mb
22
17
  Rmemlimit.gc_mb = Rmemlimit.rss_mb
23
- gccount = GC.stat[:count] + 1
24
- flibble = 'x' * 1024 * 1024
25
- sleep 1.1
26
- assert_equal gccount, GC.stat[:count]
18
+ Rmemlimit.sleep_time = 0.5
19
+ gccount = GC.stat[:count]
20
+ flibble = 'x' * 100000000
21
+ sleep 0.6
22
+ assert_equal gccount + 1, GC.stat[:count]
27
23
  end
28
24
 
29
25
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmemlimit
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: '0.2'
4
+ version: '0.3'
6
5
  platform: ruby
7
6
  authors:
8
7
  - Andrew Snow
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-11 00:00:00.000000000 Z
11
+ date: 2013-08-15 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: Slow down garbage collector & limit ruby process memory
15
14
  email: andrew@modulus.org
@@ -29,6 +28,7 @@ files:
29
28
  - rmemlimit.gemspec
30
29
  homepage: https://github.com/andys/rmemlimit
31
30
  licenses: []
31
+ metadata: {}
32
32
  post_install_message:
33
33
  rdoc_options:
34
34
  - --line-numbers
@@ -44,18 +44,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
44
  - - ! '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
- none: false
48
47
  required_rubygems_version: !ruby/object:Gem::Requirement
49
48
  requirements:
50
49
  - - ! '>='
51
50
  - !ruby/object:Gem::Version
52
51
  version: '1.2'
53
- none: false
54
52
  requirements: []
55
53
  rubyforge_project: rmemlimit
56
- rubygems_version: 1.8.24
54
+ rubygems_version: 2.0.3
57
55
  signing_key:
58
- specification_version: 3
56
+ specification_version: 4
59
57
  summary: Slow down garbage collector & limit ruby process memory
60
58
  test_files:
61
59
  - test/test_all.rb