unicorn_wrangler 0.5.3 → 0.6.0

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: f979de2b4204b8d70b777ef12a6c750df185d10c
4
- data.tar.gz: f036a306736461c42f300b7379a4abd16dc7706d
2
+ SHA256:
3
+ metadata.gz: cfcaf29cd13aac1fef51db90f04d6e531f8d7c8c3b944e02449c35dae44d8211
4
+ data.tar.gz: edc4413e67dad70cd6f18589499b06ac1bff9a6830a6494e3139a2ff6cb2cb18
5
5
  SHA512:
6
- metadata.gz: 8b054911dbcac21a4aa5b35fca0d3aaf7772af86faa04036250755161cba1f73392aa947fed586b1686a9a27a61c55fc97181e8ff90f80c27109638f0dc85c59
7
- data.tar.gz: c153c524c4e35210e28a4dd4ac57ec1fc80acb6a92a3ef75ebe5cd638d58888022b2b969e35bda0aba28f86a3bbaab7d93f2fce9a6d03f40dcc3de0055b94851
6
+ metadata.gz: 9a5b367df477b3ce85ab39d08cb07de5e21c207bc17b0a459e3e0e2f1124b8e83b03baac0ca9316680c1330ec989a05d2e727380bbe6a3bfb3ac9d2ae5fde633
7
+ data.tar.gz: 5f6675d7e9e086bb25bd1604949ad24326fc1e8a2f88c01e2f50cd570a3314e23edb73322cabd6cb696cf88e50e389a0ff9c82e44dbed2d8a04abdef0a012713
@@ -3,6 +3,7 @@
3
3
  # - runs GC out of band (does not block requests)
4
4
 
5
5
  require 'benchmark'
6
+ require 'unicorn_wrangler/rss_reader'
6
7
 
7
8
  module UnicornWrangler
8
9
  STATS_NAMESPACE = 'unicorn'
@@ -109,6 +110,7 @@ module UnicornWrangler
109
110
  def initialize(logger, stats)
110
111
  @logger = logger
111
112
  @stats = stats
113
+ @rss_reader = RssReader.new(logger: logger)
112
114
  end
113
115
 
114
116
  private
@@ -130,9 +132,9 @@ module UnicornWrangler
130
132
  UnicornWrangler.kill_worker
131
133
  end
132
134
 
133
- # expensive, do not run on every request
135
+ # RSS memory in MB. Can be expensive, do not run on every request
134
136
  def used_memory
135
- `ps -o rss= -p #{Process.pid}`.to_i / 1024
137
+ @rss_reader.rss
136
138
  end
137
139
 
138
140
  def report_status(status, reason, memory, requests, request_time, log_level = :debug)
@@ -0,0 +1,50 @@
1
+ # Read RSS based on the OS we are in. When in linux, we can read the proc status file and parse out
2
+ # the RSS which is much faster than forking+execing ps.
3
+ module UnicornWrangler
4
+ class RssReader
5
+ LINUX = RbConfig::CONFIG['host_os'].start_with?('linux')
6
+ PS_CMD = 'ps -o rss= -p %d'.freeze
7
+ VM_RSS = /^VmRSS:\s+(\d+)\s+(\w+)/
8
+ UNITS = {
9
+ b: 1024**0,
10
+ kb: 1024**1,
11
+ mb: 1024**2,
12
+ gb: 1024**3,
13
+ tb: 1024**4,
14
+ }.freeze
15
+
16
+ def initialize(logger:)
17
+ @logger = logger
18
+ end
19
+
20
+ # Returns RSS in megabytes; should work on Linux and Mac OS X
21
+ def rss(pid: Process.pid)
22
+ LINUX ? rss_linux(pid) : rss_posix(pid)
23
+ end
24
+
25
+ private
26
+
27
+ # Fork/exec ps and parse result.
28
+ # Should work on any system with POSIX ps.
29
+ # ~4ms
30
+ # returns kb but we want mb
31
+ def rss_posix(pid)
32
+ `#{PS_CMD % [pid]}`.to_i / 1024
33
+ end
34
+
35
+ # Read from /proc/$pid/status. Linux only.
36
+ # ~100x faster and doesn't incur significant memory cost.
37
+ # file returns variable units, we want mb
38
+ def rss_linux(pid)
39
+ File.read("/proc/#{pid}/status").match(VM_RSS) do |match|
40
+ value, magnitude = match[1].to_i, UNITS.fetch(match[2].downcase.to_sym)
41
+
42
+ value * magnitude / UNITS.fetch(:mb)
43
+ end
44
+ rescue
45
+ # If the given pid is dead, file will not be found
46
+ @logger.warn 'Failed to read RSS from /proc, falling back to exec+ps' if @logger
47
+ rss_posix(pid)
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module UnicornWrangler
2
- VERSION = "0.5.3"
2
+ VERSION = "0.6.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unicorn_wrangler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-12 00:00:00.000000000 Z
11
+ date: 2020-10-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: michael@grosser.it
@@ -18,6 +18,7 @@ extra_rdoc_files: []
18
18
  files:
19
19
  - MIT-LICENSE
20
20
  - lib/unicorn_wrangler.rb
21
+ - lib/unicorn_wrangler/rss_reader.rb
21
22
  - lib/unicorn_wrangler/version.rb
22
23
  homepage: https://github.com/grosser/unicorn_wrangler
23
24
  licenses:
@@ -31,15 +32,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
31
32
  requirements:
32
33
  - - ">="
33
34
  - !ruby/object:Gem::Version
34
- version: 2.2.0
35
+ version: 2.5.0
35
36
  required_rubygems_version: !ruby/object:Gem::Requirement
36
37
  requirements:
37
38
  - - ">="
38
39
  - !ruby/object:Gem::Version
39
40
  version: '0'
40
41
  requirements: []
41
- rubyforge_project:
42
- rubygems_version: 2.6.14.4
42
+ rubygems_version: 3.0.3
43
43
  signing_key:
44
44
  specification_version: 4
45
45
  summary: 'Unicorn: out of band GC / restart on max memory bloat / restart after X