共计 9726 个字符,预计需要花费 25 分钟才能阅读完成。
调研背景
为满足公司对现网多台服务器进行性能监控,并输出性能监控图,特对几款监控软件进行调研。目前大多数监控软件都要求在服务器上安装相应的监控软件采集数据再进行监控图输出,而公司考虑到业务的稳定性,不能在服务器上安装监控软件。所以在此我重点对 RRDtool 这款监控绘图工具进行调研,利用 shell 脚本在服务器上进行监控数据采集,集中传输到另外一个专用于处理监控数据并输出监控图的服务器上,利用 rrdtool 进行绘图,满足公司对性能监控的要求。
工具介绍
RRDtool 代表“Round Robin Database tool”,作者同时也是 MRTG 软件的发明人。许多监控软件如 MRTG、Cacti 等都是调用 RRDtool 来进行绘图的。
官方站点位于 http://oss.oetiker.ch/rrdtool/。所谓的“Round Robin”其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。RRDtool 就是使用类似的方式来存放数据的工具。
RRDtool 的特点:
· 首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得 RRDtool 看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。
· RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的。
· 其他数据库只是被动的接受数据,RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of change),并存储该结果。
· RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN (unknow)代替,其他数据库则不会这样。
工具安装
1. 下载 RRDtool
cd
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz
2. 安装 RRDtool
# 请确保已安装了相关的依赖包:zlib libxml2 libxml2-devel glib2 glib2-devel libpng freetype libart_lgpl pango-devel perl-CPAN
# 执行以下命令:
BUILD_DIR=/tmp/rrdbuild
INSTALL_DIR=/usr/local/rrdtool-1.4.8
mkdir -p $BUILD_DIR
mv rrdtool-1.4.8.tar.gz $ BUILD_DIR
cd $BUILD_DIR
tar zxvf rrdtool-1.4.8.tar.gz
cd rrdtool-1.4.8
./configure –prefix=$INSTALL_DIR && make && make install
# 安装完成后测试, 若输出下图表示安装成功:
/usr/local/rrdtool-1.4.8/bin/rrdtool
相关阅读:
使用 RRDtool 自定义绘图监控 Oracle 数据库 http://www.linuxidc.com/Linux/2012-11/74755.htm
通过 RRDtool 简单绘制图像 http://www.linuxidc.com/Linux/2012-08/68095.htm
安装 RRDtool 时候的报错 configure: error: Please fix the library issues listed above and try again http://www.linuxidc.com/Linux/2012-08/67083.htm
RHEL5.5 安装 RRDtool 解决多多依赖关系 http://www.linuxidc.com/Linux/2012-05/61403.htm
CentOS 中使用 yum 安装 RRDtool http://www.linuxidc.com/Linux/2012-05/61352.htm
工具配置
1. 前期规划
A. 监测对象:170.155 服务器 a.ip 连接数使用率(connect) b.cpu 平均使用率(cpu) c.15 分钟系统平均负载(load) d. 内存使用率(memory) e.I/O wait 的使用率(iowait)
D. 数据文件:采用 1 个 rrd 文件保存单个服务器所有监控对象的数据,并以服务器的 IP 来命名,eg. 192-168-1-1.rrd
B. 数据获取:利用 shell 来获取监测对象的数据
C. 监测频率:15 分钟监测一次,监测频率是指多久获取一次监测对象的数据
e. 统计频率:15 分钟,1 小时,1 天,统计频率是指利用监测数据来统计不同时间段内监测对象的平均 / 最大 / 最小等的值,统计方式依据用户设定
E. 绘图方式:曲线
F. 脚本规划:a.rrd_create.sh(创建 rrd 文件) b.rrd_update.sh(获取监控数据并更新 rrd 文件) c.rrd_graph.sh(绘图)
# 注意:
# 此处监测对象 a 采用使用率是方便在同一张图片上显示 4 个监测对象。
# 此处为测试时的规划,后期在正式使用时,将监测多台现网服务器的监测对象,将数据传输到 170.155 服务器后再进行绘图。
# 此次的监测频率为测试时的规划,后期在正式使用时,将依据实际情况进行调整。
2.rrd 脚本
# 创建数据保存目录:
mkdir -p /usr/local/rrdtool-1.4.8/data/170.155
# 创建以下脚本:
rrd_create.sh
#########################################################################
#!/bin/bash
#创建一个 rrd
rrdhome="/usr/local/rrdtool-1.4.8"
datadir="$rrdhome/data/170.155"
tooldir="$rrdhome/bin"
rrdname="170-155.rrd"
step="900"
success="Success to create $rrdname."
error="Error to create $rrdname."
#创建 rrd 文件,依据 step=900 秒(即 15 分钟)进行 1 /4/96(15 分钟 / 1 小时 / 1 天)分别进行统计平均值和最大值,并分别保存 672/720/365 个 (1 周 / 1 月 / 1 年) 数据。#以下数据都以百分比后的值表示,方便在同一张图上显示多个监控对象的曲线图。createrrd(){$tooldir/rrdtool create ${rrdname} --step ${step} DS:connect:GAUGE:1200:0:100 DS:cpu:GAUGE:1200:0:100 DS:load:GAUGE:1200:0:100 DS:memory:GAUGE:1200:0:100 DS:iowait:GAUGE:1200:0:100 RRA:AVERAGE:0.5:1:672 RRA:AVERAGE:0.5:4:720 RRA:AVERAGE:0.5:96:365 RRA:MAX:0.5:1:672 RRA:MAX:0.5:6:720 RRA:MAX:0.5:144:365
["$?" == 0 ] && return 0 || return 1
}
cd $datadir
if [! -f ${rrdname} ]; then
createrrd
else
read -p "$datadir 目录下已存在该文件。删除重建该文件请输入数字 1,其他输入将退出:" todo
if ["$todo" == "1" ] ;then
rm -rf $datadir/$rrdname
createrrd
exit 0
fi
exit 1
fi
rrd_update.sh
# 方法 1:放置于 crontab 中 15 分钟执行一次。脚本如下:
#########################################################################
#!/bin/bash
#更新 rrd 数据库的数据。请将此脚本放置于 crontab 内,15 分钟执行一次。rrdhome="/usr/local/rrdtool-1.4.8"
datadir="$rrdhome/data/170.155"
tooldir="$rrdhome/bin"
rrdname="170-155.rrd"
maxConnectNum="65535"
cd $datadir
if [-f ${rrdname} ]; then
#ip 连接率
## 获取 ip 连接数
connected=`cat /proc/sys/net/netfilter/nf_conntrack_count`
##connected=`cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count`
## 计算出 ip 连接率
##connect=$((${connected}*100/${maxConnectNum}))
connect=$(echo "${connected}*100/${maxConnectNum}"|bc)
#cpu 的使用率
## 获取 cpu 空闲率
cpu_used=`top -b -n 1| sed -n '1,5p'|grep Cpu|awk -F ""'{print $5}'|awk -F "%" '{print $1}'`
## 计算出 cpu 的使用率
##cpu=$((100-${cpu_used}))
cpu=$(echo "100-${cpu_used}"|bc)
#load 系统的负载率
## 获取 15 分钟内的平均负载
loadaverage=`uptime|awk -F "," '{print $6}'`
## 获取 cpu 的核芯数量
cpunum=`grep 'model name' /proc/cpuinfo |wc -l`
## 计算系统的负载率
##load=$((${loadaverage}*100/${cpunum}))
load=$(echo "${loadaverage}*100/${cpunum}"|bc)
#memory 的使用率
##memory 的总量
memory_total=`free -t|grep Total|awk -F ""'{print $2}'`
memory_use=`free -t|grep Total|awk -F ""'{print $3}'`
memory=$(echo "${memory_use}*100/${memory_total}"|bc)
#iowait 率
iowait=`sar -p 3 1|sed -n '5p'|awk -F ""'{print $6}'`
# echo $connected+$connect+$cpu_used+$cpu+$loadaverage+$cpunum+$load+$iowait
#更新 rrdtool 的数据
${tooldir}/rrdtool update ${rrdname} N:${connect}:${cpu}:${load}:${memory}:${iowait}
#调用绘图程序。将绘图与数据更新分开是因为后期部署时,数据更新与绘图在不同的服务器上。sh $datadir/rrd_graph.sh
exit 0
else
echo "文件 $datadir/$rrdname 不存在,请先创建 $rrdname 文件"
exit 1
fi
#########################################################################
# 方法 2:脚本运行后不退出, 一直运行:
#########################################################################
#!/bin/bash
#更新 rrd 数据库的数据。请将此脚本放置于 crontab 内,15 分钟执行一次。rrdhome="/usr/local/rrdtool-1.4.8"
datadir="$rrdhome/data/170.155"
tooldir="$rrdhome/bin"
rrdname="170-155.rrd"
maxConnectNum="65535"
cd $datadir
if [-f ${rrdname} ]; then
while true
do
#ip 连接率
## 获取 ip 连接数
connected=`cat /proc/sys/net/netfilter/nf_conntrack_count`
##connected=`cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count`
## 计算出 ip 连接率
##connect=$((${connected}*100/${maxConnectNum}))
connect=$(echo "${connected}*100/${maxConnectNum}"|bc)
#cpu 的使用率
## 获取 cpu 空闲率
cpu_used=`top -b -n 1| sed -n '1,5p'|grep Cpu|awk -F ""'{print $5}'|awk -F "%" '{print $1}'`
## 计算出 cpu 的使用率
##cpu=$((100-${cpu_used}))
cpu=$(echo "100-${cpu_used}"|bc)
#load 系统的负载率
## 获取 15 分钟内的平均负载
loadaverage=`uptime|awk -F "," '{print $6}'`
## 获取 cpu 的核芯数量
cpunum=`grep 'model name' /proc/cpuinfo |wc -l`
## 计算系统的负载率
##load=$((${loadaverage}*100/${cpunum}))
load=$(echo "${loadaverage}*100/${cpunum}"|bc)
#memory 的使用率
##memory 的总量
memory_total=`free -t|grep Total|awk -F ""'{print $2}'`
memory_use=`free -t|grep Total|awk -F ""'{print $3}'`
memory=$(echo "${memory_use}*100/${memory_total}"|bc)
#iowait 率
iowait=`sar -p 3 1|sed -n '5p'|awk -F ""'{print $6}'`
# echo $connected+$connect+$cpu_used+$cpu+$loadaverage+$cpunum+$load+$iowait
#更新 rrdtool 的数据
${tooldir}/rrdtool update ${rrdname} N:${connect}:${cpu}:${load}:${memory}:${iowait}
#调用绘图程序。将绘图与数据更新分开是因为后期部署时,数据更新与绘图在不同的服务器上。sh $datadir/rrd_graph.sh
#休眠 15 分钟
sleep 900
done
exit 0
else
echo "文件 $datadir/$rrdname 不存在,请先创建 $rrdname 文件"
exit 1
fi
#########################################################################
rrd_graph.sh
#########################################################################
#!/bin/bash
#执行绘图
rrdhome="/usr/local/rrdtool-1.4.8"
datadir="$rrdhome/data/170.155"
tooldir="$rrdhome/bin"
rrdname="170-155.rrd"
#绘制图片的名称
pngname="170-155.png"
#绘图时用的开始时间
starttime=`date -d "-1 day" +%s`
#绘图时图���的上标题
title="170.155 系统性能参数"
#绘图时图片的左标题
vtitle="使用率(%)"
#绘图时所取数据的解释度(用于控制从哪一个 RRA 中获取数据)一般可以先不使用
#step="900"
cd $datadir
#### 绘制系统性能监控图
${tooldir}/rrdtool graph ${pngname} --start $starttime --width 727 --height 364 -t "$title" -v "$vtitle" DEF:t1=${rrdname}:connect:AVERAGE DEF:t2=${rrdname}:cpu:AVERAGE DEF:t3=${rrdname}:load:AVERAGE DEF:t4=${rrdname}:memory:AVERAGE DEF:t5=${rrdname}:iowait:AVERAGE COMMENT:" \n" COMMENT:'------------------- 当前值 ---------------------' COMMENT:" \n" LINE1:t1#FF0000:connect GPRINT:t1:AVERAGE:%13.2lf LINE2:t2#0000FF:cpu GPRINT:t2:AVERAGE:%13.2lf COMMENT:" \n" LINE1:t3#00FF00:load GPRINT:t3:AVERAGE:%13.2lf LINE2:t4#F0FF0F:memory GPRINT:t4:AVERAGE:%13.2lf COMMENT:" \n" LINE2:t5#FF00FF:iowait GPRINT:t5:AVERAGE:%13.2lf COMMENT:" \n" COMMENT:"上次更新 \: $(date'+%Y-%m-%d %H\:%M\:%S'-r $rrdname)"
#COMMENT:"Last update\: $(date'+%Y-%m-%d %H\:%M\:%S'-r $rrdname)"
#########################################################################
# 修改脚本的权限
chmod 750 /usr/local/rrdtool-1.4.8/data/170.155/*.sh
3. 脚本部署
# 创建 rrd 文件
/usr/local/rrdtool-1.4.8/data/170.155/rrd_create.sh
#cron 设置
*/15 * * * * /usr/local/rrdtool-1.4.8/data/170.155/rrd_update.sh>/dev/null 2>&1
4. 绘图结果
# 结果说明:
# 由于是在 170.155 上测试,在此服务器上基本没有程序在运行,各项监控参数的使用率接近 0,所以看上去不明显,在实际生产环境中应该不会存在此情况。
调研背景
为满足公司对现网多台服务器进行性能监控,并输出性能监控图,特对几款监控软件进行调研。目前大多数监控软件都要求在服务器上安装相应的监控软件采集数据再进行监控图输出,而公司考虑到业务的稳定性,不能在服务器上安装监控软件。所以在此我重点对 RRDtool 这款监控绘图工具进行调研,利用 shell 脚本在服务器上进行监控数据采集,集中传输到另外一个专用于处理监控数据并输出监控图的服务器上,利用 rrdtool 进行绘图,满足公司对性能监控的要求。
工具介绍
RRDtool 代表“Round Robin Database tool”,作者同时也是 MRTG 软件的发明人。许多监控软件如 MRTG、Cacti 等都是调用 RRDtool 来进行绘图的。
官方站点位于 http://oss.oetiker.ch/rrdtool/。所谓的“Round Robin”其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。我们可以把用于存储数据的数据库的空间看成一个圆,上面有很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。指针会随着数据的读写自动移动。要注意的是,这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。在一段时间后,当所有的空间都存满了数据,就又从头开始存放。这样整个存储空间的大小就是一个固定的数值。RRDtool 就是使用类似的方式来存放数据的工具。
RRDtool 的特点:
· 首先 RRDtool 存储数据,扮演了一个后台工具的角色。但同时 RRDtool 又允许创建图表,这使得 RRDtool 看起来又像是前端工具。其他的数据库只能存储数据,不能创建图表。
· RRDtool 的每个 rrd 文件的大小是固定的,而普通的数据库文件的大小是随着时间而增加的。
· 其他数据库只是被动的接受数据,RRDtool 可以对收到的数据进行计算,例如前后两个数据的变化程度(rate of change),并存储该结果。
· RRDtool 要求定时获取数据,其他数据库则没有该要求。如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN (unknow)代替,其他数据库则不会这样。
工具安装
1. 下载 RRDtool
cd
wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.8.tar.gz
2. 安装 RRDtool
# 请确保已安装了相关的依赖包:zlib libxml2 libxml2-devel glib2 glib2-devel libpng freetype libart_lgpl pango-devel perl-CPAN
# 执行以下命令:
BUILD_DIR=/tmp/rrdbuild
INSTALL_DIR=/usr/local/rrdtool-1.4.8
mkdir -p $BUILD_DIR
mv rrdtool-1.4.8.tar.gz $ BUILD_DIR
cd $BUILD_DIR
tar zxvf rrdtool-1.4.8.tar.gz
cd rrdtool-1.4.8
./configure –prefix=$INSTALL_DIR && make && make install
# 安装完成后测试, 若输出下图表示安装成功:
/usr/local/rrdtool-1.4.8/bin/rrdtool
相关阅读:
使用 RRDtool 自定义绘图监控 Oracle 数据库 http://www.linuxidc.com/Linux/2012-11/74755.htm
通过 RRDtool 简单绘制图像 http://www.linuxidc.com/Linux/2012-08/68095.htm
安装 RRDtool 时候的报错 configure: error: Please fix the library issues listed above and try again http://www.linuxidc.com/Linux/2012-08/67083.htm
RHEL5.5 安装 RRDtool 解决多多依赖关系 http://www.linuxidc.com/Linux/2012-05/61403.htm
CentOS 中使用 yum 安装 RRDtool http://www.linuxidc.com/Linux/2012-05/61352.htm