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 利用率、内存利用率和磁盘利用率的方法:
下面是一个简单的 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