java linux获取实时cpu_[转]java取得Linuxcpu,内存,磁盘实时信息
发布日期:2021-06-24 12:40:57 浏览次数:2 分类:技术文章

本文共 7382 字,大约阅读时间需要 24 分钟。

Java代码

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.StringTokenizer;

/**

* 取得linux系统下的cpu、内存信息

*

* */

public 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(1000);

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));

}

}

/**

* 测试类

*

*

@author javer QQ:84831612

* @date 2005

*/

public class JaverTest

{

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());

}

}

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.StringTokenizer;

/**

* 取得linux系统下的cpu、内存信息

*

* */

public 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(1000);

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));

}

}

/**

* 测试类

*

*

@author javer QQ:84831612

* @date 2005

*/

public class JaverTest

{

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());

}

} (http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤,似乎比较麻烦。本来也想直接调用sar、vmstat之类的命令,parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本 parse它们的结果,那还不如直接去系统里面获得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代码,找到监测性能的数据所在。

1、CPU

在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是: user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在,CPU的每tick用在了哪里。例如:

cpu0 256279030 0 11832528 1637168262

就是cpu0从开机到现在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想计算单位时间(例如1s)里面CPU的负载,那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。gkrellm就是这样实现的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2

例如,第一次读取/proc/stat,user的值是256279030;一秒以后再读一次,值是256289030,那么CPU在这一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。

2、内存消耗

文件"/proc/meminfo"里面包含的就是内存的信息,还包括了swap的信息。例如:

$ cat /proc/meminfo

total:    used:    free:  shared: buffers:  cached:

Mem:  1057009664 851668992 205340672        0 67616768 367820800

Swap: 2146787328 164429824 1982357504

MemTotal:      1032236 kB

MemFree:        200528 kB

MemShared:           0 kB

……

不过从gkrellm的源代码看,有些版本没有前面那两行统计的信息,只能够根据下面的Key: Value这种各式的数据收集。

3、磁盘空间

从gkrellm的源代码看,这个是一个很复杂的数据。磁盘分区的数据有可能分布在:/proc/mounts、/proc/diskstats、 /proc/partitions等等。而且如果想要检查某几个特定的路径,还需要通过mount、df等命令的帮助。为了减少麻烦,这个数据我就直接用 statfs函数直接获得了。

int statfs(const char *path, struct statfs *buf);

这个函数只需要输入需要检查的路径名称,就可以返回这个路径所在的分区的空间使用情况:

总空间:buf.f_bsize * buf.f_blocks

空余空间:buf.f_bsize * buf.f_bavail

4、磁盘I/O

磁盘I/O的数据也同样比较复杂,有些版本看/proc/diskstats,有些版本看/proc/partitions,还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样,需要隔一段时间取值,两次取值的差就是流量。

5、网络流量

网络流量也是五花八门,不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论

转载地址:https://blog.csdn.net/weixin_32804237/article/details/114128199 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:%02x java_java基础---->Java的格式化输出
下一篇:棋盘覆盖问题 java_java解决棋盘覆盖问题

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月03日 04时36分59秒