Sha256: 60db6cac959e14d8d1f29a5b7eb7a1fba5f37aae70eed6afd0285554a5b6ba46

Contents?: true

Size: 1.72 KB

Versions: 3

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

module PumaWorkerKiller
  class PumaMemory
    def initialize(master = nil)
      @master  = master || get_master
      @workers = nil
    end

    attr_reader :master

    def size
      workers.size
    end

    def term_worker(worker)
      worker.term
    end

    def term_largest_worker
      largest_worker.term
    end

    def workers_stopped?
      !running?
    end

    def running?
      @master && workers.any?
    end

    def smallest_worker
      smallest, = workers.to_a.first
      smallest
    end

    def smallest_worker_memory
      _, smallest_mem = workers.to_a.first
      smallest_mem
    end

    def largest_worker
      largest_worker, = workers.to_a.last
      largest_worker
    end

    def largest_worker_memory
      _, largest_memory_used = workers.to_a.last
      largest_memory_used
    end

    # Will refresh @workers
    def get_total(workers = set_workers)
      master_memory = GetProcessMem.new(Process.pid).mb
      worker_memory = workers.values.inject(:+) || 0
      worker_memory + master_memory
    end
    alias get_total_memory get_total

    def workers
      @workers || set_workers
    end

    private

    def get_master
      ObjectSpace.each_object(Puma::Cluster).map { |obj| obj }.first if defined?(Puma::Cluster)
    end

    # Returns sorted hash, keys are worker objects, values are memory used per worker
    # sorted by memory ascending (smallest first, largest last)
    def set_workers
      workers = {}
      @master.instance_variable_get('@workers').each do |worker|
        workers[worker] = GetProcessMem.new(worker.pid).mb
      end
      if workers.any?
        @workers = Hash[workers.sort_by { |_, mem| mem }]
      else
        {}
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
puma_worker_killer-0.3.1 lib/puma_worker_killer/puma_memory.rb
puma_worker_killer-0.3.0 lib/puma_worker_killer/puma_memory.rb
puma_worker_killer-0.2.0 lib/puma_worker_killer/puma_memory.rb