get_process_mem 0.2.1 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
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: 9bb77afa418ea02d1e7d7416d88fc9706de5c581c84aa22d3199c405e406404e
4
+ data.tar.gz: 1ee05474ce71701a823828452ee0d657422f790aafc8a0cdd7b2259843af4f0f
5
5
  SHA512:
6
- metadata.gz: be1f8d9ddc800b00e67054d2d218e2cc6bbdc9a5972c5491941f481ff8e693d9d423315dad04ef1de9e5ab61a372e02fb5a409fbbcae10a3b4f2b23791849e58
7
- data.tar.gz: c8b6e1fb05a95d651e60f86255e0b9c72089374922e1a434ed047489a800217f7d512f00188542b1b0f59e1c9b190ad97afb05cc8d53429a18a72b120e1481ed
6
+ metadata.gz: d70576115a29294f6e0bf456f5992b9f1aa208d1c0855ccf15492c93824ac602c8911bca6b819723d4f2a1faeb25828afe453ff5c1f3bb3715e632eae7b339e7
7
+ data.tar.gz: cd0c1482f61ef34933cbe87afcbf281debd359b6f37e476dc765196b791c61fa768aab5f9a5f0eb98df0026ac174d3036633bce4135e5e7c650ff40f23d259a3
@@ -0,0 +1,12 @@
1
+ name: Check Changelog
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v1
10
+ - name: Check that CHANGELOG is touched
11
+ run: |
12
+ cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md
@@ -1,18 +1,20 @@
1
1
  language: ruby
2
+ os:
3
+ - linux
4
+ - osx
2
5
 
3
6
  before_install:
4
- - gem install bundler -v 1.12.5
7
+ - gem install bundler -v 1.17.3
5
8
 
6
9
  rvm:
7
- - 1.9.3
8
- - 2.0.0
9
- - 2.1.0
10
+ - 2.2
11
+ - 2.6
10
12
  - ruby-head
11
- - jruby-19mode
12
- - rbx-19mode
13
+ - jruby-head
14
+ - truffleruby
13
15
 
14
16
  matrix:
15
17
  allow_failures:
16
18
  - rvm: ruby-head
17
- - rvm: rbx-19mode
18
- - rvm: jruby-19mode
19
+ - rvm: jruby-head
20
+ - rvm: truffleruby
@@ -1,6 +1,28 @@
1
+ ## Master - unreleased
2
+
3
+ ## 0.2.6
4
+
5
+ - Support returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/41)
6
+
7
+ ## 0.2.5
8
+
9
+ - Use new sys-proctable interface (https://github.com/schneems/get_process_mem/pull/36)
10
+
11
+ ## 0.2.4
12
+
13
+ - Use FFI to speed up memory lookup on Mac (darwin) by roughly 12x (#32)
14
+
15
+ ## 0.2.3
16
+
17
+ - Silence BigDecimal deprecation warning under Ruby 2.5 (#26)
18
+
19
+ ## 0.2.2
20
+
21
+ - Fix support for Ruby 2.4 (#23)
22
+
1
23
  ## 0.2.1
2
24
 
3
- - Windows support.
25
+ - ???
4
26
 
5
27
  ## 0.2.0
6
28
 
@@ -17,4 +39,4 @@
17
39
 
18
40
  ## 0.0.1
19
41
 
20
- - Initial
42
+ - Initial
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Get Process Memory
2
2
 
3
- [![Build Status](https://travis-ci.org/schneems/get_process_mem.png?branch=master)](https://travis-ci.org/schneems/get_process_mem)
3
+ [![Build Status](https://travis-ci.org/schneems/get_process_mem.svg?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,7 +18,9 @@ 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_development_dependency "sys-proctable", "~> 1.0"
22
- gem.add_development_dependency "rake", "~> 10.1"
23
- gem.add_development_dependency "test-unit", "~> 3.1.0"
21
+ gem.add_dependency "ffi", "~> 1.0"
22
+
23
+ gem.add_development_dependency "sys-proctable", "~> 1.2"
24
+ gem.add_development_dependency "rake", "~> 12"
25
+ gem.add_development_dependency "test-unit", "~> 3"
24
26
  end
@@ -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 && Process.pid == pid
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
@@ -87,10 +110,15 @@ class GetProcessMem
87
110
  # in low memory situations
88
111
  def ps_memory
89
112
  if RUNS_ON_WINDOWS
90
- size = ProcTable.ps(pid).working_set_size
91
- BigDecimal.new(size)
113
+ size = ProcTable.ps(pid: pid).working_set_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.6"
3
3
  end
@@ -1,11 +1,20 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class GetProcessMemTest < Test::Unit::TestCase
4
-
5
4
  def setup
6
5
  @mem = GetProcessMem.new
7
6
  end
8
7
 
8
+ def test_different_pid_returns_different_memory
9
+ pid = Process.spawn("tail -f Gemfile")
10
+
11
+ other_mem = GetProcessMem.new(pid)
12
+ assert @mem.kb > other_mem.kb
13
+ ensure
14
+ Process.kill('TERM', pid) if pid
15
+ Process.wait(pid) if pid
16
+ end
17
+
9
18
  def test_seems_to_work
10
19
  assert @mem.kb > 0
11
20
  assert @mem.mb > 0
@@ -16,7 +25,7 @@ class GetProcessMemTest < Test::Unit::TestCase
16
25
  def test_linux_smap
17
26
  delta = 1
18
27
  bytes = @mem.linux_memory(fixture_path("heroku-bash-smap"))
19
- assert_in_delta BigDecimal.new("2122240.0"), bytes, delta
28
+ assert_in_delta BigDecimal("2122240.0"), bytes, delta
20
29
  end
21
30
 
22
31
  def test_linux_status
@@ -26,7 +35,7 @@ class GetProcessMemTest < Test::Unit::TestCase
26
35
 
27
36
  def test_conversions
28
37
  bytes = 0
29
- delta = BigDecimal.new("0.0000001")
38
+ delta = BigDecimal("0.0000001")
30
39
  assert_in_delta 0.0, @mem.kb(bytes), delta
31
40
  assert_in_delta 0.0, @mem.mb(bytes), delta
32
41
  assert_in_delta 0.0, @mem.gb(bytes), delta
metadata CHANGED
@@ -1,57 +1,71 @@
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.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2020-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sys-proctable
14
+ name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
- type: :development
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sys-proctable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.1'
47
+ version: '12'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.1'
54
+ version: '12'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: test-unit
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: 3.1.0
61
+ version: '3'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: 3.1.0
68
+ version: '3'
55
69
  description: " Get memory usage of a process in Ruby "
56
70
  email:
57
71
  - richard.schneeman+rubygems@gmail.com
@@ -59,6 +73,7 @@ executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
76
+ - ".github/workflows/check_changelog.yml"
62
77
  - ".gitignore"
63
78
  - ".travis.yml"
64
79
  - CHANGELOG.md
@@ -68,6 +83,7 @@ files:
68
83
  - appveyor.yml
69
84
  - get_process_mem.gemspec
70
85
  - lib/get_process_mem.rb
86
+ - lib/get_process_mem/darwin.rb
71
87
  - lib/get_process_mem/version.rb
72
88
  - test/fixtures/heroku-bash-smap
73
89
  - test/fixtures/heroku-bash-status
@@ -77,7 +93,7 @@ homepage: https://github.com/schneems/get_process_mem
77
93
  licenses:
78
94
  - MIT
79
95
  metadata: {}
80
- post_install_message:
96
+ post_install_message:
81
97
  rdoc_options: []
82
98
  require_paths:
83
99
  - lib
@@ -92,9 +108,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
108
  - !ruby/object:Gem::Version
93
109
  version: '0'
94
110
  requirements: []
95
- rubyforge_project:
96
- rubygems_version: 2.5.1
97
- signing_key:
111
+ rubygems_version: 3.1.2
112
+ signing_key:
98
113
  specification_version: 4
99
114
  summary: Use GetProcessMem to find out the amount of RAM used by any process
100
115
  test_files: