进程文件系统,procfs,是一个伪文件系统,它允许对一些非传统意义上的文件通过标准文件I/O接口进行访问。procfs将Solaris内核进程架构进行了抽象,当前系统中所有运行着的进程会在/proc/目录下有所体现。/proc/目录下的对象不是真实磁盘文件,这些对象位于内核内存中,用户执行ls(1)命令显示/proc/目录结构时,系统读取内核内存并返回相应内容。 因此我们可以利用它来计算CPU利用率和内存信息。
CPU利用率的计算方法:
总利用率: /proc/stat中的第一行;
每个CPU的利用率:/proc/stat中第二行从cpu0开始,如果只有一个CPU,那就只有cpu0
信息获取方法:
注意cpux:后面有4列数字,依次是user, nice, sys, idle的数值。
对这个文件需要读取两遍,我们用total表示累计总资源,那么user+sys就是我们想要知道的累计CPU占用的资源。每个变量后面的数字表示它是第几次读文件得到的,用如下方法可算出CPU占用率:IntCpuRate =(int)rintf(((float)((user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1))/(float)(total_2 - total_1) )*100) 。
由于两次读取的时间间隔比较短,就近似的认为这就是即时的CPU利用率。
import
java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/** */ /**
* 测试类
*/
public class Test ... {
public static void main(String[] args) throws Exception ...{
int[] memInfo = LinuxSystemTool.getMemInfo();
System.out.println("MemTotal:" + memInfo[0]);
System.out.println("MemFree:" + memInfo[1]);
System.out.println("SwapTotal:" + memInfo[2]);
System.out.println("SwapFree:" + memInfo[3]);
System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());
}
}
/** */ /**
* <p>Title: LinuxSystemTool</p>
*
* <p>Description: 取得linux系统下的cpu、内存信息</p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: wri</p>
*
* @tang
* @version 1.0
*/
final class LinuxSystemTool ... {
/** *//**
* get memory by used info
* @return int[] result
* result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;
* @throws IOException
* @throws InterruptedException
*/
public static int[] getMemInfo() throws IOException, InterruptedException ...{
File file = new File("/proc/meminfo");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
int[] result = new int[4];
String str = null;
StringTokenizer token = null;
while ( (str = br.readLine()) != null) ...{
token = new StringTokenizer(str);
if (!token.hasMoreTokens()) ...{
continue;
}
str = token.nextToken();
if (!token.hasMoreTokens()) ...{
continue;
}
if (str.equalsIgnoreCase("MemTotal:")) ...{
result[0] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("MemFree:")) ...{
result[1] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("SwapTotal:")) ...{
result[2] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("SwapFree:")) ...{
result[3] = Integer.parseInt(token.nextToken());
}
}
return result;
}
/** *//**
* get memory by used info
*
* @return float efficiency
* @throws IOException
* @throws InterruptedException
*/
public static float getCpuInfo() throws IOException, InterruptedException ...{
File file = new File("/proc/stat");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
StringTokenizer token = new StringTokenizer(br.readLine());
token.nextToken();
int user1 = Integer.parseInt(token.nextToken());
int nice1 = Integer.parseInt(token.nextToken());
int sys1 = Integer.parseInt(token.nextToken());
int idle1 = Integer.parseInt(token.nextToken());
Thread.sleep(3000);
br = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));
token = new StringTokenizer(br.readLine());
token.nextToken();
int user2 = Integer.parseInt(token.nextToken());
int nice2 = Integer.parseInt(token.nextToken());
int sys2 = Integer.parseInt(token.nextToken());
int idle2 = Integer.parseInt(token.nextToken());
return (float) ( (user2 + sys2 + nice2) - (user1 + sys1 + nice1)) /
(float) ( (user2 + nice2 + sys2 + idle2) -
(user1 + nice1 + sys1 + idle1));
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/** */ /**
* 测试类
*/
public class Test ... {
public static void main(String[] args) throws Exception ...{
int[] memInfo = LinuxSystemTool.getMemInfo();
System.out.println("MemTotal:" + memInfo[0]);
System.out.println("MemFree:" + memInfo[1]);
System.out.println("SwapTotal:" + memInfo[2]);
System.out.println("SwapFree:" + memInfo[3]);
System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());
}
}
/** */ /**
* <p>Title: LinuxSystemTool</p>
*
* <p>Description: 取得linux系统下的cpu、内存信息</p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: wri</p>
*
* @tang
* @version 1.0
*/
final class LinuxSystemTool ... {
/** *//**
* get memory by used info
* @return int[] result
* result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;
* @throws IOException
* @throws InterruptedException
*/
public static int[] getMemInfo() throws IOException, InterruptedException ...{
File file = new File("/proc/meminfo");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
int[] result = new int[4];
String str = null;
StringTokenizer token = null;
while ( (str = br.readLine()) != null) ...{
token = new StringTokenizer(str);
if (!token.hasMoreTokens()) ...{
continue;
}
str = token.nextToken();
if (!token.hasMoreTokens()) ...{
continue;
}
if (str.equalsIgnoreCase("MemTotal:")) ...{
result[0] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("MemFree:")) ...{
result[1] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("SwapTotal:")) ...{
result[2] = Integer.parseInt(token.nextToken());
}
else if (str.equalsIgnoreCase("SwapFree:")) ...{
result[3] = Integer.parseInt(token.nextToken());
}
}
return result;
}
/** *//**
* get memory by used info
*
* @return float efficiency
* @throws IOException
* @throws InterruptedException
*/
public static float getCpuInfo() throws IOException, InterruptedException ...{
File file = new File("/proc/stat");
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
StringTokenizer token = new StringTokenizer(br.readLine());
token.nextToken();
int user1 = Integer.parseInt(token.nextToken());
int nice1 = Integer.parseInt(token.nextToken());
int sys1 = Integer.parseInt(token.nextToken());
int idle1 = Integer.parseInt(token.nextToken());
Thread.sleep(3000);
br = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));
token = new StringTokenizer(br.readLine());
token.nextToken();
int user2 = Integer.parseInt(token.nextToken());
int nice2 = Integer.parseInt(token.nextToken());
int sys2 = Integer.parseInt(token.nextToken());
int idle2 = Integer.parseInt(token.nextToken());
return (float) ( (user2 + sys2 + nice2) - (user1 + sys1 + nice1)) /
(float) ( (user2 + nice2 + sys2 + idle2) -
(user1 + nice1 + sys1 + idle1));
}
}