sidekiq_process_killer 0.3.1 → 0.4.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
2
  SHA1:
3
- metadata.gz: 84e5673903431a47d9158bcbcb9de3d7f6863159
4
- data.tar.gz: 54a0738048a84cc9a92506b7d196bac333ef24cb
3
+ metadata.gz: 2e33b6c981e60c62cb2d759e7477282962d48e20
4
+ data.tar.gz: be03799031354434d562e4095dc31b4fc31d7572
5
5
  SHA512:
6
- metadata.gz: 4ea1e73fde7afaea140bf2340ffc11e825afb628b49ad30876670ab0beb28285cf9099e0ac271acb3786c9defaa6a0cef0b1333897f4f441035f7b4a2679e5b7
7
- data.tar.gz: 33bcfb95b67911b32613673c742115bc2441b5b8f0fa6101b04d73cc78419f904b32d1e279e59979ab7676dbda86203a79f44062a876ab791971759edfddc0ca
6
+ metadata.gz: 3b87f6986e8ce7f86ee9410cbd1346aa7aa0fc86d9f46906704ae6cacb65669d5635559740ca7e881b9f99674108b1d957abdfc39beafd2ae36fd550dd259dd1
7
+ data.tar.gz: 42b3a2cfab92aff9b5c08dc28035589360571cdf0b99aab7efd4e0c5ab3ea928d9c0bf404fbd4dbe377c4b849163ef4cbc05418ed0c53432c5e4282f616a1e76
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  When you have memory leaks or "bloats" in your ruby application, identifying and fixing them can at times be a nightmare. Instead, an _"acceptable"_ mitigation is to re-spin the workers. Its a common technique that can be found in [Puma Worker Killer](https://github.com/schneems/puma_worker_killer) or [Unicorn Worker Killer](https://github.com/kzk/unicorn-worker-killer). Though, its neater and good practice to find and fix your leaks.
6
6
 
7
- SidekiqProcessKiller plugs into Sidekiq's middleware and kills a process if its processing beyond the supplied [RSS](https://en.wikipedia.org/wiki/Resident_set_size) threshold. Since this plugs into the middleware, the check is performed after each job.
7
+ SidekiqProcessKiller plugs into Sidekiq's middleware and kills a process (by sending `SIGTERM`) if its processing beyond the supplied [RSS](https://en.wikipedia.org/wiki/Resident_set_size) threshold. Since this plugs into the middleware, the check is performed after each job.
8
8
 
9
9
  ## Installation
10
10
 
@@ -20,22 +20,21 @@ Add the following to your Gemfile
20
20
 
21
21
  ### Configuration
22
22
 
23
- The default configurations are:
24
23
 
25
24
  ```ruby
26
25
  memory_threshold: 250.0 # mb
27
- shutdown_wait_timeout: 25 # seconds
28
- shutdown_signal: "SIGKILL"
29
26
  silent_mode: false
30
27
  statsd_klass: nil
31
28
  ```
32
29
 
33
- - `silent_mode`: When set to `true`, it will mean that no signals for terminate or otherwise will be sent. This is helpful if you are planning to launch this, but want to first do a dry run.
34
- - `memory_threshold`: This is the threshold, which, when, breached, the respective Sidekiq worker will be instructed for termination (via `TERM` signal, which sidekiq gracefully exits).
35
- - `shutdown_signal`: Signal for force shutdown/kill/quit.
36
- - `shutdown_wait_timeout`: If, for some reason, the process takes more than the timeout defined in `shutdown_wait_timeout`, to die, the process will be forced terminated using the signal set in `shutdown_signal`.
37
- - `statsd_klass`: This is your custom statsd class object which responds to an `increment` function. If present, then it will send custom metrics about the worker process that is being terminated and its respective RSS.
38
- - The `increment` is called with a single argument of type `Hash` which contains, `metric_name`, `worker_name` and `current_memory_usage`. The implementation of this may not be very flexible, its expected that your custom class reads the passed in information and appropriately send to your statsd agent. PRs/patches welcome to extend this functionality :).
30
+
31
+
32
+ | Config name | Description |
33
+ |------------------------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
+ | `silent_mode` | When set to `true`, no signal will be sent to running process. This is helpful if you are planning to launch this, but want to first do a dry run.
35
+ | `memory_threshold` | When current RSS is above this threshold, the respective Sidekiq worker will be instructed for termination (via `TERM` signal, which sidekiq gracefully exits). |
36
+ | `statsd_klass` | This is a class object which responds to an `increment`. If present, the `increment` function will be called with a single argument of type `Hash` which contains, `metric_name`, `worker_name` and `current_memory_usage`. This class is called when attempting to terminate a process or if the process had to be forcefully be terminated. |
37
+
39
38
 
40
39
  ### Updating default configuration:
41
40
 
@@ -57,8 +56,6 @@ end
57
56
 
58
57
  SidekiqProcessKiller.config do |con|
59
58
  con.memory_threshold = 1024.0
60
- con.shutdown_wait_timeout = 60
61
- con.shutdown_signal = "SIGUSR2"
62
59
  con.silent_mode = false
63
60
  con.statsd_klass = CustomMetric.new # your custom statsd class object
64
61
  end
@@ -18,32 +18,12 @@ module SidekiqProcessKiller
18
18
  return if memory_threshold > memory
19
19
 
20
20
  log_warn("Breached RSS threshold at #{memory_threshold}. Sending TERM Signal.")
21
-
21
+ increment_statsd({
22
+ metric_name: "process.term.signal.sent",
23
+ worker_name: worker.class,
24
+ current_memory_usage: memory
25
+ })
22
26
  send_signal("SIGTERM", pid)
23
- sleep(SidekiqProcessKiller.shutdown_wait_timeout)
24
-
25
- shutdown_signal = SidekiqProcessKiller.shutdown_signal
26
-
27
- begin
28
- ::Process.getpgid(pid)
29
- log_warn("Forcefully killing process with #{shutdown_signal}.")
30
-
31
- increment_statsd({
32
- metric_name: "process.killed.forcefully",
33
- worker_name: worker.class,
34
- current_memory_usage: memory
35
- })
36
-
37
- send_signal(shutdown_signal, pid)
38
- rescue Errno::ESRCH
39
- log_warn("Process killed successfully.")
40
-
41
- increment_statsd({
42
- metric_name: "process.killed.successfully",
43
- worker_name: worker.class,
44
- current_memory_usage: memory
45
- })
46
- end
47
27
  end
48
28
 
49
29
  private def process_memory
@@ -66,10 +46,6 @@ module SidekiqProcessKiller
66
46
  Sidekiq.logger.warn("[#{LOG_PREFIX}]#{silent_mode_msg} #{msg} #{humanized_attributes}")
67
47
  end
68
48
 
69
- private def log_info(msg)
70
- Sidekiq.logger.info("[#{LOG_PREFIX}]#{silent_mode_msg} #{msg} #{humanized_attributes}")
71
- end
72
-
73
49
  private def send_signal(name, pid)
74
50
  return if SidekiqProcessKiller.silent_mode
75
51
 
@@ -1,3 +1,3 @@
1
1
  module SidekiqProcessKiller
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1,10 +1,8 @@
1
1
  module SidekiqProcessKiller
2
2
  extend self
3
3
 
4
- attr_accessor :shutdown_wait_timeout, :shutdown_signal, :silent_mode, :statsd_klass
4
+ attr_accessor :silent_mode, :statsd_klass
5
5
 
6
- self.shutdown_wait_timeout = 25 # seconds
7
- self.shutdown_signal = "SIGKILL"
8
6
  self.silent_mode = false
9
7
  self.statsd_klass = nil
10
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_process_killer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shayon Mukherjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-07 00:00:00.000000000 Z
11
+ date: 2017-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler