使用JAVA SNMP监控HP UNIX的CPU和内存

本文介绍如何使用SNMP协议获取HP-UNIX系统的内存和CPU使用情况。提供了具体OID及Java实现代码,展示如何计算内存使用率和CPU利用率。

        通过SNMP协议访问HP-UNIX的内存/CPU使用情况的OID为:
          "1.3.6.1.4.1.11.2.3.1.1.7.0      //FreeMemory
          "1.3.6.1.4.1.11.2.3.1.1.8.0"     //TotalMemory
          "1.3.6.1.4.1.11.2.3.1.1.13.0"    //CPUUser
          "1.3.6.1.4.1.11.2.3.1.1.14.0"    //CPUSystem
          "1.3.6.1.4.1.11.2.3.1.1.15.0"    //CPUIdle
          "1.3.6.1.4.1.11.2.3.1.1.16.0"    //CPUNice
        其中前两项为数量值,以KB为单位,所以可以很方便的取到内存使用情况。后四项时计数项,所以要计算CPU的使用率,就比较麻烦了。

        通过使用JAVA SNMP包(网上可以找到),可以方便的连接到要监控的机器上:

=================================================
  private SNMPv1CommunicationInterface _snmpConn;
  private long _lOldIdle = 0;
  private long _lOldSystem = 0;
  private long _lOldNice = 0;
  private long _lOldUser = 0;
  
  public static void main(String[] sArgs)
  {
   InetAddress hostAddress = InetAddress.getByName("127.0.0.1");  //machine ip
   SNMPv1CommunicationInterface snmpConn = new SNMPv1CommunicationInterface(0, hostAddress, "public");
   while(true)
   {
    try
    {
     double[] dCpu = getCPUInfo();
     long[] lMemory = getMemoryInfo();
     System.out.println("values");     //将这些值输出到屏幕,也可以到文档或数据结构中
     Thread.sleep(1000);               //每秒取一次,可以自行调整
    }
    catch(Exception E)
    {
     E.printStackTrace();
    }
   }
  }
  
       //取得CPU空闲率,使用率(User/System/Nice)
       //需要保存上一个监控点的计数,再将本次监控的值减去上一个监控点的计数
       //将Idel/System/User/Nice四个值相加得到总CPU计数
       //分别和Idel/System/User/Nice四个值相比就得到CPU空闲率和使用率了
  protected double[] getCPUInfo()
  {
   long lCurCpuUser = getValue("1.3.6.1.4.1.11.2.3.1.1.13.0");
   long lCurCpuSystem = getValue("1.3.6.1.4.1.11.2.3.1.1.14.0");
   long lCurCpuIdle = getValue("1.3.6.1.4.1.11.2.3.1.1.15.0");
   long lCurCpuNice = getValue("1.3.6.1.4.1.11.2.3.1.1.16.0");
   long lSubCpuUser = lCurCpuUser - _lOldUser;
   long lSubCpuSystem = lCurCpuSystem - _lOldSystem;
   long lSubCpuIdle = lCurCpuIdle - _lOldIdle;
   long lSubCpuNice = lCurCpuNice - _lOldNice;
   long lTotal = lSubCpuUser + lSubCpuSystem + lSubCpuIdle + lSubCpuNice;

   _lOldUser = lCurCpuUser;
   _lOldSystem = lCurCpuSystem;
   _lOldIdle = lCurCpuIdle;
   _lOldNice = lCurCpuNice;
   if(lTotal != 0)
   {
    double dCpuUser = (double)(lSubCpuUser * 100) / (double)lTotal;
    double dCpuSystem = (double)(lSubCpuSystem * 100) / (double)lTotal;
    double dCpuIdle = (double)(lSubCpuIdle * 100) / (double)lTotal;
    double dCpuNice = (double)(lSubCpuNice * 100) / (double)lTotal;
    return new double[]{dCpuUser, dCpuSystem, dCpuIdle, dCpuNice};
   }
   else
   {
    return new double[]{0.0, 0.0, 0.0, 0.0};
   }
  }
  
       //取得空闲物理内存和总物理内存
       //直接取得相应OID的值
       //如果要计算内存使用率,将(lSystemMemory-lFreeMemory)*100/lSystemMemory即可,计算前要转换成double型计算
  protected long[] getMemoryInfo()
  {
   long lFreeMemory = getValue("1.3.6.1.4.1.11.2.3.1.1.7.0");
   long lSystemMemory = getValue("1.3.6.1.4.1.11.2.3.1.1.8.0);
   return new long[]{lFreeMemory, lSystemMemory};
  }
  
        //通过SNMP协议取得指定OID的值
  protected long getValue(String sOID)
  {
   try
   {
    SNMPVarBindList newVars = snmpConn.getMIBEntry(sOID);
    SNMPSequence pair = (SNMPSequence)(newVars.getSNMPObjectAt(0));
    SNMPObject snmpValue = pair.getSNMPObjectAt(1);
    BigInteger biValue = (BigInteger)snmpValue.getValue();
    return biValue.longValue();
   }
   catch(Exception E)
   {
    System.out.println("Encounter exception while getting value " +
     "which OID is " + sOID + " by SNMP: " + E.getMessage());
    return 0;
   }
  }
=================================================

        结合JFreeChart等开源包,将监控结果作成图型,就比较完美了。

<think>好的,用户想了解如何使用SNMP协议监控服务器的CPU内存使用率,需要详细的方法配置步骤。首先,我需要回顾SNMP的基本原理配置流程。根据引用内容,Zabbix中配置SNMP监控涉及定义设备、配置监控项、创建触发器等步骤。同时,Java可以通过SNMP获取物理机的性能数据,说明SNMP的通用性。Linux服务器的监控可能需要安装SNMP服务并配置OID。 首先,用户可能需要知道如何在服务器上启用SNMP服务。对于Linux系统,安装snmpd并配置社区字符串安全设置是关键,如引用3提到的。接下来,确定正确的OID来获取CPU内存数据,引用24提到了一些常用的OID,比如1.3.6.1.4.1.2021.11.11.0代表CPU空闲时间,内存相关的OID在1.3.6.1.4.1.2021.4段。 然后,配置监控工具如Zabbix时,需要添加SNMP设备,设置监控项对应的OID,并创建触发器。引用1详细说明了Zabbix的步骤,包括定义设备监控项。此外,引用4提到CPU空闲时间的监控触发器的设置,这对用户可能有帮助。 可能还需要考虑不同SNMP版本的差异,比如v2c需要团体名,而v3需要更复杂的安全配置。用户可能需要根据环境选择合适的版本。另外,确保防火墙开放了SNMP端口(UDP 161)也是重要步骤,避免通信问题。 最后,验证配置是否正确,使用snmpwalk或snmpget测试OID是否能获取数据。如果用户使用Zabbix,还需要检查监控项的数据是否正常接收,并根据需求调整触发器阈值。 用户可能还会遇到如何解析Trap告警或处理MIB文件的问题,但根据问题描述,当前重点在CPU内存监控,暂时不需要深入Trap的设置。不过,引用2提到了Java获取Trap的方法,可能作为扩展知识。 总结步骤:安装配置SNMP服务、确定OID、配置监控工具、测试优化。需要确保每个步骤清晰,并提供具体命令示例,如编辑snmpd.conf文件,示例OID等。同时,注意引用相关的内容来支持步骤的正确性。</think>### 使用SNMP监控服务器CPU内存使用率的方法及配置步骤 #### 一、SNMP服务端配置(以Linux为例) 1. **安装SNMP服务** ```bash sudo apt-get install snmpd snmp snmp-mibs-downloader # Ubuntu/Debian sudo yum install net-snmp net-snmp-utils # CentOS/RHEL ``` 2. **配置SNMP参数** 编辑配置文件`/etc/snmp/snmpd.conf`,添加以下内容: ```bash rocommunity public # 设置只读团体字符串(建议替换为自定义字符串) view systemview included .1.3.6.1.4.1.2021 # 允许访问CPU/内存相关OID ``` 3. **重启服务并开放防火墙** ```bash sudo systemctl restart snmpd sudo ufw allow 161/udp # 允许SNMP流量 ``` --- #### 二、关键OID说明 | 指标 | OID | 说明 | |------------|------------------------------|-------------------------------| | CPU空闲率 | 1.3.6.1.4.1.2021.11.11.0 | 百分比形式,如`90`表示90%空闲[^4] | | 总内存 | 1.3.6.1.4.1.2021.4.5.0 | 单位:KB | | 空闲内存 | 1.3.6.1.4.1.2021.4.6.0 | 单位:KB | --- #### 三、监控工具配置(以Zabbix为例) 1. **添加SNMP主机** - 在Zabbix控制台选择`Configuration > Hosts > Create Host` - 填写主机名、IP地址,选择`SNMP`接口类型 2. **配置监控项** ```plaintext 名称: CPU空闲率 键值: snmp["1.3.6.1.4.1.2021.11.11.0"] 单位: % 名称: 内存使用率 键值: (1 - (snmp["1.3.6.1.4.1.2021.4.6.0"] / snmp["1.3.6.1.4.1.2021.4.5.0"])) * 100 单位: % ``` 3. **设置触发器** ```plaintext 名称: CPU高负载告警 表达式: {HOST:snmp["1.3.6.1.4.1.2021.11.11.0"].avg(5m)} < 20 # 空闲率<20%触发告警[^4] ``` --- #### 四、验证SNMP数据 使用命令行工具测试数据获取: ```bash snmpget -v 2c -c public 服务器IP 1.3.6.1.4.1.2021.11.11.0 # 获取CPU空闲率 snmpwalk -v 2c -c public 服务器IP 1.3.6.1.4.1.2021.4 # 遍历内存相关OID ``` ---
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值