get_process_mem 0.2.1 → 0.2.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1ec90ef55de8687d6be515c6191755d5411ee3ab
4
- data.tar.gz: 610e87016aed28ddd40ec448b7fcd42e754cb1a4
2
+ SHA256:
3
+ metadata.gz: 87eabfa8d0c83dd5448c3418805623e0322eac365a31effc157e37d96dcdb205
4
+ data.tar.gz: 689724dac0774a37b97899f85fa2f7eedd5effe1d3e01cae5e4606047c38df89
5
5
  SHA512:
6
- metadata.gz: be1f8d9ddc800b00e67054d2d218e2cc6bbdc9a5972c5491941f481ff8e693d9d423315dad04ef1de9e5ab61a372e02fb5a409fbbcae10a3b4f2b23791849e58
7
- data.tar.gz: c8b6e1fb05a95d651e60f86255e0b9c72089374922e1a434ed047489a800217f7d512f00188542b1b0f59e1c9b190ad97afb05cc8d53429a18a72b120e1481ed
6
+ metadata.gz: 4a4a209a463bb2076a671c96db52c0e5e0a12ad12e3915508d496eb89a18f2be305d729883ee0e64aba9050ed8c7cb3a42531067915428163e325c2f1401759c
7
+ data.tar.gz: 884c8aab69d1e2a90ef6c1c8f98985d920adb89eb692ddb39363d0f7765e86073aa08d3382d0759a070bf6a20916164de6945f71421ce377533f963c1cf8fb5f
@@ -1,12 +1,14 @@
1
1
  language: ruby
2
+ os:
3
+ - linux
4
+ - osx
2
5
 
3
6
  before_install:
4
7
  - gem install bundler -v 1.12.5
5
8
 
6
9
  rvm:
7
- - 1.9.3
8
- - 2.0.0
9
- - 2.1.0
10
+ - 2.2.0
11
+ - 2.5.0
10
12
  - ruby-head
11
13
  - jruby-19mode
12
14
  - rbx-19mode
@@ -15,4 +17,4 @@ matrix:
15
17
  allow_failures:
16
18
  - rvm: ruby-head
17
19
  - rvm: rbx-19mode
18
- - rvm: jruby-19mode
20
+ - rvm: jruby-19mode
@@ -1,6 +1,18 @@
1
+ ## 0.2.4
2
+
3
+ - Use FFI to speed up memory lookup on Mac (darwin) by roughly 12x (#32)
4
+
5
+ ## 0.2.3
6
+
7
+ - Silence BigDecimal deprecation warning under Ruby 2.5 (#26)
8
+
9
+ ## 0.2.2
10
+
11
+ - Fix support for Ruby 2.4 (#23)
12
+
1
13
  ## 0.2.1
2
14
 
3
- - Windows support.
15
+ - ???
4
16
 
5
17
  ## 0.2.0
6
18
 
@@ -17,4 +29,4 @@
17
29
 
18
30
  ## 0.0.1
19
31
 
20
- - Initial
32
+ - Initial
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Get Process Memory
2
2
 
3
3
  [![Build Status](https://travis-ci.org/schneems/get_process_mem.png?branch=master)](https://travis-ci.org/schneems/get_process_mem)
4
+ [![Help Contribute to Open Source](https://www.codetriage.com/schneems/get_process_mem/badges/users.svg)](https://www.codetriage.com/schneems/get_process_mem)
4
5
 
5
6
  Do you need to get the memory usage of a process? Great because this library does that.
6
7
 
@@ -18,6 +18,8 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
+ gem.add_dependency "ffi", "~> 1.0"
22
+
21
23
  gem.add_development_dependency "sys-proctable", "~> 1.0"
22
24
  gem.add_development_dependency "rake", "~> 10.1"
23
25
  gem.add_development_dependency "test-unit", "~> 3.1.0"
@@ -3,11 +3,19 @@ require 'bigdecimal'
3
3
 
4
4
  # Cribbed from Unicorn Worker Killer, thanks!
5
5
  class GetProcessMem
6
- KB_TO_BYTE = 1024 # 2**10 = 1024
7
- MB_TO_BYTE = 1_048_576 # 1024**2 = 1_048_576
8
- GB_TO_BYTE = 1_073_741_824 # 1024**3 = 1_073_741_824
6
+ private_class_method def self.number_to_bigdecimal(value)
7
+ BigDecimal(value)
8
+ end
9
+
10
+ private def number_to_bigdecimal(value)
11
+ self.class.send(:number_to_bigdecimal, value)
12
+ end
13
+
14
+ KB_TO_BYTE = number_to_bigdecimal 1024 # 2**10 = 1024
15
+ MB_TO_BYTE = number_to_bigdecimal 1_048_576 # 1024**2 = 1_048_576
16
+ GB_TO_BYTE = number_to_bigdecimal 1_073_741_824 # 1024**3 = 1_073_741_824
9
17
  CONVERSION = { "kb" => KB_TO_BYTE, "mb" => MB_TO_BYTE, "gb" => GB_TO_BYTE }
10
- ROUND_UP = BigDecimal.new("0.5")
18
+ ROUND_UP = number_to_bigdecimal "0.5"
11
19
  attr_reader :pid
12
20
 
13
21
  RUNS_ON_WINDOWS = Gem.win_platform?
@@ -23,6 +31,20 @@ class GetProcessMem
23
31
  include Sys
24
32
  end
25
33
 
34
+ RUNS_ON_DARWIN = Gem.platforms.detect do |p|
35
+ p.is_a?(Gem::Platform) && p.os == 'darwin'
36
+ end
37
+
38
+ if RUNS_ON_DARWIN
39
+ begin
40
+ require 'get_process_mem/darwin'
41
+ rescue LoadError => e
42
+ message = "Please add `ffi` to your Gemfile for darwin (macos) machines\n"
43
+ message << e.message
44
+ raise e, message
45
+ end
46
+ end
47
+
26
48
  def initialize(pid = Process.pid)
27
49
  @status_file = Pathname.new "/proc/#{pid}/status"
28
50
  @process_file = Pathname.new "/proc/#{pid}/smaps"
@@ -36,19 +58,20 @@ class GetProcessMem
36
58
 
37
59
  def bytes
38
60
  memory = linux_status_memory if linux?
61
+ memory ||= darwin_memory if RUNS_ON_DARWIN
39
62
  memory ||= ps_memory
40
63
  end
41
64
 
42
65
  def kb(b = bytes)
43
- (b/BigDecimal.new(KB_TO_BYTE)).to_f
66
+ (b/KB_TO_BYTE).to_f
44
67
  end
45
68
 
46
69
  def mb(b = bytes)
47
- (b/BigDecimal.new(MB_TO_BYTE)).to_f
70
+ (b/MB_TO_BYTE).to_f
48
71
  end
49
72
 
50
73
  def gb(b = bytes)
51
- (b/BigDecimal.new(GB_TO_BYTE)).to_f
74
+ (b/GB_TO_BYTE).to_f
52
75
  end
53
76
 
54
77
  def inspect
@@ -73,7 +96,7 @@ class GetProcessMem
73
96
  return if lines.empty?
74
97
  lines.reduce(0) do |sum, line|
75
98
  line.match(/(?<value>(\d*\.{0,1}\d+))\s+(?<unit>\w\w)/) do |m|
76
- value = BigDecimal.new(m[:value]) + ROUND_UP
99
+ value = number_to_bigdecimal(m[:value]) + ROUND_UP
77
100
  unit = m[:unit].downcase
78
101
  sum += CONVERSION[unit] * value
79
102
  end
@@ -88,9 +111,14 @@ class GetProcessMem
88
111
  def ps_memory
89
112
  if RUNS_ON_WINDOWS
90
113
  size = ProcTable.ps(pid).working_set_size
91
- BigDecimal.new(size)
114
+ number_to_bigdecimal(size)
92
115
  else
93
- KB_TO_BYTE * BigDecimal.new(`ps -o rss= -p #{pid}`)
116
+ mem = `ps -o rss= -p #{pid}`
117
+ KB_TO_BYTE * number_to_bigdecimal(mem == "" ? 0 : mem)
94
118
  end
95
119
  end
120
+
121
+ def darwin_memory
122
+ Darwin.resident_size
123
+ end
96
124
  end
@@ -0,0 +1,53 @@
1
+ require 'ffi'
2
+
3
+ class GetProcessMem
4
+ class Darwin
5
+ extend FFI::Library
6
+ ffi_lib 'c'
7
+ attach_function :mach_task_self, [], :__darwin_mach_port_t
8
+ attach_function :task_info,
9
+ [
10
+ :__darwin_mach_port_t,
11
+ :int, # return selector
12
+ :pointer, #pointer to task info
13
+ :pointer, #pointer to int (size of structure / bytes filled out)
14
+ ],
15
+ :int
16
+
17
+ class IntPtr < FFI::Struct
18
+ layout :value, :int
19
+ end
20
+
21
+ class TaskInfo < FFI::Struct
22
+ layout :suspend_count, :int32,
23
+ :virtual_size, :uint64,
24
+ :resident_size, :uint64,
25
+ :user_time, :uint64,
26
+ :system_time, :uint64,
27
+ :policy, :int32
28
+ end
29
+
30
+ MACH_TASK_BASIC_INFO = 20
31
+ MACH_TASK_BASIC_INFO_COUNT = TaskInfo.size / FFI.type_size(:uint)
32
+
33
+ class << self
34
+ def resident_size
35
+ mach_task_info[:resident_size]
36
+ end
37
+
38
+ private
39
+
40
+ def mach_task_info
41
+ data = TaskInfo.new
42
+ out_count = IntPtr.new
43
+ out_count[:value] = MACH_TASK_BASIC_INFO_COUNT
44
+ result = task_info(mach_task_self, MACH_TASK_BASIC_INFO, data, out_count)
45
+ if result == 0
46
+ data
47
+ else
48
+ raise "task_info returned #{result}"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  class GetProcessMem
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -16,7 +16,7 @@ class GetProcessMemTest < Test::Unit::TestCase
16
16
  def test_linux_smap
17
17
  delta = 1
18
18
  bytes = @mem.linux_memory(fixture_path("heroku-bash-smap"))
19
- assert_in_delta BigDecimal.new("2122240.0"), bytes, delta
19
+ assert_in_delta BigDecimal("2122240.0"), bytes, delta
20
20
  end
21
21
 
22
22
  def test_linux_status
@@ -26,7 +26,7 @@ class GetProcessMemTest < Test::Unit::TestCase
26
26
 
27
27
  def test_conversions
28
28
  bytes = 0
29
- delta = BigDecimal.new("0.0000001")
29
+ delta = BigDecimal("0.0000001")
30
30
  assert_in_delta 0.0, @mem.kb(bytes), delta
31
31
  assert_in_delta 0.0, @mem.mb(bytes), delta
32
32
  assert_in_delta 0.0, @mem.gb(bytes), delta
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: get_process_mem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2019-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: sys-proctable
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -68,6 +82,7 @@ files:
68
82
  - appveyor.yml
69
83
  - get_process_mem.gemspec
70
84
  - lib/get_process_mem.rb
85
+ - lib/get_process_mem/darwin.rb
71
86
  - lib/get_process_mem/version.rb
72
87
  - test/fixtures/heroku-bash-smap
73
88
  - test/fixtures/heroku-bash-status
@@ -92,8 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
107
  - !ruby/object:Gem::Version
93
108
  version: '0'
94
109
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.5.1
110
+ rubygems_version: 3.0.3
97
111
  signing_key:
98
112
  specification_version: 4
99
113
  summary: Use GetProcessMem to find out the amount of RAM used by any process