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