sidekiq_memlimit 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e4f49d07f4bedb1eb8dfa509c7d1bcc8b6327a78
4
+ data.tar.gz: 600eb7890bde5487893f5206c628c30fab32b67a
5
+ SHA512:
6
+ metadata.gz: 1156ff65b00c614403d1ff708ecb3dd38571c272444fb5a2ef1fc220beddd13434bf2239b5b2a236156e530e3f6dd3ca9de672dec5b1a883a5a39a79a16d9710
7
+ data.tar.gz: 67e227ea0d6ebd3ae27d76b56b327141030c1727c68cdc1487b45b891f3d2d127cd53691ecb985ecaecd97b5960a2884b2fbd02569f268e08fb3c69f3ad75c55
data/CHANGELOG ADDED
@@ -0,0 +1 @@
1
+ v0.1. first version
data/Manifest ADDED
@@ -0,0 +1,6 @@
1
+ CHANGELOG
2
+ Manifest
3
+ README.md
4
+ Rakefile
5
+ lib/sidekiq_memlimit.rb
6
+ test/sidekiq_memlimit.rb
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ ## Sidekiq memory limit
2
+
3
+ This ruby gem gracefully kills Sidekiq worker processes (with USR1 signal)
4
+ when the RSS memory exceeds the limit set in the SIDEKIQ_MAX_MB environment
5
+ variable.
6
+
7
+ The memory limit is checked once per 5 seconds in a background thread and
8
+ this is only run when inside a Sidekiq worker.
9
+
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'echoe'
2
+
3
+ Echoe.new("sidekiq_memlimit") do |p|
4
+ p.author = "Andrew Snow"
5
+ p.email = 'andrew@modulus.org'
6
+ p.summary = "Restart Sidekiq gracefully when exceeding preset memory limit"
7
+ p.url = "https://github.com/andys/sidekiq_memlimit"
8
+ p.runtime_dependencies = ['sidekiq >=3.0']
9
+ end
@@ -0,0 +1,56 @@
1
+ class SidekiqMemlimit
2
+ class << self
3
+ attr_accessor :max_mb, :sleep_time
4
+ attr_reader :monitorthread
5
+
6
+ def start_monitorthread
7
+ if !@monitorthread || !@monitorthread.alive?
8
+ @monitorthread = Thread.new do
9
+ begin
10
+ loop do
11
+ mb = rss_mb
12
+ if max_mb && mb > max_mb
13
+ run_gc
14
+ if max_mb && mb > max_mb
15
+ Sidekiq.logger.error "#{self}: Exceeded max memory limit (#{mb} > #{max_mb} MB)"
16
+ Process.kill('USR1', $$)
17
+ end
18
+ end
19
+ sleep sleep_time
20
+ end
21
+ rescue Exception => e
22
+ Sidekiq.logger.error "#{self}: #{$!.class} exception: #{$!}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ def run_gc
29
+ GC.start
30
+ end
31
+
32
+ def pagesize
33
+ 4096
34
+ end
35
+
36
+ def rss_mb
37
+ rss_kb >> 10
38
+ end
39
+
40
+ def rss_kb
41
+ pagesize * (File.read("/proc/#{$$}/statm").split(' ')[1].to_i rescue 0) >> 10
42
+ end
43
+
44
+ def setup
45
+ self.sleep_time ||= 5
46
+ if ENV['SIDEKIQ_MAX_MB']
47
+ self.max_mb = ENV['SIDEKIQ_MAX_MB'].to_i
48
+ self.max_mb = nil unless max_mb > 1
49
+ end
50
+ self.start_monitorthread
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ SidekiqMemlimit.setup if defined?(Sidekiq::CLI)
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: sidekiq_memlimit 0.1 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "sidekiq_memlimit"
6
+ s.version = "0.1"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib"]
10
+ s.authors = ["Andrew Snow"]
11
+ s.date = "2014-08-07"
12
+ s.description = "Restart Sidekiq gracefully when exceeding preset memory limit"
13
+ s.email = "andrew@modulus.org"
14
+ s.extra_rdoc_files = ["CHANGELOG", "README.md", "lib/sidekiq_memlimit.rb"]
15
+ s.files = ["CHANGELOG", "Manifest", "README.md", "Rakefile", "lib/sidekiq_memlimit.rb", "sidekiq_memlimit.gemspec", "test/sidekiq_memlimit.rb"]
16
+ s.homepage = "https://github.com/andys/sidekiq_memlimit"
17
+ s.rdoc_options = ["--line-numbers", "--title", "Sidekiq_memlimit", "--main", "README.md"]
18
+ s.rubyforge_project = "sidekiq_memlimit"
19
+ s.rubygems_version = "2.3.0"
20
+ s.summary = "Restart Sidekiq gracefully when exceeding preset memory limit"
21
+
22
+ if s.respond_to? :specification_version then
23
+ s.specification_version = 4
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<sidekiq>, [">= 3.0"])
27
+ else
28
+ s.add_dependency(%q<sidekiq>, [">= 3.0"])
29
+ end
30
+ else
31
+ s.add_dependency(%q<sidekiq>, [">= 3.0"])
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ ENV['SIDEKIQ_MAX_MB'] = '100'
2
+ require "minitest/autorun"
3
+ require 'sidekiq/cli'
4
+ require "#{File.dirname(__FILE__)}/../lib/sidekiq_memlimit"
5
+
6
+ class TestSidekiqMemlimit < MiniTest::Unit::TestCase
7
+ def test_rss_kb
8
+ SidekiqMemlimit.run_gc
9
+ kb = SidekiqMemlimit.rss_kb
10
+ assert(kb > 0)
11
+ assert_equal "VmRSS:\t%8d kB\n" % kb,
12
+ File.read("/proc/#{$$}/status").lines.grep(/VmRSS/).first
13
+ end
14
+
15
+ def test_monitorthread
16
+ assert SidekiqMemlimit.monitorthread
17
+ end
18
+
19
+ def test_signal
20
+ received_signal = false
21
+ trap("USR1") { received_signal = true }
22
+ Sidekiq.logger = nil
23
+ assert_equal false, received_signal
24
+
25
+ # now take up >100MB memory
26
+ x = 'a' * (101 * 1024 * 1024)
27
+
28
+ sleep 1.1
29
+ assert_equal true, received_signal
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq_memlimit
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Snow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sidekiq
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ description: Restart Sidekiq gracefully when exceeding preset memory limit
28
+ email: andrew@modulus.org
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files:
32
+ - CHANGELOG
33
+ - README.md
34
+ - lib/sidekiq_memlimit.rb
35
+ files:
36
+ - CHANGELOG
37
+ - Manifest
38
+ - README.md
39
+ - Rakefile
40
+ - lib/sidekiq_memlimit.rb
41
+ - sidekiq_memlimit.gemspec
42
+ - test/sidekiq_memlimit.rb
43
+ homepage: https://github.com/andys/sidekiq_memlimit
44
+ licenses: []
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options:
48
+ - --line-numbers
49
+ - --title
50
+ - Sidekiq_memlimit
51
+ - --main
52
+ - README.md
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '1.2'
65
+ requirements: []
66
+ rubyforge_project: sidekiq_memlimit
67
+ rubygems_version: 2.3.0
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Restart Sidekiq gracefully when exceeding preset memory limit
71
+ test_files: []