ops

smokeping代码走读

Posted by Shi Hai's Blog on December 21, 2017

smokeping架构设计(第一次小结)

背景介绍

基础安装

核心代码

  base类和basefork类是smokeping的基类,所有探针(probe)扩展都需要从这两个继承这两个类,其中fping、echoping等系统工具在smokeping中一个独立的探针(probe),如下图probe所示。basefork与base类相比的差异点在于basefork支持多进程的并发性。在当前的smokeping版本中,Fping是base类的衍生类,其他的探针都从basefork衍生。为什么Fping不从basefork类继承呢?这是因为fping程序并不支持对多主机的并发测试。

  base有三个核心属性:step、offset以及pings。step指的是两次探针使用的间隔,上图中的every 60s就是两次探针的间隔时间。当多探针并发执行时,会对网络带来较大的负载影响,而offset可以调整任意一个探针的执行时间点。在一个完整的间隔中到底向目标机器发送多少个探测报文这个由pings来决定。

package Smokeping::probes::base;

sub step {
	my $self = shift;
	my $rv = $self->{cfg}{Database}{step};
	unless (defined $self->{cfg}{General}{concurrentprobes}
	    and $self->{cfg}{General}{concurrentprobes} eq 'no') {
		$rv = $self->{properties}{step} if defined $self->{properties}{step};
	}
	return $rv;
}

sub offset {
	my $self = shift;
	my $rv = $self->{cfg}{General}{offset};
	unless (defined $self->{cfg}{General}{concurrentprobes}
	    and $self->{cfg}{General}{concurrentprobes} eq 'no') {
		$rv = $self->{properties}{offset} if defined $self->{properties}{offset};
	}
	return $rv;
}

sub pings {
	my $self = shift;
	my $target = shift;
	# $target is not used; basefork.pm overrides this method to provide a target-specific parameter
	my $rv = $self->{cfg}{Database}{pings};
	$rv = $self->{properties}{pings} if defined $self->{properties}{pings};
	return $rv;
}

smokeping的核心架构类图如下所示:

如果用户要对smokeping进行探针扩展,只需要继承base或者basefork即可(覆写ping或者pingone函数)。   smokeping的探测数据存放于RRDtool中。RRDtool (轮替型数据库工具, round-robin database tool) 旨在处理时间序列资料,例如网络带宽、温度或CPU负载。 资料储存在环形缓冲区为基底的数据库中,因此系统储存占用量随时间保持恒定。