日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

服务器状态监控之snmp&ipmi

發布時間:2024/4/24 综合教程 71 生活家
生活随笔 收集整理的這篇文章主要介紹了 服务器状态监控之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
", (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
", (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實現服務器告警系統

總結

以上是生活随笔為你收集整理的服务器状态监控之snmp&amp;ipmi的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。