您的位置:首页 > 运维架构 > Linux

java对Linux系统的CPU利用率的计算和内存信息的获取

2007-09-07 10:39 771 查看
进程文件系统,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));


}


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: