God - 进程监控守护神

God 是一个使用Ruby写成的,容易配置,容易扩展的进程监控框架。

God

为什么要做进程监控呢,我们在网站的部署中需要保证Rails的进程或者其他相关进程持续运行,不会因为程序的异常而中止,而God就是一个非常简单但是功能强大的进程监控程序,在后台持续监控程序进程的运行状况,监控进程的CPU占用情况、内存消耗情况,以及在进程出现异常时进行重启等操作。

God的使用分为这样几步:

  1. 定义配置文件,在配置文件中告诉God需要监控程序的名称、启动中止重启的命令等等;
  2. 启动God守护进程,并指定配置文件的路径;
  3. 启动God后,需要监控的程序即可变为类似于后台服务,可以使用下述命令进行重启、停止等操作。
1
2
3
god start xxxx
god restart xxxx
god stop xxxx

看上去是不是很简单?

当然需要先安装God,安装命令简洁如下:

1
gem install god

配置文件是使用God的核心部分,有非常多的参数可以配置,这里就不一一介绍了,有兴趣可以参考God的网站,最好的学习方式就是参考示例,这里贴出unicorn的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#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了:

1
god -c path/to/unicorn.god

这个命令会让God在后台运行,如果想进行测试,可以加上 -D 这个参数,God会在前端运行并输出运行的日志。

启动God后,不到5s,Unicorn随即自动启动!

1
2
3
4
5
6
7
8
9
10
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'