Class: GetProcessMem
- Inherits:
-
Object
- Object
- GetProcessMem
- Includes:
- Sys
- Defined in:
- lib/get_process_mem.rb,
lib/get_process_mem/version.rb
Overview
Cribbed from Unicorn Worker Killer, thanks!
Constant Summary collapse
- KB_TO_BYTE =
2**10 = 1024
number_to_bigdecimal 1024
- MB_TO_BYTE =
1024**2 = 1_048_576
number_to_bigdecimal 1_048_576
- GB_TO_BYTE =
1024**3 = 1_073_741_824
number_to_bigdecimal 1_073_741_824
- CONVERSION =
{ "kb" => KB_TO_BYTE, "mb" => MB_TO_BYTE, "gb" => GB_TO_BYTE }
- ROUND_UP =
number_to_bigdecimal "0.5"
- RUNS_ON_WINDOWS =
Gem.win_platform?
- VERSION =
"0.2.3"
Instance Attribute Summary collapse
-
#pid ⇒ Object
readonly
Returns the value of attribute pid.
Instance Method Summary collapse
- #bytes ⇒ Object
- #gb(b = bytes) ⇒ Object
-
#initialize(pid = Process.pid) ⇒ GetProcessMem
constructor
A new instance of GetProcessMem.
- #inspect ⇒ Object
- #kb(b = bytes) ⇒ Object
- #linux? ⇒ Boolean
-
#linux_memory(file = @process_file) ⇒ Object
linux stores detailed memory info in a file “/proc/##pid/smaps”.
-
#linux_status_memory(file = @status_file) ⇒ Object
linux stores memory info in a file “/proc/##pid/status” If it’s available it uses less resources than shelling out to ps.
- #mb(b = bytes) ⇒ Object
-
#ps_memory ⇒ Object
Pull memory from ‘ps` command, takes more resources and can freeze in low memory situations.
Constructor Details
#initialize(pid = Process.pid) ⇒ GetProcessMem
Returns a new instance of GetProcessMem.
40 41 42 43 44 45 |
# File 'lib/get_process_mem.rb', line 40 def initialize(pid = Process.pid) @status_file = Pathname.new "/proc/#{pid}/status" @process_file = Pathname.new "/proc/#{pid}/smaps" @pid = pid @linux = @status_file.exist? end |
Instance Attribute Details
#pid ⇒ Object (readonly)
Returns the value of attribute pid.
25 26 27 |
# File 'lib/get_process_mem.rb', line 25 def pid @pid end |
Instance Method Details
#bytes ⇒ Object
51 52 53 54 |
# File 'lib/get_process_mem.rb', line 51 def bytes memory = linux_status_memory if linux? memory ||= ps_memory end |
#gb(b = bytes) ⇒ Object
64 65 66 |
# File 'lib/get_process_mem.rb', line 64 def gb(b = bytes) (b/GB_TO_BYTE).to_f end |
#inspect ⇒ Object
68 69 70 71 |
# File 'lib/get_process_mem.rb', line 68 def inspect b = bytes "#<#{self.class}:0x%08x @mb=#{ mb b } @gb=#{ gb b } @kb=#{ kb b } @bytes=#{b}>" % (object_id * 2) end |
#kb(b = bytes) ⇒ Object
56 57 58 |
# File 'lib/get_process_mem.rb', line 56 def kb(b = bytes) (b/KB_TO_BYTE).to_f end |
#linux? ⇒ Boolean
47 48 49 |
# File 'lib/get_process_mem.rb', line 47 def linux? @linux end |
#linux_memory(file = @process_file) ⇒ Object
linux stores detailed memory info in a file “/proc/##pid/smaps”
85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/get_process_mem.rb', line 85 def linux_memory(file = @process_file) lines = file.each_line.select {|line| line.match(/^Rss/) } return if lines.empty? lines.reduce(0) do |sum, line| line.match(/(?<value>(\d*\.{0,1}\d+))\s+(?<unit>\w\w)/) do |m| value = number_to_bigdecimal(m[:value]) + ROUND_UP unit = m[:unit].downcase sum += CONVERSION[unit] * value end sum end rescue Errno::EACCES 0 end |
#linux_status_memory(file = @status_file) ⇒ Object
linux stores memory info in a file “/proc/##pid/status” If it’s available it uses less resources than shelling out to ps
75 76 77 78 79 80 81 82 |
# File 'lib/get_process_mem.rb', line 75 def linux_status_memory(file = @status_file) line = file.each_line.detect {|line| line.start_with? 'VmRSS'.freeze } return unless line return unless (_name, value, unit = line.split(nil)).length == 3 CONVERSION[unit.downcase!] * value.to_i rescue Errno::EACCES, Errno::ENOENT 0 end |
#mb(b = bytes) ⇒ Object
60 61 62 |
# File 'lib/get_process_mem.rb', line 60 def mb(b = bytes) (b/MB_TO_BYTE).to_f end |
#ps_memory ⇒ Object
Pull memory from ‘ps` command, takes more resources and can freeze in low memory situations
102 103 104 105 106 107 108 109 110 |
# File 'lib/get_process_mem.rb', line 102 def ps_memory if RUNS_ON_WINDOWS size = ProcTable.ps(pid).working_set_size number_to_bigdecimal(size) else mem = `ps -o rss= -p #{pid}` KB_TO_BYTE * number_to_bigdecimal(mem == "" ? 0 : mem) end end |