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

发布于 2021-11-21 10:16:07 字数 2090 浏览 1071 评论 9

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

   

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

       
QQ图片20130717162749.jpg 

      大家可以看到MemTotal: 2071272KB 

                       MemFree:97972KB

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

      
QQ截图20130717162809.png 

     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:

    
QQ截图20130717165520.png 

     可以看到: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,内存,磁盘利用率等一些问题的方法。

   谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

无法言说的痛 2021-11-27 07:51:20

snmp4j要求知道硬件的什么号吧?不是很通用,之前研究过,想用来监控路由,结果需要知道路由的一个什么号,而且每个厂商还不一样。

永不分离 2021-11-27 07:45:45

谢谢, 我现在的这个项目,就是使用snmp进行网络控制的,真的谢谢!

甜扑 2021-11-27 07:44:55

这段代码挺好的, 请问: snmp获得常用 信息的OID都有哪些? 

比如下面这个,是获取cpu信息的,但是执行不了

.1.3.6.1.4.1.2021.11.9.0

伴我心暖 2021-11-27 07:44:40

如上图所示:第三组CPU负载的值相加再平均一下就得到的是当前CPU的占用率。

有不明白的再问我吧!

谢绝鈎搭 2021-11-27 07:34:03

你说的那三个值的平均值 是 list 里面 3个list 和平均值?比如list里面的数据时{[1, 2],[0.0, 0.0],[8, 10]} 那么平均值是((1+2)+(0+0)+(8+10))/3=10.5?

明月松间行 2021-11-27 07:29:11

回复
获取得到CPU相关信息的List集合即:getvalue. 取出最后一组: List tempLs = (List) ls.get(2);// 存放负载对应值 然后for循环遍历出来并相加除以4就是得到当前CPU的使用率了!

风柔一江水 2021-11-27 07:17:22

回复
好吧!共同学习!243913595

流心雨 2021-11-27 07:02:47

谢谢各位园友的高见,我对cpu利用率的计算方法有点不了解,请看猛击~ 博客园HighChartS cpu利用率动态图(Java版)http://www.cnblogs.com/haifg/p/3217699.html 文章最后给出的方法,时间间隔怎么定,项目中cup利用率是怎么算的?是文章给出的第一种方法吗?

坚持沉默 2021-11-25 15:57:07
/**
 * 获取网络设备信息的公共函数
 * @param oip
 * @param stOID
 * @return list
 */
private List getSNMPList(String oip,String stOID) {
	Target target = getTarget(oip + "/" + "161");
	List list = null;
	try {
		//Example for Sending an Asynchronous Message
		DefaultUdpTransportMapping udpTransportMap = new DefaultUdpTransportMapping();
		//udpTransportMap.listen(); 
		Snmp snmp = new Snmp(udpTransportMap);
		snmp.listen();

		PDUFactory pf = new DefaultPDUFactory(PDU.GET);
		TableUtils tu = new TableUtils(snmp, pf);
		OID[] columns = new OID[1];
		columns[0] = new VariableBinding(new OID(stOID)).getOid();
		list = tu.getTable(target, columns, null, null);
		
		snmp.close();
	}catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}catch (IOException e) {
		e.printStackTrace();
	}catch (Exception e) {
		e.printStackTrace();
	}
	return list;
}
/**
 * 获取CPU信息
 * @param oip
 * @return getvalue
 */
public List getSNMP_CPU(String oip) {
	List getvalue = new ArrayList();
	try {
		String CPU_OID = ".1.3.6.1.2.1.25.3.3";//查看CPU信息的OID值
		List list = getSNMPList(oip,CPU_OID);
		List SylLs = new ArrayList();//存放组集合
		List OidLs = new ArrayList();//存放OID的索引值对应值
		List tempLs = new ArrayList();//存放负载对应值
		for (int i = 0; i < list.size(); i++) {
			TableEvent te = (TableEvent) list.get(i);
			VariableBinding[] vb = te.getColumns();
			if(vb==null){
				return null;
			}else{
				for (int j = 0; j < vb.length; j++) {
					String _sid = vb[j].getOid().toString().substring(21,22).trim();//获取键
					String _oid = vb[j].getOid().toString().substring(23,24).trim();//获id
					Variable _s = vb[j].getVariable();
					String _sva = "";
					//类型判断
					if (_s instanceof OctetString) {
						_sva = new String(((OctetString)_s).getValue(),"UTF-8");
					}else{
						_sva = _s.toString();
					}
					if(Integer.parseInt(_sid)==1){//OID的索引值
						OidLs.add(_oid);
						SylLs.add(_sva);
					}
					if(Integer.parseInt(_sid)==2){
						tempLs.add(_sva);
					}
				}
			}
		}
		getvalue.add(OidLs);
		getvalue.add(SylLs);
		getvalue.add(tempLs);
	}catch (NumberFormatException e) {
		e.printStackTrace();
	}catch (UnsupportedEncodingException e) {
		e.printStackTrace();
	}catch (IOException e) {
		e.printStackTrace();
	}catch (IllegalArgumentException e) {
		e.printStackTrace();
	}catch (RuntimeException e) {
		e.printStackTrace();
	}catch (Exception e) {
		e.printStackTrace();
	}
	return getvalue;
}
以上是通过SNMP4J获取CPU的方法,得到的三个值的平均值就是你现在CPU占用率了,你可以写一个线程来单独跑这个函数,就可以实时的显示CPU占用率。
公共实现函数已经给你,获取其他信息和获取CPU的方法大致一样,传对应的OID号,解析即可得到!
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文