基于snmp4j取得linux系统的cpu、ram信息

sorry,由于传图片比较麻烦,问题请见:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4091102&extra=

ps:希望做过snmp的大拿能过来解答一下。

  菜鸟通过 cat /proc/meminfo 得到linux系统的内存信息:



  大家可以看到MemTotal: 2071272KB 
                   MemFree:97972KB

 下面菜鸟同snmp4j得到的内存信息:

2013-07-17 16:51 上传下载附件 (35.39 KB)

 1.3.6.1.4.1.2021.4.5.0 = 2071272
 1.3.6.1.4.1.2021.4.6.0 = 97964
 1.3.6.1.4.1.2021.4.11.0 = 4259492

 具体的OID信息可以看这里:http://blog.sina.com.cn/s/blog_77c854670100qwso.html

给大家截了一个内存信息的OID:



 可以看到:Total RAM Free: .1.3.6.1.4.1.2021.4.11.0 
               Total RAM used: .1.3.6.1.4.1.2021.4.6.0
菜鸟不知为什么会出现矛盾的地方:通过 “cat /proc/meminfo” 得到 MemFree:97972KB,而通过snmp4j得到Total RAM Free:1.3.6.1.4.1.2021.4.11.0 = 4259492,然而却与Total RAM used: .1.3.6.1.4.1.2021.4.6.0 =  97964 大致相同(肯定会有些许不同),不知道这是为什么?

大拿一定会知道的,望解答!

告诉菜鸟一下snmp4j计算cpu,内存,磁盘利用率等一些问题的方法。

谢谢!

您提到的内存信息有些矛盾是因为 /proc/meminfo 和 SNMP4j 获取内存信息的方式不同。


/proc/meminfo 获取内存信息是通过读取系统内存管理的数据结构来得到的,而 SNMP4j 获取内存信息是通过获取网络管理协议 (SNMP) 的内存信息对象标识符 (OID) 来得到的。这两者之间会有一些差异,因此您得到的信息会有些不同。


下面是 SNMP4j 获取 CPU 利用率、内存利用率和磁盘利用率的方法:

  • CPU 利用率:
    对于 CPU 利用率,SNMP4j 通常使用 OID 1.3.6.1.2.1.25.3.3.1.2 来获取 CPU 的负载。该 OID 的值表示 CPU 在过去五分钟内的平均负载。
  • 内存利用率:
    对于内存利用率,SNMP4j 通常使用 OID 1.3.6.1.4.1.2021.4.6 和 OID 1.3.6.1.4.1.2021.4.5 来获取内存使用情况。其中,OID 1.3.6.1.4.1.2021.4.6 表示当前已使用的内存量,OID 1.3.6.1.4.1.2021.4.5 表示系统的总内存量。
  • 磁盘利用率:
    对于磁盘利用率,SNMP4j 通常使用 OID 1.3.6.1.2.1.25.2.3.1.3 和 OID 1.3.6.1.2.1.25.2.3.1.4 来获取磁盘使用情况。其中,OID 1.3.6.1.2.1.25.2.3.1.3 表示磁盘总容量,OID 1.3.6.1.2.1.25.2.3.1.4 表示已使用的磁盘空间。

下面是一个简单的 SNMP4j 代码示例,用于获取 CPU 利用率和内存利用率信息:

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class SNMPManager
{
    // 连接参数
    private static final String PROTOCOL = "udp";
    private static final String HOST = "localhost";
    private static final int PORT = 161;
    private static final String COMMUNITY = "public";
    private static final int TIMEOUT = 5000;
    private static final int RETRIES = 0;
    private Snmp snmp = null;
    private Address targetAddress = null;
    private CommunityTarget target = null;
    // 初始化 SNMP 连接
    public void initComm() throws Exception
        {
            // 设置连接参数
            targetAddress = GenericAddress.parse(PROTOCOL + ":" + HOST + "/" + PORT);
            target = new CommunityTarget();
            target.setCommunity(new OctetString(COMMUNITY));
            target.setAddress(targetAddress);
            target.setRetries(RETRIES);
            target.setTimeout(TIMEOUT);
            target.setVersion(SnmpConstants.version2c);
            // 创建 transport mapping 和 snmp 对象
            TransportMapping transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            transport.listen();
        }
        // 关闭 SNMP 连接
    public void closeComm() throws Exception
        {
            snmp.close();
        }
        // 通过 SNMP 获取信息
    public String get(OID oid) throws Exception
    {
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(oid));
        pdu.setType(PDU.GET);
        ResponseEvent event = snmp.send(pdu, target);
        if(event != null)
        {
            PDU responsePDU = event.getResponse();
            if(responsePDU != null)
            {
                int errorStatus = responsePDU.getErrorStatus();
                int errorIndex = responsePDU.getErrorIndex();
                String errorStatusText = responsePDU.getErrorStatusText();
                if(errorStatus == PDU.noError)
                {
                    return responsePDU.getVariableBindings().firstElement().toValueString();
                }
                else
                {
                    System.out.println("Error: " + errorStatusText);
                }
            }
        }
        return null;
    }
    public static void main(String[] args) throws Exception
    {
        SNMPManager manager = new SNMPManager();
        manager.initComm();
        // 获取 CPU 利用率
        OID oidCpuUsage = new OID(".1.3.6.1.2.1.25.3.3.1.2");
        String cpuUsage = manager.get(oidCpuUsage);
        System.out.println("CPU usage: " + cpuUsage + "%");
        // 获取内存利用率
        OID oidMemTotal = new OID(".1.3.6.1.4.1.2021.4.5.0");
        String memTotal = manager.get(oidMemTotal);
        OID oidMemUsage = new OID(".1.3.6.1.4.1.2021.4.6.0");
        String memUsage = manager.get(oidMemUsage);
        double memoryUsage = Double.parseDouble(memUsage) / Double.parseDouble(memTotal) * 100;
        System.out.println("Memory usage: " + memoryUsage + "%");
        manager.closeComm();
    }
}

此外,如果您希望了解更多关于 SNMP4j 的使用,可以参考 SNMP4j 官方文档:https://www.snmp4j.org/doc/index.html