sidekiq_memlimit 0.1

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.
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: []