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 +5 -5
- data/lib/unicorn_wrangler.rb +4 -2
- data/lib/unicorn_wrangler/rss_reader.rb +50 -0
- data/lib/unicorn_wrangler/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cfcaf29cd13aac1fef51db90f04d6e531f8d7c8c3b944e02449c35dae44d8211
|
4
|
+
data.tar.gz: edc4413e67dad70cd6f18589499b06ac1bff9a6830a6494e3139a2ff6cb2cb18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a5b367df477b3ce85ab39d08cb07de5e21c207bc17b0a459e3e0e2f1124b8e83b03baac0ca9316680c1330ec989a05d2e727380bbe6a3bfb3ac9d2ae5fde633
|
7
|
+
data.tar.gz: 5f6675d7e9e086bb25bd1604949ad24326fc1e8a2f88c01e2f50cd570a3314e23edb73322cabd6cb696cf88e50e389a0ff9c82e44dbed2d8a04abdef0a012713
|
data/lib/unicorn_wrangler.rb
CHANGED
@@ -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
|
-
|
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
|
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.
|
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-
|
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.
|
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
|
-
|
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
|