get_process_mem 0.2.2 → 0.2.7

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
2
  SHA256:
3
- metadata.gz: 94fcbfe333ae0cfed19b0152cc0ac30185ade620dfdee8602c650d2af0e2f335
4
- data.tar.gz: 1ae8b971296e8707f11709c351e914b24dcf78cdcb35a137b43e24ac6f228bce
3
+ metadata.gz: 06a96e8d978fd95bcf546a1e5e8bbc01cc10635d50b2f87639eb9c1f8c7f4f76
4
+ data.tar.gz: 6c941ae4f0301ff698b9be4ba75597537ed3ae5a11bf9295ab81144ef8435047
5
5
  SHA512:
6
- metadata.gz: 84f9147a2c2ac5de19db50ef12a0d0ce281f0e17c616d7ddcda88bef6660b4e13b6c588d746330d566fffc6d9af657fe3d630ca52307b3a40147dc7ce26e2e77
7
- data.tar.gz: 2db59b624cd6ed098685b8851eb4776c36c83ec63da54e6da5b885c562311f37ee2792c9de59bad1b7fa138aff7f90a1e2de84db5806c204330149736a8e47c5
6
+ metadata.gz: 3cdb2baad08676298249f006b12f0c61bd0fdc1e13902211e2e0c3ea965c39fee2edb2ad3d2ceb617dcf450738e765c60c7e748830d85c52b044fa0ad8a3c8db
7
+ data.tar.gz: 35d717cc39f85a902adaa8ea6028d969b40b89465bcc0d1578de4e97308fe890e77ce9ff06b68855253030b3ab26fa130e2e44be06b041368a39a4cb4bc300f8
@@ -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,22 @@
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:
18
+ - rvm: 2.2
19
+ if: os = osx
16
20
  - rvm: ruby-head
17
- - rvm: rbx-19mode
18
- - rvm: jruby-19mode
21
+ - rvm: jruby-head
22
+ - rvm: truffleruby
@@ -1,3 +1,25 @@
1
+ ## HEAD (unreleased)
2
+
3
+ ## 0.2.7
4
+
5
+ - Native (faster) support for returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/42)
6
+
7
+ ## 0.2.6
8
+
9
+ - Support returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/41)
10
+
11
+ ## 0.2.5
12
+
13
+ - Use new sys-proctable interface (https://github.com/schneems/get_process_mem/pull/36)
14
+
15
+ ## 0.2.4
16
+
17
+ - Use FFI to speed up memory lookup on Mac (darwin) by roughly 12x (#32)
18
+
19
+ ## 0.2.3
20
+
21
+ - Silence BigDecimal deprecation warning under Ruby 2.5 (#26)
22
+
1
23
  ## 0.2.2
2
24
 
3
25
  - Fix support for Ruby 2.4 (#23)
@@ -21,4 +43,4 @@
21
43
 
22
44
  ## 0.0.1
23
45
 
24
- - Initial
46
+ - Initial
data/README.md CHANGED
@@ -1,6 +1,6 @@
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
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)
5
5
 
6
6
  Do you need to get the memory usage of a process? Great because this library does that.
@@ -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
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,11 +110,17 @@ 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
116
  mem = `ps -o rss= -p #{pid}`
94
- KB_TO_BYTE * BigDecimal.new(mem == "" ? 0 : mem)
117
+ KB_TO_BYTE * number_to_bigdecimal(mem == "" ? 0 : mem)
95
118
  end
96
119
  end
120
+
121
+ def darwin_memory
122
+ Darwin.resident_size(pid)
123
+ rescue Errno::EPERM
124
+ nil
125
+ end
97
126
  end
@@ -0,0 +1,63 @@
1
+ require 'ffi'
2
+
3
+ class GetProcessMem
4
+ class Darwin
5
+ extend FFI::Library
6
+ ffi_lib 'proc'
7
+
8
+
9
+ class TaskInfo < FFI::Struct
10
+ layout :pti_virtual_size, :uint64,
11
+ :pti_resident_size, :uint64,
12
+ :pti_total_user, :uint64,
13
+ :pti_total_system, :uint64,
14
+ :pti_threads_user, :uint64,
15
+ :pti_threads_system, :uint64,
16
+ :pti_policy, :int32,
17
+ :pti_faults, :int32,
18
+ :pti_pageins, :int32,
19
+ :pti_cow_faults, :int32,
20
+ :pti_messages_sent, :int32,
21
+ :pti_messages_received, :int32,
22
+ :pti_syscalls_mach, :int32,
23
+ :pti_syscalls_unix, :int32,
24
+ :pti_csw, :int32,
25
+ :pti_threadnum, :int32,
26
+ :pti_numrunning, :int32,
27
+ :pti_priority, :int32
28
+
29
+ end
30
+
31
+
32
+ attach_function :proc_pidinfo,
33
+ [
34
+ :int, #pid
35
+ :int, # flavour
36
+ :uint64, #arg, not needed for this selector
37
+ TaskInfo.by_ref, #output buffer
38
+ :int, #size of buffer
39
+ ],
40
+ :int
41
+
42
+
43
+ PROC_PIDTASKINFO = 4 #from sys/proc_info.h
44
+
45
+ class << self
46
+ def resident_size(pid)
47
+ get_proc_pidinfo(pid)[:pti_resident_size]
48
+ end
49
+
50
+ private
51
+
52
+ def get_proc_pidinfo(pid)
53
+ data = TaskInfo.new
54
+ result = proc_pidinfo(pid, PROC_PIDTASKINFO, 0, data, TaskInfo.size)
55
+ if result == TaskInfo.size
56
+ data
57
+ else
58
+ raise SystemCallError.new("proc_pidinfo returned #{result}", FFI.errno);
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,3 +1,3 @@
1
1
  class GetProcessMem
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.7"
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.2
4
+ version: 0.2.7
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: 2018-05-11 00:00:00.000000000 Z
11
+ date: 2020-08-27 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.7.6
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: