weasel-the-memory-watcher 1.1.0 → 1.2.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.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use ruby-1.8.7-p299@memory_watch --create
1
+ rvm use 1.9.3-p327@memory_watch --create
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  # A sample Gemfile
2
2
  source "http://rubygems.org"
3
- gem 'wrong'
4
- gem 'jeweler'
3
+
4
+ group :development do
5
+ gem 'jeweler'
6
+ end
data/LICENSE CHANGED
@@ -1,20 +1,15 @@
1
- Copyright (c) 2009 Curtis Schofield
2
1
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
2
+ Copyright (C) 2009,2010 Curtis Schofield
10
3
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
13
8
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
@@ -1,17 +1,22 @@
1
- = memory_watch
1
+ = Weasel
2
2
 
3
- Description goes here.
3
+ Simple memory monitor - used in production with passenger to limit uptime of a service using excessive memory - as happens with ruby-1.8.7 on non ree projects
4
4
 
5
- == Note on Patches/Pull Requests
6
-
7
- * Fork the project.
8
- * Make your feature addition or bug fix.
9
- * Add tests for it. This is important so I don't break it in a
10
- future version unintentionally.
11
- * Commit, do not mess with rakefile, version, or history.
12
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
- * Send me a pull request. Bonus points for topic branches.
5
+ see ./bin/weasel for all the arguments that it takes
14
6
 
15
- == Copyright
7
+ = Example
8
+
9
+ weasel --callback "%x{kill -USR1 #{pid.to_s}}" --watch 'Rails:' --num-cycles 3 --num-over-marks 2 --callback-message 'sending SIGUSR1' --high-water-mb 440 --delay 1
10
+
11
+ the above will send sigusr1 (graceful exit) to all the processes matching 'Rails' that run over 440MB 2 out of 3
12
+ samples.
13
+
14
+ Samples are taken a total of 3 times with a delay of 1 second between them.
15
+
16
+ Put this in a cronjob to run every minute and you have a very simple, robust way to reap overmemory processes.
17
+
18
+ You can also combine this nicely with services that use daemontools if you don't want to write complex restart / shutdown code.
19
+
20
+ = Fin
16
21
 
17
22
  Copyright (c) 2010 Curtis Schofield. See LICENSE for details.
data/Rakefile CHANGED
@@ -47,12 +47,3 @@ task :test => :check_dependencies
47
47
 
48
48
  task :default => :test
49
49
 
50
- require 'rake/rdoctask'
51
- Rake::RDocTask.new do |rdoc|
52
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
53
-
54
- rdoc.rdoc_dir = 'rdoc'
55
- rdoc.title = "weasel #{version}"
56
- rdoc.rdoc_files.include('README*')
57
- rdoc.rdoc_files.include('lib/**/*.rb')
58
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.0
data/bin/weasel CHANGED
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ $:.push File.join(File.dirname(__FILE__),'..','lib')
1
3
  require 'optparse'
2
4
  require 'weasel'
3
5
  options = {}
@@ -1,15 +1,11 @@
1
-
2
1
  class MemoryWatch
3
2
  attr_accessor :watch_string,:high_water_pids,:callback,:high_water_mb,
4
3
  :delay,:num_cycles,:num_over_marks,:pids,:callback_message
5
4
 
6
5
  def initialize(options)
7
- self.callback = options[:callback] ||
8
- lambda {|pid| p pid}
9
- self.callback_message = (options[:callback_message] ||
10
- "Callback Triggered").strip
11
- self.watch_string = (options[:watch] ||
12
- "this poem is a pomme").strip
6
+ self.callback = options[:callback] || lambda {|pid| p pid}
7
+ self.callback_message = (options[:callback_message] || "Callback Triggered").strip
8
+ self.watch_string = Regexp.escape((options[:watch] || "this poem is a pomme").strip)
13
9
  self.delay = options[:delay] || 60
14
10
  self.num_cycles = options[:num_cycles] || 3
15
11
  self.num_over_marks = options[:num_over_marks] || 2
@@ -43,7 +39,7 @@ class MemoryWatch
43
39
  _run.each { |pid|
44
40
  memory_usage = %x{ps -o rss= -p #{pid}}.to_i # KB
45
41
  if memory_usage > self.high_water_mb * 1024 # 750MB
46
- puts "WARNING - Process #{pid} hit high water mark"
42
+ puts "WARNING - Process #{pid} hit high water mark at #{memory_usage / 1024}MB"
47
43
  self.high_water_pids[pid] ||= []
48
44
  self.high_water_pids[pid] << memory_usage
49
45
  end
@@ -1,11 +1,8 @@
1
1
  require 'rubygems'
2
+ require 'bundler/setup'
2
3
  require 'test/unit'
3
- require "bundler/setup"
4
- require 'wrong/adapters/test_unit'
5
4
 
6
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
7
  require 'memory_watch'
9
-
10
- class Test::Unit::TestCase
11
- end
8
+ class Test::Unit::TestCase; end
@@ -1,21 +1,26 @@
1
1
  require 'helper'
2
2
  class TestMemoryWatch < Test::Unit::TestCase
3
- def test_watches_self
4
- cmd = %q{ruby ./bin/weasel --delay 999999 --num_cycles 9900000099}
5
- pid = fork { %x{#{cmd}} }
3
+ def setup
4
+ @cmd = %q{ruby ./bin/weasel --delay 999999 --num_cycles 9900000099}
5
+ pid = fork { %x{#{@cmd}} }
6
6
  Process.detach(pid)
7
- wm = MemoryWatch.new(:watch => cmd , :high_water_mb => 0.01,:delay => 0.1, :num_cycles => 1)
8
- wm.cycle
9
- assert {
10
- wm.high_water_pids.size == 1
11
- }
12
- wm.pids.each do |pid|
7
+ end
8
+
9
+ def teardown
10
+ @wm.pids.each do |pid|
13
11
  %x{kill -9 #{pid}}
14
12
  end
15
13
  end
14
+
15
+ def test_watches_self
16
+ @wm = MemoryWatch.new(:watch => @cmd , :high_water_mb => 0.02,:delay => 0.1, :num_cycles => 1)
17
+ @wm.cycle
18
+ assert_equal 1, @wm.high_water_pids.size
19
+ end
20
+
16
21
  def test_runs_callback
17
22
  test_magiggy = false
18
- wm = MemoryWatch.new(:watch => File.basename(__FILE__),
23
+ @wm = MemoryWatch.new(:watch => @cmd,
19
24
  :high_water_mb => 0,
20
25
  :num_cycles => 1,
21
26
  :delay => 0.01,
@@ -24,10 +29,7 @@ class TestMemoryWatch < Test::Unit::TestCase
24
29
  test_magiggy = pid
25
30
  },
26
31
  :callback_message => 'Message')
27
- wm.cycle
28
- assert {
29
- wm.high_water_pids.include? test_magiggy
30
- }
32
+ @wm.cycle
33
+ assert_includes @wm.high_water_pids, test_magiggy
31
34
  end
32
35
  end
33
-
metadata CHANGED
@@ -1,76 +1,58 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: weasel-the-memory-watcher
3
- version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
6
- segments:
7
- - 1
8
- - 1
9
- - 0
10
- version: 1.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Curtis Schofield
14
9
  - www.goodreads.com
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2010-11-22 00:00:00 -08:00
20
- default_executable: weasel
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- type: :runtime
24
- prerelease: false
25
- name: wrong
26
- version_requirements: &id001 !ruby/object:Gem::Requirement
27
- none: false
28
- requirements:
29
- - - ">="
30
- - !ruby/object:Gem::Version
31
- hash: 3
32
- segments:
33
- - 0
34
- version: "0"
35
- requirement: *id001
36
- - !ruby/object:Gem::Dependency
37
- type: :runtime
38
- prerelease: false
13
+ date: 2013-01-15 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
39
16
  name: jeweler
40
- version_requirements: &id002 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
41
18
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 3
46
- segments:
47
- - 0
48
- version: "0"
49
- requirement: *id002
50
- - !ruby/object:Gem::Dependency
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
51
23
  type: :development
52
24
  prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
53
32
  name: bundler
54
- version_requirements: &id003 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
55
34
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
63
- requirement: *id003
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
64
47
  description: Dedicated to my dead cat and goodreads.com
65
48
  email: github.com@robotarmyma.de
66
- executables:
49
+ executables:
67
50
  - weasel
68
51
  extensions: []
69
-
70
- extra_rdoc_files:
52
+ extra_rdoc_files:
71
53
  - LICENSE
72
54
  - README.rdoc
73
- files:
55
+ files:
74
56
  - .document
75
57
  - .rvmrc
76
58
  - Gemfile
@@ -83,40 +65,31 @@ files:
83
65
  - lib/weasel.rb
84
66
  - test/helper.rb
85
67
  - test/test_memory_watch.rb
86
- has_rdoc: true
87
68
  homepage: http://github.com/robotarmy/weasel
88
69
  licenses: []
89
-
90
70
  post_install_message:
91
71
  rdoc_options: []
92
-
93
- require_paths:
72
+ require_paths:
94
73
  - lib
95
- required_ruby_version: !ruby/object:Gem::Requirement
74
+ required_ruby_version: !ruby/object:Gem::Requirement
96
75
  none: false
97
- requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- hash: 3
101
- segments:
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ segments:
102
81
  - 0
103
- version: "0"
104
- required_rubygems_version: !ruby/object:Gem::Requirement
82
+ hash: 686863708920555186
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
84
  none: false
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- hash: 3
110
- segments:
111
- - 0
112
- version: "0"
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
113
89
  requirements: []
114
-
115
90
  rubyforge_project:
116
- rubygems_version: 1.3.7
91
+ rubygems_version: 1.8.24
117
92
  signing_key:
118
93
  specification_version: 3
119
- summary: "Weasel : The memory wacher"
120
- test_files:
121
- - test/helper.rb
122
- - test/test_memory_watch.rb
94
+ summary: ! 'Weasel : The memory wacher'
95
+ test_files: []