Class: SidekiqMemlimit

Inherits:
Object
  • Object
show all
Defined in:
lib/sidekiq_memlimit.rb

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.max_mbObject

Returns the value of attribute max_mb.



3
4
5
# File 'lib/sidekiq_memlimit.rb', line 3

def max_mb
  @max_mb
end

.monitorthreadObject (readonly)

Returns the value of attribute monitorthread.



4
5
6
# File 'lib/sidekiq_memlimit.rb', line 4

def monitorthread
  @monitorthread
end

.sleep_timeObject

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

.pagesizeObject



33
34
35
# File 'lib/sidekiq_memlimit.rb', line 33

def pagesize
  4096
end

.rss_kbObject



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_mbObject



37
38
39
# File 'lib/sidekiq_memlimit.rb', line 37

def rss_mb
  rss_kb >> 10
end

.run_gcObject



29
30
31
# File 'lib/sidekiq_memlimit.rb', line 29

def run_gc
  GC.start
end

.setupObject



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_monitorthreadObject



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