Skip to content

Instantly share code, notes, and snippets.

@conorh
Forked from shock/gist:120186
Last active September 14, 2018 01:52
Show Gist options
  • Save conorh/780ff75a5d59e242856e69d97feb6720 to your computer and use it in GitHub Desktop.
Save conorh/780ff75a5d59e242856e69d97feb6720 to your computer and use it in GitHub Desktop.
Find bloating passengers and kill them gracefully.
#!/usr/bin/env ruby
#
# Find bloating passengers and kill them gracefully. Run from cron every minute.
#
# required for passenger since cron has no environment
ENV['HTTPD'] = 'httpd'
MEM_LIMIT = ARGV[0] || 500
module Process
def self.running?(pid)
begin
return Process.getpgid(pid) != -1
rescue Errno::ESRCH
return false
end
end
end
`passenger-memory-stats`.each_line do |line|
if line =~ /RubyApp: /
parts = line.split
pid, private_dirty_rss = parts[0].to_i, parts[3].to_f
if private_dirty_rss > MEM_LIMIT.to_i
puts "Found bloater #{pid} with size #{private_dirty_rss.to_s}"
puts "Killing with SIGUSR1 (graceful)..."
Process.kill("SIGUSR1", pid)
puts "Finished kill attempt. Sleeping for 8 seconds..."
sleep 8
if Process.running?(pid)
puts "Process is still running, so killing with extreme predjudice!"
Process.kill("TERM", pid)
end
puts "Done!"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment