海风bruce 2013-07-17 09:07 采纳率: 0%
浏览 1453

基于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,内存,磁盘利用率等一些问题的方法。

谢谢!

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-06 13:33
    关注

    您提到的内存信息有些矛盾是因为 /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

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?
  • ¥50 invest生境质量模块
  • ¥15 nhanes加权logistic回归,svyglm函数