Skip to content

Instantly share code, notes, and snippets.

@svenwin
Forked from jsierles/gist:29838
Created November 10, 2009 15:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save svenwin/230973 to your computer and use it in GitHub Desktop.
Save svenwin/230973 to your computer and use it in GitHub Desktop.
#!/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 =~ /Rails: /
parts = line.split
pid, private_dirty_rss = parts[0].to_i, parts[4].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