mem_kit 0.1.0

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: bc1ea7ebd495b16224fcfc592be90704fc3001c4
4
+ data.tar.gz: 2b28d1f7aba9d37d2d9afd1d6c7904359d1f452c
5
+ SHA512:
6
+ metadata.gz: db2754e19687c1eedb1628253feee029d62d43507bf2516b8762e4a00000387384e1d5903432945cbbd04dde1714891c37e500aa9891f1faee4160b72e62a282
7
+ data.tar.gz: c0a8aae0420864261919bca69d9687281a3d3f740c09bc9cc1de39381b244621979f81c01b4024bdddce74ab513766aeda1bcd777999c64b17f56b28d2d373ea
@@ -0,0 +1,46 @@
1
+ module MemKit
2
+ class Cleaner
3
+
4
+ def self.start(logger: nil, interval: 120)
5
+ if logger == nil
6
+ logger = Logger.new(STDOUT)
7
+ end
8
+
9
+ logger.debug("[MemKit::Cleaner] - Starting Cleaner. Interval: #{interval} seconds.")
10
+
11
+ %w'INT TERM'.each do |sig|
12
+ Signal.trap(sig) {
13
+ stop
14
+ }
15
+ end
16
+
17
+ if @is_running == true
18
+ raise "[MemKit::Cleaner] - Profiler is already running."
19
+ end
20
+
21
+ @is_running = true
22
+
23
+ @thread = Thread.new do
24
+
25
+ while @is_running == true do
26
+
27
+ GC.start
28
+
29
+ sleep(interval)
30
+
31
+ end
32
+
33
+ end
34
+
35
+ return @thread
36
+
37
+ end
38
+
39
+ def self.stop
40
+ @is_running = false
41
+ if @thread != nil
42
+ Thread.kill(@thread)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,91 @@
1
+ module MemKit
2
+ class Profiler
3
+
4
+ def self.start(logger: nil, interval: 240, limit: nil)
5
+
6
+ if logger == nil
7
+ logger = Logger.new(STDOUT)
8
+ end
9
+
10
+ logger.debug("[MemKit::Profiler] - Starting Memory Profiling. Interval: #{interval} seconds | Limit: #{limit || 'N/A'}.")
11
+
12
+ %w'INT TERM'.each do |sig|
13
+ Signal.trap(sig) {
14
+ stop
15
+ }
16
+ end
17
+
18
+ if @is_running == true
19
+ raise "[MemKit::Profiler] - Profiler is already running."
20
+ end
21
+
22
+ @is_running = true
23
+
24
+ require 'objspace'
25
+
26
+ @thread = Thread.new do
27
+
28
+ while @is_running == true do
29
+
30
+ total_memory_size = ObjectSpace.memsize_of_all
31
+
32
+ result = { total_memory_usage: format_size(total_memory_size), total_allocations: ObjectSpace.each_object{}, objects: [] }
33
+
34
+ ObjectSpace.each_object do |o|
35
+ update_object(o, result, total_memory_size)
36
+ end
37
+
38
+ result[:objects].sort! { |a,b| b[:bytes] <=> a[:bytes] }
39
+
40
+ if limit != nil
41
+ result[:objects] = result[:objects][0, limit]
42
+ end
43
+
44
+ logger.debug("[MemKit::Profiler}] - #{JSON.dump(result)}")
45
+
46
+ sleep(interval)
47
+
48
+ end
49
+
50
+ end
51
+
52
+ return @thread
53
+
54
+ end
55
+
56
+ def self.stop
57
+ @is_running = false
58
+ if @thread != nil
59
+ Thread.kill(@thread)
60
+ end
61
+ end
62
+
63
+ def self.format_size(bytes)
64
+ value = bytes
65
+ unit = 'Bytes'
66
+ if bytes >= 100000
67
+ #format as MB
68
+ value = bytes.to_f / 1000.0 / 1000.0
69
+ unit = 'MB'
70
+ elsif bytes >= 500
71
+ #format as KB
72
+ value = bytes.to_f / 1000.0
73
+ unit = 'KB'
74
+ end
75
+ return "#{value.round(2)} #{unit}"
76
+ end
77
+
78
+ def self.update_object(object, result, total_memory_size)
79
+ obj = result[:objects].detect { |o| o[:klass] == object.class }
80
+ if obj == nil
81
+ mem_usage = ObjectSpace.memsize_of_all(object.class)
82
+ obj = { klass: object.class, allocation_count: 1, memory_usage_size: format_size(mem_usage), memory_usage_percentage: "#{(mem_usage.to_f / total_memory_size.to_f * 100.0).round(2)}%", bytes: mem_usage }
83
+ result[:objects].push(obj)
84
+ else
85
+ obj[:allocation_count] += 1
86
+ end
87
+ return obj
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,3 @@
1
+ module MemKit
2
+ VERSION = "0.1.0"
3
+ end
data/lib/mem_kit.rb ADDED
@@ -0,0 +1,5 @@
1
+ require_relative 'mem_kit/version'
2
+ require_relative 'mem_kit/profiler'
3
+ require_relative 'mem_kit/cleaner'
4
+ require 'json'
5
+
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mem_kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - vaughanbrittonsage
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Toolkit for working with Memory, Profiling & Cleanup
84
+ email:
85
+ - vaughan.britton@sage.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - lib/mem_kit.rb
91
+ - lib/mem_kit/cleaner.rb
92
+ - lib/mem_kit/profiler.rb
93
+ - lib/mem_kit/version.rb
94
+ homepage: https://github.com/vaughanbrittonsage/mem_kit
95
+ licenses:
96
+ - MIT
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubyforge_project:
114
+ rubygems_version: 2.5.1
115
+ signing_key:
116
+ specification_version: 4
117
+ summary: Toolkit for working with Memory, Profiling & Cleanup
118
+ test_files: []