服务器状态监控之snmp&ipmi

一、ipmi

1、简介

IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准

开源的免费标准、跨不同操作系统

监视服务器的物理健康特征,如温度、电压、风扇工作状态、电源供应及机箱入侵等

核心部件:BMC(Baseboard Management Controller),一种嵌入式微控制器,整个平台管理的大脑,

ipmi所有功能都是通过BMC发送命令来完成,BMC接受并在系统事件日志中记录事件消息,维护描述系统中传感器情况的传感器数据,支持远程访问

BMC具有以下功能:

  1.通过系统的串行端口进行访问

  2. 故障日志记录和 SNMP 警报发送

  3.访问系统事件日志 (System Event Log ,SEL) 和传感器状况

  4.控制包括开机和关机

  5.独立于系统电源或工作状态的支持

  6.用于系统设置、基于文本公用程序和操作系统控制台的文本控制台重定向

基于BMC,最大优势:独立于CPU BIOS和OS,无论是开机还是关机状态下,接通电源就可以实现对服务器的监控

2、使用ipmi的先决条件

(1)服务器硬件本身提供对ipmi的支持

目前惠普、戴尔和 NEC 等大多数厂商的服务器都支持 IPMI 2.0,但并不是所有服务器都支持,所以应该先通过产品手册或在 BIOS 中确定服务器是否支持 ipmi,也就是说服务器在主板上要具有 BMC 等嵌入式的管理微控制器。

(2)操作系统提供相应的ipmi驱动

通过操作系统监控服务器自身的 ipmi 信息时需要系统内核提供相应的支持,linux 系统通过内核对 OpenIPMI(ipmi 驱动)的支持来提供对 ipmi 的系统接口。在使用驱动之前,请先启动该驱动:


service ipmi start 或者启动模块: 

modprobe ipmi_msghandler 

modprobe ipmi_devintf 

modprobe ipmi_si 

modprobe ipmi_poweroff 

modprobe ipmi_watchdog

(3)ipmi管理工具

选择的是 Linux 下的命令行方式的 ipmi 平台管理工具 ipmitool,开源的还有很多,如:ipmiutil

ipmitool通过OpenIPMI接口来访问BMC,实现对服务器的两种管理方式:(1)通过OS监控本地服务器;(2)通过网络监控远程服务器

本地服务管理:系统结构

监控本地命令格式:ipmitool -I open command,其中-I Open

command有以下项:

a)   raw:发送一个原始的IPMI请求,并且打印回复信息。
b)   lan:配置网络(lan)信道(channel)
c)   chassis :查看底盘的状态和配置电源
d)   event:向BMC发送一个已定义的事件(event),可用于测试配置的SNMP是否成功
e)   mc: 查看MC(Management Contollor)状态和各种允许的项
f)   sdr:打印传感器仓库中的任何监控项和从传感器读取到的值。
g)   sensor:打印周详的传感器信息。
h)   Fru:打印内建的Field Replaceable Unit (FRU)信息
i)   sel: 打印 System Event Log (SEL)    
j)   pef: 配置 Platform Event Filtering (PEF),事件过滤平台用于在监控系统发现有event时候,用PEF中的策略进行事件过滤,然后看是否需要报警。
k)   sol/isol:用于配置通过串口的Lan进行监控
l)   user:配置BMC中用户的信息 。
m)  channel:配置Management Controller信道。

监控远程服务器

系统架构

ipmitool -H 10.6.77.249 -U root -P changeme -I lan command

配置IP、NetMask、gateway

二、snmp

1、简介

SNMP(Simple Network Management Protocol)简单网络管理协议,是由互联网工作组定义的一套网络管理协议。

TCP/IP协议簇的一个应用层协议

监视网络状态、修改网络设备配置、接受网络事件告警等

2、工作原理

客户机/服务器模式,即代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互完成的。

SNMP代理回答SNMP管理工作站对代理MIB定义信息的查询。

应用场景

管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。

一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。

(1)管理信息库MIB

任何一个被管理的资源(cpu、内存)都表示成一个对象,成为被管理的对象。MIB是被管理对象的集合。定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每一个SNMP设备(Agent)都有自己的MIB。MIB可以看成NMS(网管系统)和Agent之间的沟通桥梁。

NMS、Agent和MIB的关系

MIB文件是一种分级的树的结构,如图,第一级有三个节点:ccitt、iso、iso-ccitt。低级的对象ID分别由相关组织分配。一个特定对象的标识符可通过由根到该对象的路径获得。一 般网络设备取iso节点下的对象内容。如名字空间ip结点下一个名字为ipInReceives的MIB变量被指派数字值3,因而该变量的名字为

iso.org.dod.internet.mgmt.mib.ip.ipInReceives

相应的数字表示(对象标识符OID,唯一标识一个MIB对象)为:

1.3.6.1.2.1.4.3

(2)管理信息结构(SMI)

关于MIB的一套公用的结构和表示符号

(3)SNMP报文协议

SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap 。

(1)Get-Request 、Get-Next-Request与Get-Response

SNMP 管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next- Request用于和Get-Request组合起来查询特定的表对象中的列元素。

(2)Set-Request

SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。

(3)Trap

SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生,如接口UP/DOWN,IP地址更改等。

上面五种消息中Get-Request、Get-Next-Request和Set-Request是由管理站发送到代理侧的161端口的;后面两种Get-Response和Trap 是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。SNMP工作流程如图2:

SNMP报文格式

SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。

在实际网络传输环境下,SNMP报文的长度取决于其所采用的编码方式。SNMP统一采用BER(Basic Encoding Rule)的编码规则,同时在正式SNMP规范中使用的是ASN.1语法,定义了很多数据类型。

SNMP报文在传输层是封装在UDP报文中的,而UDP又是基于IP网络的,因此,我们可以得到完整的报文描述结构,如下图所示:

SNMP Trap

SNMP Trap 就是被管理设备主动发送消息给 NMS 的一种机制

SNMP Trap 是 SNMP 的一部分,当被监控段出现特定事件,可能是性能问题,甚至是网络设备接口宕掉等,代理端会给管理站发告警事件。假如在特定事件出现的时刻,不是由 Agent 主动通知 NMS,那么 NMS 必须不断地对 Agent 进行轮询。这是非常浪费计算资源的方法,正如人们用中断通知 CPU 数据的到达,而不是让 CPU 进行轮询一样。Trap 通知是更加合理的选择。

NET-SNMP

一种开放源代码的 SNMP 协议实现,也包含SNMP Trap的所有相关实现

实战演练

Agent

NMS

实现过程

获取 CPU占用率


// 空闲CPU占用百分比

void get_cpu_idle(unsigned int clientreg, void *clientarg)

{

	char buffer[80];

	const char* cpu_cmd = "mpstat -u -P ALL |grep all | awk ‘{print $12}‘";

	executeCMD(cpu_cmd, buffer);

	float cpu_idle = atof(buffer);

 

        // 获取CPU阈值

	std::string max_cpu_idle_per_str;

	int max_cpu_idle_per = -1;

	if (get_section_val("cpu", "max_cpu_idle_per", max_cpu_idle_per_str) == 0)

		max_cpu_idle_per = atoi(max_cpu_idle_per_str.c_str());

 

	float cpu_util_rate = 100 - cpu_idle;

	if (cpu_util_rate > max_cpu_idle_per && max_cpu_idle_per > 0)

	{

                // 发送告警信息

		String msg;

		msg.format("Warning: CPU utilization rate(%%) is %.2f%%", cpu_util_rate);	

		send_msg(msg);

	}

	    

}

注册定时器


// 注册定时器

snmp_alarm_register(SEND_WARNING_TIME,     /* seconds ,可自行设置时间间隔*/

	                    SA_REPEAT,       /*repeat. */

	                    get_cpu_idle,      /* our callback */

	                    NULL    /* no callback data needed */

	    );

配置文件netsnmp.conf


;;netsnmp配置文件

#session配置

[session]

#网络管理端口 ip 地址

#peername = 172.29.16.104

peername = 172.29.4.181

community = public

retries = 3

timeout = 2000

sessid = 0

# 发送警告信息间隔时间(s),默认10分钟

send_trap_time = 600

 

# cpu配置

[cpu]

# 最大空闲CPU占用百分比

max_cpu_idle_per = 80 

 

# 内存配置

[memory]

# 最大内存使用率(小数表示)

max_memory_used_per = 1 

 

# 磁盘配置

[disk]

# 是否记录磁盘信息(1:是,0:否),默认为0

is_record_disk_info = 0 

 

# oid配置(不要轻易修改)

[oid]

# 企业 oid

oid_enterprise = 1,3,6,1,4,1,2021,251,1

# 发送信息oid

oid_send_msg = 1,3,6,1,2,1,1,6,0

# 信息 oid

oid_msg = .1.3.6.1.6.3.1.1.4.1.105

发送告警信息:sent_msg

int send_traps(oid* oid_msg_para, size_t oid_msg_para_len, const char msg_type, const char* msg)

{

String oid_enter = oid_enterprise;

vector<String> oid_enter_vec;

oid_enter.split(",", oid_enter_vec);

oid* objid_enterprise = new oid[oid_enter_vec.size()];

int i = 0;

for (vector<String>::iterator iter = oid_enter_vec.begin(); iter != oid_enter_vec.end(); ++iter, ++i)

{

String num = *iter;

int i_num = atoi(num.getCStr());

objid_enterprise[i] = i_num;

}

printf("oid_enterprise_len: %d\n", (int)oid_enter_vec.size());

oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };

// const char * msg_oid_ = ".1.3.6.1.6.3.1.1.4.1.1";

netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DEFAULT_PORT, SNMP_TRAP_PORT);

netsnmp_session* sess = snmp_open(&session);

if (NULL == sess)

{

snmp_sess_perror("snmptraps", &session);

}

// 这里应该抛给应用端来判断是否超过预期值,发送告警信息

netsnmp_pdu* pdu;

pdu = snmp_pdu_create(SNMP_MSG_TRAP2);

pdu->enterprise = (oid *) malloc(sizeof(objid_enterprise));

memcpy(pdu->enterprise, objid_enterprise,

sizeof(objid_enterprise));

pdu->enterprise_length = oid_enter_vec.size();

snmp_add_var(pdu, objid_snmptrap, sizeof(objid_snmptrap) / sizeof(oid), MSG_OID, oid_msg_.c_str());

snmp_add_var(pdu, oid_msg_para, oid_msg_para_len, msg_type, msg);

int status = snmp_send(sess, pdu) == 0;

if (NULL != sess)

{

snmp_close(sess);

}

if (status == STAT_SUCCESS)

{

return SNMP_SUCESS;

}

return SNMP_FAILED;

}

// 发送告警信息

void send_msg(String& msg)

{

String oid_msg_local = oid_send_msg;

vector<String> oid_msg_vec;

oid_msg_local.split(",", oid_msg_vec);

oid *oid_msg = new oid[oid_msg_vec.size()];

int i = 0;

for (vector<String>::iterator iter = oid_msg_vec.begin(); iter != oid_msg_vec.end(); ++iter, ++i)

{

String num = *iter;

int i_num = atoi(num.getCStr());

oid_msg[i] = i_num;

}

printf("oid_msg_len: %d\n", (int)oid_msg_vec.size());

size_t oid_msg_len = oid_msg_vec.size();//OID_LENGTH(oid_msg);

send_traps(oid_msg, oid_msg_len, MSG_STR, (char*)msg.getCStr());

}

小结

结合ipmi和snmp实现服务器告警系统

时间: 2024-07-31 01:30:54

服务器状态监控之snmp&ipmi的相关文章

Jmeter压力测试简单教程(包括服务器状态监控)

前段时间公司需要对服务器进行压力测试,包括登录前的页面和登录后的页面,主要目的是测试负载均衡的实现效果.不知道是不是因为Jmeter不如loadRunner火爆还是什么,网上关于Jmeter的资料有很多但是大多千篇一律,要么简单弄个页面测试一下,要么全篇都是介绍很多和Jmeter无关的第三方工具,看起来很专业高深,但是作为测试小白来说,看到这样的东西确实头疼.我只是想好好了解一下Jmeter的使用啊,能不能完整的介绍一下啊?我不需要了解那么多其他的第三方工具啊?能不能截个图说的清楚一点啊?这个步

采用Opserver来监控你的ASP.NET项目系列(三、监控你的服务器状态)

前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来介绍一下,如何使用Opserver监控我们的服务器状态. Opserver的功能其实很强大,他可以用于连接任何支持Bosun, Orion, or direct WMI监控数据. 大概效果如下: 正文 1.通过Windows自带的WMI监控服务器 首先,我们找到相关的配置文件,修改配置文件的名称 DashboardSettings.json.example 为 DashboardSettings

linux下使用smtp+shell脚本实现服务器存活状态监控

简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输email的事实标准, SMTP是一个相对简单的基于文本的协议.在其之上指定了一条消息的一个或多个接收者,然后消息文本会 被传输.SMTP使用TCP端口25. 一.配置环境 [[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) #查看系统环境 [[email prot

服务器远程监控管理(四)-统一监控管理

前几章介绍了DELL服务器的远程管理功能(以DELL为例,HP,IBM等也都有类似的功能模块),当我们服务器很多的时候,我们不可能每天每台服务器都去查看一下硬件状态,因此我们希望有一个统一的平台,硬件有问题时自动给我们发一个警报邮件,或者我们每天登上统一平台扫一眼,无警报信息,我们就可以安心做其他事情去了. DELL提供了一个这样的统一管理平台软件,而且是免费的(个别高级功能需收费,但一般免费的功能即可满足日常监控使用).这个软件就是:OpenManage Essentials . 先来看看界面

自动化运维工具之Zabbixzabbix发现_自动注册及web页面状态监控(四)

网络发现(Network Discovery) **网络发现是zabbix最具有特色的功能之一,它能根据用户实现定义好的规则自动添加监控主机和服务等 -->speed up Zabbix deployment -->simplify administration -->use Zabbix in rapidly changing environments without excessive administration **Zabbix的网络发现功能可基于如下信息进行: -->IP

在服务器本地监控服务端口命令之ss

在服务器本地监控服务端口命令之ss 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢.可能你不会有 切身的感受,但当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间.天 下武功唯快不破.ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag.tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中 第一手的信息,这就确保了ss的快捷高效.当然,如果你的系统中

Zabbix添加对Linux服务器的监控(Zabbix-Agent)

Zabbix监控系统提供两种监控Linux主机的方法,一种是启用主机上的SNMP协议,另一种是在主机上安装Zabbix Agent服务,本篇介绍Linux系统下Zabbix Agent的安装与使用. 环境:Zabbix 3.2.10,Zabbix服务器使用的CentOS7 被监控的服务器使用的同为CentOS7 1:安装Zabbix-Agent RPM安装的好处是配置文件默认是zabbix_agentd.conf,并且已经将Zabbix Agent加入到系统服务中. 这样可以直接编辑/etc/z

支持万台服务器分布式监控系统原始手稿

作者:付炜超 如果你本来打算做一个特别牛的东西,最终不管什么原因没做到,但是你实现的也够cool了! 需求分析: 随着现在的企业不断的发展壮大,大多数的企业都出现了分公司.办事处这类的分支机构,由于总公司还要求对下面子公司的网络设备.主机等资源的状态有着相关的了解,所以就要求IT运维部门对不在同一地域的网络.主机等资源都要进行监控. 功能分析: 1.一个监控系统往往需要集成资产管理,可以从逻辑上展示业务和功能的信息,通过对其进行数据分析,做到对投资与回报的一个反馈展示,为资产的合理规划与使用提供

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va