以下脚本监视来自ss -s
rrdtool=$(which rrdtool);
db=/opt/rrd/estabconns.rrd
img=/usr/share/nginx/html/awp
export IFS=" ,"
arr=($(ss -s | grep TCP:))
total=${arr[3]}
if [ ! -e $db ]
then
$rrdtool create $db \
-s 5 \
DS:conns:GAUGE:600:0:50000000000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
fi
$rrdtool updatev $db -t conns N:$total
for period in hour day week month year
do
$rrdtool graph $img/connections-$period.png -s -1$period \
-t "ams1 connections - $period" -z \
-c "BACK#FFFFFF" -c "SHADEA#FFFFFF" -c "SHADEB#FFFFFF" \
-c "MGRID#AAAAAA" -c "GRID#CCCCCC" -c "ARROW#333333" \
-c "FONT#333333" -c "AXIS#333333" -c "FRAME#333333" \
-h 134 -w 543 -l 0 -a PNG -v "concurrent connections" \
DEF:conns=$db:conns:AVERAGE \
VDEF:min=conns,MINIMUM \
VDEF:max=conns,MAXIMUM \
VDEF:avg=conns,AVERAGE \
VDEF:lst=conns,LAST \
"COMMENT: \l" \
"COMMENT: " \
"COMMENT:Minimum " \
"COMMENT:Maximum " \
"COMMENT:Average " \
"COMMENT:Current \l" \
"COMMENT: " \
"LINE1:conns#0AC43C:Conns " \
"GPRINT:min:%6.0lf " \
"GPRINT:max:%6.0lf " \
"GPRINT:avg:%6.0lf " \
"GPRINT:lst:%6.0lf \l" > /dev/null
done
我的cronjob:
*/5 * * * * /bin/bash /root/rrd.sh
问题是它显示错误的数字。来自ss -s
的我的TCP连接总是150-300,但是在输出图片上它显示0到3之间的值,有时更高,但通常它们是错误的。
答案 0 :(得分:1)
首先,请注意您已在代码中将DS类型定义为GAUGE - 但您提及的行为听起来有点像是COUNTER。您之前是否将其创建为计数器?尝试在RRD文件上使用rrdtool info $db
并验证它实际上是GAUGE。你可能会发现它不是。
其次,RRD文件的步长为5秒,DS的心跳为10分钟。您每5分钟更新一次。你的意思是有5分钟(300秒)的步骤吗?否则,当行填充时,您将获得一些有趣的效果......步骤通常应与预期的更新频率匹配。
第三,您可能在使用时间戳N
进行更新时遇到问题,而不是精确地在步骤边界上。这将导致数据规范化,但不足以将300改为3.使用
$time = `date +%s`
$offset = `expr $time % $step`
$t = `expr $time - $offset`
$rrdtool update $db -t conns $t:$total
最后 - 您确定使用正确的值进行更新吗?每次更新时,让脚本输出$total
的值到日志文件,这样您就可以确认您使用您认为的值进行更新。