Class: SidekiqMemlimit
- Inherits:
-
Object
- Object
- SidekiqMemlimit
- Defined in:
- lib/sidekiq_memlimit.rb
Class Attribute Summary collapse
-
.max_mb ⇒ Object
Returns the value of attribute max_mb.
-
.monitorthread ⇒ Object
readonly
Returns the value of attribute monitorthread.
-
.sleep_time ⇒ Object
Returns the value of attribute sleep_time.
Class Method Summary collapse
- .pagesize ⇒ Object
- .rss_kb ⇒ Object
- .rss_mb ⇒ Object
- .run_gc ⇒ Object
- .setup ⇒ Object
- .start_monitorthread ⇒ Object
Class Attribute Details
.max_mb ⇒ Object
Returns the value of attribute max_mb.
3 4 5 |
# File 'lib/sidekiq_memlimit.rb', line 3 def max_mb @max_mb end |
.monitorthread ⇒ Object (readonly)
Returns the value of attribute monitorthread.
4 5 6 |
# File 'lib/sidekiq_memlimit.rb', line 4 def monitorthread @monitorthread end |
.sleep_time ⇒ Object
Returns the value of attribute sleep_time.
3 4 5 |
# File 'lib/sidekiq_memlimit.rb', line 3 def sleep_time @sleep_time end |
Class Method Details
.pagesize ⇒ Object
33 34 35 |
# File 'lib/sidekiq_memlimit.rb', line 33 def pagesize 4096 end |
.rss_kb ⇒ Object
41 42 43 |
# File 'lib/sidekiq_memlimit.rb', line 41 def rss_kb pagesize * (File.read("/proc/#{$$}/statm").split(' ')[1].to_i rescue 0) >> 10 end |
.rss_mb ⇒ Object
37 38 39 |
# File 'lib/sidekiq_memlimit.rb', line 37 def rss_mb rss_kb >> 10 end |
.run_gc ⇒ Object
29 30 31 |
# File 'lib/sidekiq_memlimit.rb', line 29 def run_gc GC.start end |
.setup ⇒ Object
45 46 47 48 49 50 51 52 |
# File 'lib/sidekiq_memlimit.rb', line 45 def setup self.sleep_time ||= 5 if ENV['SIDEKIQ_MAX_MB'] self.max_mb = ENV['SIDEKIQ_MAX_MB'].to_i self.max_mb = nil unless max_mb > 1 end self.start_monitorthread end |
.start_monitorthread ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/sidekiq_memlimit.rb', line 6 def start_monitorthread if !@monitorthread || !@monitorthread.alive? @monitorthread = Thread.new do begin loop do mb = rss_mb if max_mb && mb > max_mb run_gc if max_mb && mb > max_mb Sidekiq.logger.error "#{self}: Exceeded max memory limit (#{mb} > #{max_mb} MB)" Process.kill('USR1', $$) Thread.exit end end sleep sleep_time end rescue Exception => e Sidekiq.logger.error "#{self}: #{$!.class} exception: #{$!}" end end end end |