196
14
Ruby
代码编写,因此可以使用
Ruby
语言的句法定义条件,减少重复。
God
支持多种生
命周期控制,还有一套精细且可扩展的通知系统。
为了了解
God
的工作方式,下面我们编写一个简单的进程:
loop do
puts 'Hello'
sleep 1
end
把上述代码保存到
server.rb
文件中。
接下来,编写
God
配置文件,监控这个进程。我们把这个配置文件命名为
monitor.god
God.watch do |w|
w.name = "god-monitor"
w.start = "ruby /full/path/to/server.rb"
w.keepalive
end
God
配置的基本结构就是这样,声明一个
God.watch
块(
watch
表示想要监控和管控的
进程)。在每个
watch
块中至少要提供一个唯一的名称和一个命令,告诉
God
如何启动
进程。
keepalive
声明告诉
God
保持进程始终运行。启动
God
时,如果监控的进程没有
运行,
God
会启动进程,如果进程退出了,
God
会重启它。
更多的配置选项参见
God
网站(
http://godrb.com
)。
Threads (in Ruby): Enough Already
Yehuda Katz
写的这篇文章(
http://yehudakatz.com/2010/08/14/threads-in-ruby-
enough-already/
)对
Ruby
中的线程做了介绍,虽然有点过时,还是推荐你阅读。
监控服务器的各项指标
监控服务器的目的是确保系统健康。
Web
服务器、中间件服务器和数据库服务器都要监
控。
不同的服务器配置和服务器中执行的不同任务,需要监控的指标有所不同。内存用量和
I/O
访问情况只是其中两个。此外,可能还要监控所有
CPU
或内核的平均用量,以及单
CPU
单个核心的用量。你可以设置当
CPU
用量达到一定程度,或者应用过量使用
服务器的内存时发出警报。或许,还要记录服务器不可用的次数,或者过去一段时间内
的重启次数。
数据分析
197
经常监控的几个指标如下:
运行时间。
活跃用户数。
服务器时间。
CPU
平均用量。
内存用量。
资源用量。
下面一一说明这些指标。
uptime
命令:
$
uptime
输出一行显示,指明当前时间、系统运行了多久、当前登录的用户数量,以及过去一分钟、
五分钟和十五分钟系统的平均负载。
如果想查看目前系统中有哪些用户正在运行进程,可以执行下述命令:
$
ps aux | awk '{ print $1 }' | sed '1 d' | sort | uniq
我们把几个过滤器传给
ps
命令:把输出中的其他信息删除,留下第一行(用户名),
后删除表头,再排序,去掉重复的行,只显示用户列表。
此外,还可以排除系统用户,只显示执行进程的普通用户(和
/
或根用户):
$
ps aux | awk '{ print $1 }' | sed '1 d' | sort |
uniq | perl -e 'for (<>) { chomp; $u = ( getpwnam($_) )[2];
print $_, "\n" if ( ( $u >= 1000 || $u == 0 ) &&
( $_ =~ /[[:alpha:]]/ && $_ ne "nobody" ) ) }'
上述命令可能只输出你的系统名和根用户。
如果想查看服务器的本地日期和时间,执行下述命令:
$
date
如果想知道系统有几个
CPU
可用该怎么办呢?可以执行下述命令:
$
grep processor /proc/cpuinfo | wc -l
如果想查看服务器的内存使用情况,可以使用
free
命令。这个命令的作用是显示
*nix
设备的
RAM
详情。
198
14
$
free
total used free shared buffers cached
Mem: 7513644 7115076 398568 52424 381372 1134788
-/+ buffers/cache: 5598916 1914728
Swap: 50331640 6500400 43831240
第一行是内存的各个细节:总量、已用量、闲置量、共享内存量、缓冲量和缓存量。第
二行是是已用内存的总量(包括缓冲和缓存)和可用内存的总量。第三行是交换内存总量,
以及已用的交换内存量和空闲的交换内存量。
资源用量
使用
top
命令可以实时概览服务器中的哪些进程使用的系统资源最多:
$
top
14-5
是一些输出示例。
14-5
top 命令输出的系统统计信息
top
命令输出的第一行是负载和运行时间,后面是用户数和平均负载。接下来的几行是
任务列表(取决于服务器当前正在执行什么操作)、
CPU
负载、内存和交换内存数据。
top
还支持定制输出,过滤进程。如果输入
n
和进程数,例如
5
那就只输出头五个进程。
数据分析
199
Shift-M
键(
M
表示“
memory
”),按内存用量排序进程。
如果想查看
CPU
使用情况,更确切地说是哪些进程正在使用
CPU
,以及使用了多少,
可以按
Shift-O
键(是字母
O
,不是数字
0
)选择按哪一列排序。如果想集中分析
CPU
用量,输入
k
(注意,在图
14-6
中,星号移到“
k: %CPU
”旁边了,这表明选中了
CPU
字段),然后按回车键。
回到进程页面后,你会发现现在按
%CPU
列排序了。在接口页面(
Shift-O
),可以选择
不同的指标,详细了解服务器的情况。此外
top
命令每隔
3
秒自动更新,因此能实时
查看服务器的状态。
14-6
top 的设置界面展示可查看的进程信息
第一列是字母
第二列是代码
第三列是代
码的意思
200
14
全面的监控方案
我们可以考虑把某个全面的监控方案集成到
Rails
应用中。监控应用通常在系统中执行
你指定的检查项目、脚本和程序,满足特定的条件时,监控应用会传送信息,发送警报
消息,或者更新某些值,具体做什么取决于你的配置。
接下来我要介绍的方案是
Sensu
,这是一个开源的监控框架,可从
http://sensuapp.org
载。
Sensu
是一个“简单的、可塑的和可弹性伸缩的”监控框架。它基于
MIT
许可证发布,
核心仓库在
GitHub
中(
https://github.com/sensu/sensu
)。
Sensu
使用检查项目(
check
)监控服务或判断资源的状态。检查项目其实就是在服务器
中运行的脚本,由
Sensu
客户端执行。这些脚本把数据输出到
STDOUT
STDERR
而且会返回一个退出状态码,表明状态(
0
表示正常,
1
表示提醒,
2
表示危险,
3
或以
上数值表示未知错误或自定义错误)。
Sensu
使用处理程序(
handler
)处理事件数据。处理程序是执行某个操作的脚本,例如
发送电子邮件或短信、生成警报或把指标数据添加到外部存储器中(如
Graphite
)。
Sensu
使用
Ruby
编写,用到了
Ruby
的事件处理库
EventMachine
https://github.com/
eventmachine/eventmachine
),而且可以使用
JSON
轻易配置。
Sensu
的测试覆盖度大,
使用
Travis CI
做持续集成(
https://travis-ci.org/sensu/sensu
),采用面向消息的架构,
使用
RabbitMQ
http://www.rabbitmq.com
)和
JSON
载荷。
监控
Ruby on Rails
应用的服务
我介绍
Sensu
的原因是,它是开源框架,而且是使用
Ruby
编写的。当然,市面上
有一些收费方案可供选择:
New Relic
http://newrelic.com
)是一个数据分析平台,它提供的功能远超
应用性能监控。
Skylight
https://www.skylight.io
是专供
Ruby on Rails
应用使用的分析平台,
使用
Rails
Ember
编写。
Airbrake
https://airbrake.io
)则用于监控错误和异常。

Get RESTful Rails Development (中文版) now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.