get_process_mem 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5cca1e4bc8403f7fea51433ecdc8471f65fdf823
4
+ data.tar.gz: 3dfb46b8047e464e46f3bee70826b6ed9114522e
5
+ SHA512:
6
+ metadata.gz: dbf95661e13258be18215581177f9f7f2beb949dd5f389ba75b18d60af72b877bfcb2668a53ac641c59fc2ab26b34a6e0320a451c1a346c5191b07596d5f6714
7
+ data.tar.gz: 77cbc7d341d3e8e40e573886f57d8be80801e37d8c55d813ca0853655b1ef9d205bf838cfda59015bfa761a9216a0896c5bbbdd63eb303c98618ae62a0ef78ac
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - ruby-head
7
+ - jruby-19mode
8
+ - rbx-19mode
9
+
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: ruby-head
13
+ - rvm: rbx-19mode
14
+ - rvm: jruby-19mode
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,16 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ get_process_mem (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.1.1)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ get_process_mem!
16
+ rake (~> 10.1)
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # Get Process Memory
2
+
3
+ [![Build Status](https://travis-ci.org/schneems/get_process_memory.png?branch=master)](https://travis-ci.org/schneems/get_process_memory)
4
+
5
+ Do you need to get the memory useage of a process? Great because this library does that.
6
+
7
+ ## Install
8
+
9
+ In your `Gemfile` add
10
+
11
+ ```ruby
12
+ gem 'get_process_mem'
13
+ ```
14
+
15
+ then run `$ bundle install`
16
+
17
+
18
+ ## Use It
19
+
20
+ Get the current process memory usage:
21
+
22
+ ```ruby
23
+ puts mem = GetProcessMem.new.inspect
24
+ #<GetProcessMem @mb=24.28125 @gb=0.023712158203125 @kb=24864.0 @bytes=25460736 >
25
+ mem.bytes # => 25460736
26
+ mem.kb # => 24864.0
27
+ mem.mb # => 24.28125
28
+ mem.gb # => 0.023712158203125
29
+ ```
30
+
31
+ Note: all numeric values returned as a float except bytes which is an integer.
32
+
33
+ Get memory usage of another process:
34
+
35
+ ```ruby
36
+ `echo 'nothing to see here' > tmplogf`
37
+ pid = Process.spawn('tail -f tmplog')
38
+ mem = GetProcessMem.new(pid)
39
+ puts mem.inspect
40
+ # => #<GetProcessMem @mb=0.48828125 @gb=0.000476837158203125 @kb=500.0 @bytes=512000 >
41
+
42
+ Process.kill('TERM', pid)
43
+ Process.wait(pid)
44
+
45
+ mem.inspect
46
+ # => "#<GetProcessMem @mb=0.0 @gb=0.0 @kb=0.0 @bytes=0>"
47
+ `rm tmplog`
48
+ ```
49
+
50
+ For memory size we return the RSS or the [Resident Set Size](http://en.wikipedia.org/wiki/Resident_set_size), basically how much memory the program takes up in RAM at the time. It's all I needed for the project.
51
+
52
+
53
+
54
+ ## License
55
+
56
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bundler/gem_tasks'
4
+
5
+ require 'rake'
6
+ require 'rake/testtask'
7
+
8
+ task :default => [:test]
9
+
10
+ test_task = Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib'
12
+ t.libs << 'test'
13
+ t.pattern = 'test/**/*_test.rb'
14
+ t.verbose = false
15
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'get_process_mem/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "get_process_mem"
8
+ gem.version = GetProcessMem::VERSION
9
+ gem.authors = ["Richard Schneeman"]
10
+ gem.email = ["richard.schneeman+rubygems@gmail.com"]
11
+ gem.description = %q{ Get memory usage of a process in Ruby }
12
+ gem.summary = %q{ Use GetProcessMem to find out the amount of RAM used by any process }
13
+ gem.homepage = "https://github.com/schneems/get_process_mem"
14
+ gem.license = "MIT"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_development_dependency "rake", "~> 10.1"
22
+ end
@@ -0,0 +1,87 @@
1
+ require 'pathname'
2
+
3
+ # Cribbed from Unicorn Worker Killer, thanks!
4
+ class GetProcessMem
5
+ KB_TO_BYTE = 1024 # 2**10 = 1024
6
+ MB_TO_BYTE = 1_048_576 # 1024**2 = 1_048_576
7
+ GB_TO_BYTE = 1_073_741_824 # 1024**3 = 1_073_741_824
8
+ CONVERSION = { "kb" => KB_TO_BYTE, "mb" => MB_TO_BYTE, "gb" => GB_TO_BYTE}
9
+ MEM_TYPE = "rss" # http://en.wikipedia.org/wiki/Resident_set_size
10
+ attr_reader :pid
11
+
12
+ def initialize(pid = Process.pid, mem_type = MEM_TYPE)
13
+ @process_file = Pathname.new "/proc/#{pid}/status"
14
+ @pid = pid
15
+ @linux = @process_file.exist?
16
+ self.mem_type = mem_type
17
+ end
18
+
19
+ def linux?
20
+ @linux
21
+ end
22
+
23
+ def bytes
24
+ memory = linux_memory if linux?
25
+ memory ||= ps_memory
26
+ end
27
+
28
+ def kb(b = bytes)
29
+ b.to_f/KB_TO_BYTE
30
+ end
31
+
32
+ def mb(b = bytes)
33
+ b.to_f/MB_TO_BYTE
34
+ end
35
+
36
+ def gb(b = bytes)
37
+ b.to_f/GB_TO_BYTE
38
+ end
39
+
40
+ def refresh
41
+ @bytes = nil
42
+ end
43
+
44
+ def inspect
45
+ b = bytes
46
+ "#<#{self.class}:0x%08x @mb=#{mb b } @gb=#{gb b } @kb=#{kb b } @bytes=#{b}>" % (object_id * 2)
47
+ end
48
+
49
+ def mem_type
50
+ @mem_type
51
+ end
52
+
53
+ def mem_type=(mem_type)
54
+ @mem_type = mem_type.downcase
55
+ end
56
+
57
+ private
58
+
59
+ # Pull memory from `ps` command, takes more resources and can freeze
60
+ # in low memory situations
61
+ def ps_memory
62
+ KB_TO_BYTE * `ps -o #{mem_type_for_ps}= -p #{pid}`.to_i
63
+ end
64
+
65
+ def mem_type_for_ps
66
+ mem_type
67
+ end
68
+
69
+ def mem_type_for_linux
70
+ case mem_type
71
+ when 'rss'
72
+ 'VmRSS'
73
+ end
74
+ end
75
+
76
+ # linux stores memory info in a file "/proc/#{pid}/status"
77
+ # If it's available it uses less resources than shelling out to ps
78
+ def linux_memory
79
+ line = @process_file.read.each_line.detect {|line| line.include? mem_type_for_linux }
80
+ return unless line
81
+ return unless (name, value, unit = line.split(nil)).length == 3
82
+ multiplier = CONVERSION[unit.downcase]
83
+ multiplier * value.to_i
84
+ end
85
+ end
86
+
87
+ GetProcessMem
@@ -0,0 +1,3 @@
1
+ class GetProcessMem
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class GetProcessMemTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @mem = GetProcessMem.new
7
+ end
8
+
9
+ def test_seems_to_work
10
+ assert @mem.kb > 0
11
+ assert @mem.mb > 0
12
+ assert @mem.gb > 0
13
+ assert @mem.bytes > 0
14
+ end
15
+
16
+ def test_conversions
17
+ bytes = 0
18
+ assert_equal 0.0, @mem.kb(bytes)
19
+ assert_equal 0.0, @mem.mb(bytes)
20
+ assert_equal 0.0, @mem.gb(bytes)
21
+
22
+ # kb
23
+ bytes = 1024
24
+ assert_equal 1.0, @mem.kb(bytes)
25
+ assert_equal 0.0009765625, @mem.mb(bytes)
26
+ assert_equal 9.5367431640625e-07, @mem.gb(bytes)
27
+
28
+ # mb
29
+ bytes = 1_048_576
30
+ assert_equal 1024.0, @mem.kb(bytes)
31
+ assert_equal 1.0, @mem.mb(bytes)
32
+ assert_equal 0.0009765625, @mem.gb(bytes)
33
+
34
+ # gb
35
+ bytes = 1_073_741_824
36
+ assert_equal 1048576.0, @mem.kb(bytes)
37
+ assert_equal 1024.0, @mem.mb(bytes)
38
+ assert_equal 1.0, @mem.gb(bytes)
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ Bundler.require
2
+
3
+ require 'get_process_mem'
4
+ require 'test/unit'
5
+
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: get_process_mem
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Richard Schneeman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '10.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '10.1'
27
+ description: " Get memory usage of a process in Ruby "
28
+ email:
29
+ - richard.schneeman+rubygems@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".gitignore"
35
+ - ".travis.yml"
36
+ - Gemfile
37
+ - Gemfile.lock
38
+ - README.md
39
+ - Rakefile
40
+ - get_process_mem.gemspec
41
+ - lib/get_process_mem.rb
42
+ - lib/get_process_mem/version.rb
43
+ - test/get_process_mem_test.rb
44
+ - test/test_helper.rb
45
+ homepage: https://github.com/schneems/get_process_mem
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.2.0
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: Use GetProcessMem to find out the amount of RAM used by any process
69
+ test_files:
70
+ - test/get_process_mem_test.rb
71
+ - test/test_helper.rb
72
+ has_rdoc: