Class: Sidekiq::MemoryGuardMiddleware

Inherits:
Object
  • Object
show all
Includes:
Component, ServerMiddleware
Defined in:
lib/sidekiq/memory_guard_middleware.rb

Overview

Gracefully restarts a Sidekiq process after a completed job when its
resident memory remains over the configured limit after a full GC.

Constant Summary collapse

STATE =
MemoryGuardState.new

Delegated Instance Attributes collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ MemoryGuardMiddleware

Returns a new instance of MemoryGuardMiddleware.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :warning_rss_mb (Numeric)

    RSS warning threshold in mebibytes

  • :max_rss_mb (Numeric)

    RSS limit in mebibytes

  • :grace_time (Numeric)

    maximum time for active jobs to finish

  • :shutdown_wait (Numeric)

    delay before the final kill signal

  • :kill_signal (String)

    final signal after graceful shutdown

  • :role (String)

    stable process role used in logs and metrics



51
52
53
54
55
# File 'lib/sidekiq/memory_guard_middleware.rb', line 51

def initialize(options = {})
  @settings = MemoryGuardSettings.build(options)
  @telemetry = MemoryGuardTelemetry.new(role: @settings.role)
  @restart_tracker = MemoryGuardRestartTracker.new(role: @settings.role, telemetry: @telemetry)
end

Class Method Details

.record_startup(role:) ⇒ void

This method returns an undefined value.

Records every process start and completes a pending memory-restart
marker left by the previous process for this role.

Parameters:

  • role (String)


30
31
32
# File 'lib/sidekiq/memory_guard_middleware.rb', line 30

def record_startup(role:)
  MemoryGuardRestartTracker.new(role:).record_startup
end

Instance Method Details

#call { ... } ⇒ Object

Returns the wrapped worker's result.

Yields:

  • the next server middleware or worker

Returns:

  • (Object)

    the wrapped worker's result



59
60
61
62
63
# File 'lib/sidekiq/memory_guard_middleware.rb', line 59

def call(*)
  yield
ensure
  safely_restart_if_over_limit
end

#reset!Object

Alias for Memory_guard_state#reset!

Returns:

  • (Object)

    Memory_guard_state#reset!

See Also:



24
# File 'lib/sidekiq/memory_guard_middleware.rb', line 24

delegate :reset!, :restart_requested?, to: :memory_guard_state

#restart_requested?Object

Alias for Memory_guard_state#restart_requested?

Returns:

  • (Object)

    Memory_guard_state#restart_requested?

See Also:



24
# File 'lib/sidekiq/memory_guard_middleware.rb', line 24

delegate :reset!, :restart_requested?, to: :memory_guard_state