God 是一个使用Ruby写成的,容易配置,容易扩展的进程监控框架。
为什么要做进程监控呢,我们在网站的部署中需要保证Rails的进程或者其他相关进程持续运行,不会因为程序的异常而中止,而God就是一个非常简单但是功能强大的进程监控程序,在后台持续监控程序进程的运行状况,监控进程的CPU占用情况、内存消耗情况,以及在进程出现异常时进行重启等操作。
God的使用分为这样几步:
- 定义配置文件,在配置文件中告诉God需要监控程序的名称、启动中止重启的命令等等;
- 启动God守护进程,并指定配置文件的路径;
- 启动God后,需要监控的程序即可变为类似于后台服务,可以使用下述命令进行重启、停止等操作。
god start xxxx
god restart xxxx
god stop xxxx
看上去是不是很简单?
当然需要先安装God,安装命令简洁如下:
gem install god
配置文件是使用God的核心部分,有非常多的参数可以配置,这里就不一一介绍了,有兴趣可以参考God的网站,最好的学习方式就是参考示例,这里贴出unicorn的配置:
#unicorn.god
rails_env = ENV['RAILS_ENV'] || 'production'
rails_root = ENV['RAILS_ROOT'] || Dir.pwd
puts rails_root
God.pid_file_directory = "#{rails_root}/tmp/pids"
God.watch do |w|
w.name = "unicorn"
w.interval = 30.seconds # default
# 启动命令
w.start = "cd #{rails_root} && unicorn -c #{rails_root}/config/unicorn.rb -E #{rails_env} -D"
# 中止命令
w.stop = "kill -QUIT `cat #{rails_root}/tmp/pids/unicorn.pid`"
# 重启命令
w.restart = "kill -USR2 `cat #{rails_root}/tmp/pids/unicorn.pid`"
w.start_grace = 10.seconds
w.restart_grace = 10.seconds
# PID文件路径
w.pid_file = "#{rails_root}/tmp/pids/unicorn.pid"
# 运行用户
# w.uid = 'git'
# w.gid = 'git'
w.behavior(:clean_pid_file)
# 启动条件(5s监控一次,没有在运行就启动)
w.start_if do |start|
start.condition(:process_running) do |c|
c.interval = 5.seconds
c.running = false
end
end
# 重启条件 (内存占用超过500M,或者CPU持续占用超过80%)
w.restart_if do |restart|
restart.condition(:memory_usage) do |c|
c.above = 500.megabytes
c.times = [3, 5] # 3 out of 5 intervals
end
restart.condition(:cpu_usage) do |c|
c.above = 80.percent
c.times = 5
end
end
# lifecycle
w.lifecycle do |on|
on.condition(:flapping) do |c|
c.to_state = [:start, :restart]
c.times = 5
c.within = 5.minute
c.transition = :unmonitored
c.retry_in = 10.minutes
c.retry_times = 5
c.retry_within = 2.hours
end
end
end
是不是还挺简单的?
最后只需要运行以下命令就可以启动God了:
god -c path/to/unicorn.god
这个命令会让God在后台运行,如果想进行测试,可以加上 -D 这个参数,God会在前端运行并输出运行的日志。
启动God后,不到5s,Unicorn随即自动启动!
I [2015-06-15 22:11:19] INFO: Loading config/bidding.god
I [2015-06-15 22:11:19] INFO: Syslog enabled.
I [2015-06-15 22:11:19] INFO: Using pid file directory: .../tmp/pids
I [2015-06-15 22:11:19] INFO: Socket already in use
I [2015-06-15 22:11:19] INFO: Socket is stale, reopening
I [2015-06-15 22:11:19] INFO: Started on drbunix:///tmp/god.17165.sock
I [2015-06-15 22:11:19] INFO: listener move 'unmonitored' to 'up'
I [2015-06-15 22:11:19] INFO: unicorn move 'unmonitored' to 'up'
I [2015-06-15 22:11:19] INFO: unicorn moved 'unmonitored' to 'up'
I [2015-06-15 22:11:19] INFO: listener moved 'unmonitored' to 'up'