简介

SmokePing 是 RRDtool 的作者 TobiOetiker 的作品,主要是监视网络性能,特点是画的图非常亮,网络丢包和延迟用颜色和阴影来表示。

这里值得注意的是,smokeping取值取的是中位数,而阴影部分则是其他取值的绘图,可以持续跟踪你的网络延迟,主要功能如下:

  • 最佳的延迟可视化图表。
  • 交互式图形浏览。
  • 多种延迟测量插件。
  • 主/从系统用于分布式测量。
  • 可灵活配置的警报系统。
  • 实时延迟图表与一些有趣的图表。

技术特点

SmokePing 是用Perl 写的,采用 fping 用于ping测试,用 echoping 监视 www 服务器性能,监视 dns 查询性能,监视 ssh 性能等,底层也是 RRDtool 做支持。

基础安装

网上的安装配置说明杂乱,坑很多,从无数个坑中爬起后,果断编写此文,需要说明的是以下安装配置说明都是基于centos7.2操作系统。

包更新和时间同步

如果环境中已配置了统一的时间同步服务,可跳过此设置。

yum -y install ntpdate
ntpdate times.aliyun.com

安装依赖包

yum groupinstall "Compatibility libraries" "Base" "Development tools" -y
yum -y install cpan perl perl-FCGI perl-CGI perl-Digest-HMAC perl-Net-Telnet perl-Net-OpenSSH perl-Net-SNMPperl-LDAP perl-Net-DNS perl-IO-Pty-Easy perl-Test-Simple perl-Sys-Syslog perl-libwww-perlperl-IO-Socket-SSL perl-Socket6 perl-CGI-SpeedyCGI perl-FCGI perl-Time-HiResperl-ExtUtils-MakeMaker rrdtool rrdtool-perl curl fping httpd httpd-devel gccmake wget libxml2-devel libpng-devel glib pango pango-devel freetypefreetype-devel fontconfig cairo cairo-devel libart_lgpl libart_lgpl-devel mod_fcgidscreen

安装fping

安装fping,源代码可以从官方站点下载,下载地址https://fping.org/dist/fping-3.16.tar.gz

tar -zxvf fping-3.16.tar.gz -C /usr/local/src
cd /usr/local/src/fping-3.16
./configure
make && make install

安装Echoping

网上下载https://fossies.org/linux/misc/old/echoping-6.0.2.tar.gz

tar -zxvf echoping-6.0.2.tar.gz -C /usr/local/
cd /usr/local/echoping-6.0.2
yum install -y popt-devel openssl openssl-devel
./configure --prefix=/usr/local/echoping --with-ssl --without-libidn
make && make install

安装SmokePing

下载SmokePing源代码 http://oss.oetiker.ch/smokeping/pub/smokeping-2.6.11.tar.gz

tar -zxvf smokeping-2.6.11.tar.gz -C /usr/local/src
cd /usr/local/src/smokeping-2.6.11
export PERL5LIB=/usr/local/smokeping/thirdparty/lib/perl5/
./configure --prefix=/usr/local/smokeping
gmake install

如果./configure过程中提示找不到某些perl扩展,如下所示

checking checking for perl module'Config::Grammar'... Can't locate Config/Grammar.pm in @INC
 (@INC contains:/usr/local/smokeping/thirdparty/lib/perl5 /usr/local/lib64/perl5 
/usr/local/share/perl5/usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5/usr/share/perl5 .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

请使用以下命令安装对应模块:

perl -MCPAN -e 'install Config::Grammar'
perl -MCPAN -e 'install "LWP::Simple"'
perl -MCPAN -e 'install "Net::SNMP"'
perl -MCPAN -e 'install "Net::LDAP"'
perl -MCPAN -e 'install IO::Pty'

注意:有时候需要重复安装几次才能装上模块。

注意要选择国内的的模块源,不然速度很慢。

创建相关目录和日志文件

cd /usr/local/smokeping
mkdir cache data var 
touch /var/log/smokeping.log 
chown apache:apache cache/ data/ var/ /var/log

因为这里的web服务使用的是httpd,所以相关文件的属主属组均为apache:

/usr/local/smokeping/cache/ 存放缓存文件;

/usr/local/smokeping/data/ 存放SmokePing的RRD数据文件;

/usr/local/smokeping/var/log/ 存放SmokePing的日志文件;

由于SmokePing通过Web的fcgi程序运行,所以建议如果需要查看运行错误日志,大都直接记录在httpd服务的日志中,使用以下命令查看:

tail /var/log/httpd/error_log

参数基本配置

创建相关配置文件

cp /usr/local/smokeping/htdocs/smokeping.fcgi.dist /usr/local/smokeping/htdocs/smokeping.fcgi 
cp /usr/local/smokeping/etc/config.dist /usr/local/smokeping/etc/config

修改配置文件

sed -i 's#cgiurl   = http://some.url/smokeping.cgi#cgiurl   = http://可访问本机的IP/smokeping#g' /usr/local/smokeping/etc/config
sed -i 's#step    = 300#step     = 60#g' /usr/local/smokeping/etc/config

此设置的含义为每60秒ping20次。

安装字体并支持中文

yum -y install wqy-zenhei-fonts
vim /usr/local/smokeping/lib/Smokeping/Graphs.pm

修改文件中,增加一行字体配置部分('--font', "TITLE:20:WenQuanYi Zen Hei Mono",):

...
    if ($mode =~ /[anc]/){
        my $val = 0;
        for my $host (@hosts){
            my ($graphret,$xs,$ys) = RRDs::graph
            ("dummy",
            '--start', $tasks[0][1],
            '--end', $tasks[0][2],
            '--font', "TITLE:20:WenQuanYi Zen Hei Mono",
            "DEF:maxping=$cfg->{General}{datadir}${host}.rrd:median:AVERAGE",
            'PRINT:maxping:MAX:%le' );
            my $ERROR = RRDs::error();
            return "
RRDtool did not understand your input: $ERROR.
" if $ERROR; $val = $graphret->[0] if $val < $graphret->[0]; } $val = 1e-6 if $val =~ /nan/i; $max = { $tasks[0][1] => $val * 1.5 }; } ...

修改字符集,增加一行(charset= utf-8)

vim /usr/local/smokeping/etc/config
...
***Presentation ***
charset= utf-8

template = /usr/local/smokeping/etc/basepage.html.dist
...

增加登录验证

htpasswd -c /usr/local/smokeping/htdocs/htpasswd smokeping
chmod 600 /usr/local/smokeping/etc/smokeping_secrets.dist

增加SmokePing的web界面

vim /etc/httpd/conf/httpd.conf

增加下面的web站点配置:

...
Alias /cache "/usr/local/smokeping/cache/"
Alias /cropper "/usr/local/smokeping/htdocs/cropper/"
Alias /smokeping "/usr/local/smokeping/htdocs/smokeping.fcgi"

AllowOverride None
Options All
AddHandler cgi-script .fcgi .cgi
AllowOverride AuthConfig
Order allow,deny
Allow from all
AuthName "Smokeping"
AuthType Basic
AuthUserFile /usr/local/smokeping/htdocs/htpasswd
Require valid-user
DirectoryIndex smokeping.fcgi

...

添加监控对象

vim /usr/local/smokeping/etc/config

增加入web页面的菜单

*** Targets ***
...

++ Localhost
menu = Localhost
title = Localhost
alerts = someloss
#slaves = boomer slave2
host = 本机外网地址

添加监控节点

vim /usr/local/smokeping/etc/config

监控节点样例如下,将x.x.x.x替换为实际的IP地址,注意+是第一层,++是第二层,+++ 是第三层:

smokeping会根据配置文件中配置监控节点的内容,在/usr/local/smokeping/data目录下生成对应的moniter文件夹,其下包含website子文件夹。

+ IDC
menu = IDC网络监控
title = 通往各IDC网络监控

++ IDC-zp
menu = 周浦机房
title = 周浦机房网络监控列表
host = /IDC/IDC-zp/IDC-zp-1-dianxin /IDC/IDC-zp/IDC-zp-2-BGP

+++ IDC-zp-1-dianxin
menu = 上海一区电信联通网络
title = 上海一区电信联通网络
alerts = someloss
host = x.x.x.x

+++ IDC-zp-2-BGP
menu = 华东一区网络
title = 华东一区网络
alerts = someloss
host = x.x.x.x

++ IDC-fx
menu = 斐讯机房
title = 斐讯机房网络监控列表
host = /IDC/IDC-fx/IDC-fx-1-dianxin /IDC/IDC-fx/IDC-fx-1-liantong /IDC/IDC-fx/IDC-fx-2-dianxin /IDC/IDC-fx/IDC-fx-2-liantong /IDC/IDC-fx/IDC-fx-3-liantong

+++ IDC-fx-1-dianxin
menu = 华东二区电信网络
title = 华东二区电信网络
alerts = someloss
host = x.x.x.x

+++ IDC-fx-1-liantong
menu = 华东二区联通网络
title = 华东二区联通网络
alerts = someloss
host = x.x.x.x

+++ IDC-fx-2-dianxin
menu = 华东三区电信网络
title = 华东三区电信网络
alerts = someloss
host = x.x.x.x

+++ IDC-fx-2-liantong
menu = 华东三区联通网络
title = 华东三区联通网络
alerts = someloss
host = x.x.x.x

+++ IDC-fx-3-liantong
menu = 华东四区联通网络
title = 华东四区联通网络
alerts = someloss
host = x.x.x.x

++ IDC-cq
menu = 重庆机房
title = 重庆机房网络监控列表
host = /IDC/IDC-cq/IDC-cq-1-dianxin

+++ IDC-cq-1-dianxin
menu = 西南二区电信网络
title = 西南二区电信网络
alerts = someloss
host = x.x.x.x

++ IDC-gy
menu = 贵阳机房
title = 贵阳机房网络监控列表
host = /IDC/IDC-gy/IDC-gy-1-liantong

+++ IDC-gy-1-liantong
menu = 西南一区联通网络
title = 西南一区联通网络
alerts = someloss
host = x.x.x.x

+ Other
menu = 三大网络监控
title = 监控统计
++ dianxin
menu = 电信网络监控
title = 电信网络监控列表
host = /Other/dianxin/dianxin-bj
+++ dianxin-bj
menu = 北京电信(202.96.199.133)
title = 北京电信(202.96.199.133)
alerts = someloss
host = 202.96.199.133

注意:每次修改配置文件后需要重启smokeping进程

/usr/local/smokeping/bin/smokeping --restart

/usr/local/smokeping/bin/smokeping --reload

pkill smokeping
/usr/local/smokeping/bin/smokeping

smokeping会根据配置文件中配置监控节点的内容,在/usr/local/smokeping/data目录下生成对应的monitor文件夹,其下包含website子文件夹。

yum -y install tree
/usr/local/smokeping/data/
IDC
 IDC-cq
  IDC-cq-1-dianxin.rrd
  IDC-cq-1.rrd
 IDC-fx
  IDC-fx-1-dianxin.rrd
  IDC-fx-1-liantong.rrd
  IDC-fx-2-dianxin.rrd
  IDC-fx-2-liantong.rrd
  IDC-fx-3-liantong.rrd
 IDC-gy
  IDC-gy-1-liantong.rrd
 IDC-zp
     IDC-zp-1-dianxin.rrd
     IDC-zp-2-BGP.rrd
Other
 dianxin
     dianxin-bj.rrd
__sortercache
 data.FPing.storable
Test
    James.rrd
    Localhost.rrd

修改邮件报警相关配置

vim /usr/local/smokeping/etc/config

修改邮件告警地址

*** Alerts ***
to = 接收告警邮件的Email地址
from = 发送告警邮件的Email地址

启动服务并验证

systemctl start httpd
/usr/local/smokeping/bin/smokeping

Master/Slave分布式模式配置

在使用smokeping过程中,很容易发现,如果从单个节点去探测网络性能,并不能充分检测到整个网络的一个状态。smokeping提供了基于多节点的分布式模式,可以从多个节点去探测到网络的状态,这样我们才能全面客观的监控真个网络。

smokeping的分布式为主从模式,M/S模式配置起来很简单,slave的配置基本与master的配置相同,只是slave不需要config文件,而是在启动过程中请求master上面的config文件,这样只需要维护master上面的config文件即可。

smokeping分布式的检测方式为被动方式,由slave节点在启动时从master上获取config文件,然后进行探测,探测后的数据在通过cgi提交给master。slave可为多个,M/S直接通信认证是通过--shared-secret=filename来和master进行密码认证。


    slave 1        slave 2        slave 3 
        |             |              |
        +-------+     |     +--------+
                |     |     |
                v     v     v
              +---------------+
              |    master     |
              +---------------+

安装Slave服务器的SmokePing环境

安装方式完全等同于上面的基础安装

Master/Slave通讯认证配置

smokeping主从验证通过Master和Slave的/usr/local/smokeping/etc/smokeping_secrets文件进行的,但是Master和Slave的验证文件书写方式是有所不同。

Master服务器验证文件

cp /usr/local/smokeping/etc/smokeping_secrets.dist /usr/local/smokeping/etc/smokeping_secrets
chown apache:apache /usr/local/smokeping/etc/smokeping_secrets

注意:/usr/local/smokeping/etc/smokeping_secrets 文件属性必须是600,而且所属用户和用户组必须和httpd的用户和用户组一致

vim /usr/local/smokeping/etc/smokeping_secrets
SlaveName:Password

Slave服务器验证文件

cp /usr/local/smokeping/etc/smokeping_secrets.dist /usr/local/smokeping/etc/smokeping_secrets
vim /usr/local/smokeping/etc/smokeping_secrets

下面是正文格式,需要与master服务器上的/usr/local/smokeping/etc/smokeping_secrets文件中,以SlaveName:后面的密码一致

Password

注意:/usr/local/smokeping/etc/smokeping_secrets 文件属性必须是600

Master服务器分布式模式配置

修改Master上面的config文件

vim /usr/local/smokeping/etc/config

如果有多个SlaveName,可以依次增加

*** Slaves ***    
#master验证密码文件
secrets=/usr/local/smokeping/etc/smokeping_secrets 

#要和smokeping_secrets保持一致,slave启动时的--slave-name后面跟着的也是这个名字
+ SlaveName
display_name=图表中显示的服务器名称
#页面图表中显示的颜色
color=0000ff

启动并验证分布式环境

注意:首先启动master服务器的SmokePing服务,再启动Slave服务器的SmokePing服务

/usr/local/smokeping/bin/smokeping --master-url=http://master的httpd的验证用户名:httpd的验证用户密码@master的外网IP/smokeping --cache-dir=/usr/local/smokeping/cache/ --shared-secret=/usr/local/smokeping/etc/smokeping_secrets --slave-name=SlaveName --logfile=/var/log/smokeping_slave.log