当前位置:文档之家› 服务器状态监控之snmp

服务器状态监控之snmp

服务器状态监控之snmp&ipmi一、ipmi1、简介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_msghandlermodprobe ipmi_devintfmodprobe ipmi_simodprobe ipmi_poweroffmodprobe ipmi_watchdog(3)ipmi管理工具选择的是Linux 下的命令行方式的ipmi 平台管理工具ipmitool,开源的还有很多,如:ipmiutilipmitool通过OpenIPMI接口来访问BMC,实现对服务器的两种管理方式:(1)通过OS 监控本地服务器;(2)通过网络监控远程服务器本地服务管理:系统结构监控本地命令格式:ipmitool -I open command,其中-I Opencommand有以下项: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二、snmp1、简介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,因而该变量的名字为.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-ResponseSNMP 管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。

Get-Next- Request用于和Get-Request组合起来查询特定的表对象中的列元素。

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

(3)TrapSNMP代理使用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 TrapSNMP Trap 就是被管理设备主动发送消息给NMS 的一种机制SNMP Trap 是SNMP 的一部分,当被监控段出现特定事件,可能是性能问题,甚至是网络设备接口宕掉等,代理端会给管理站发告警事件。

假如在特定事件出现的时刻,不是由Agent 主动通知NMS,那么NMS 必须不断地对Agent 进行轮询。

这是非常浪费计算资源的方法,正如人们用中断通知CPU 数据的到达,而不是让CPU 进行轮询一样。

Trap 通知是更加合理的选择。

NET-SNMP一种开放源代码的SNMP 协议实现,也包含SNMP Trap的所有相关实现实战演练AgentNMS实现过程获取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.104peername = 172.29.4.181community = publicretries = 3timeout = 2000sessid = 0# 发送警告信息间隔时间(s),默认10分钟send_trap_time = 600# cpu配置[cpu]# 最大空闲CPU占用百分比max_cpu_idle_per = 80# 内存配置[memory]# 最大内存使用率(小数表示)max_memory_used_per = 1# 磁盘配置[disk]# 是否记录磁盘信息(1:是,0:否),默认为0is_record_disk_info = 0# oid配置(不要轻易修改)[oid]# 企业 oidoid_enterprise = 1,3,6,1,4,1,2021,251,1# 发送信息oidoid_send_msg = 1,3,6,1,2,1,1,6,0# 信息 oidoid_msg = .1.3.6.1.6.3.1.1.4.1.105发送告警信息:sent_msgint 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实现服务器告警系统。

相关主题