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 +7 -0
- data/CHANGELOG +1 -0
- data/Manifest +6 -0
- data/README.md +9 -0
- data/Rakefile +9 -0
- data/lib/sidekiq_memlimit.rb +56 -0
- data/sidekiq_memlimit.gemspec +33 -0
- data/test/sidekiq_memlimit.rb +31 -0
- metadata +71 -0
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
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: []
|