Skip to content

Instantly share code, notes, and snippets.

@martincik
Created January 28, 2009 16:48
Show Gist options
  • Save martincik/54044 to your computer and use it in GitHub Desktop.
Save martincik/54044 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.
#
MEM_LIMIT = ARGV[0].to_i || 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
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