Chinaunix首页 | 论坛 | 博客
  • 博客访问: 656860
  • 博文数量: 845
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5015
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:22
文章分类

全部博文(845)

文章存档

2011年(1)

2008年(844)

我的朋友

分类:

2008-10-15 16:32:51

    JRobin是一个很强大的和用图形展示基于时间序列数据的工具。只要有合适的需求,能够提供提供满足这些需求的数据,JRobin就能合理地这些数据,并且生成非常漂亮的图形。

    在基于JRobin的应用中,最主要的工具并不在于JRobin,而是如何设计应用和使用代码采用相应的手段获取感兴趣的数据。通过在中执行外部命令来获取Ping的响应时间。本文的应用旨在对计算机CPU的使用率进行监视,因为如何在和Linux上获取CPU的使用率就成为了关键要解决的问题。

    1、在上获取CPU使用率:

    WMI提供了在Windows上获取计算机各种有用信息的接口,尤其可以利用WMI来获取计算机性能有关的数据。可以用通过Win32_Processor对象来获取CPU的使用率,该对象LoadPercentage属性保存了相应CPU的负载情况。在本例中,将计算机上各个CPU使用率进行简单平均,既是该计算机CPU的使用率。


脚本如下:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor ",,48)
load = 0
n = 0
For Each objItem in colItems
load = load + objItem.LoadPercentage
n = n + 1
Next
Wscript.Echo (load/n)

该最后脚本输出CPU平均使用率,Java程序可以执行该脚本获取标准输出,得到CPU平均使用率。

2、在Linux上获取CPU使用率:

Linux操作系统的/proc文件系统提供了与系统和进程有关的信息。通过访问/proc/stat就可以获取CPU的使用情况。其bash脚本如下:

user=`cat /proc/stat | head -n 1 | awk '{print $2}'`
nice=`cat /proc/stat | head -n 1 | awk '{print $3}'`
system=`cat /proc/stat | head -n 1 | awk '{print $4}'`
idle=`cat /proc/stat | head -n 1 | awk '{print $5}'`
iowait=`cat /proc/stat | head -n 1 | awk '{print $6}'`
irq=`cat /proc/stat | head -n 1 | awk '{print $7}'`
softirq=`cat /proc/stat | head -n 1 | awk '{print $8}'`
let used=$user+$nice+$system+$iowait+$irq+$softirq
let total=$used+$idle
echo $used $total

该脚本最后输出自机器启动以来,CPU总共使用的时间和总共运行时间。要想获取CPU使用率,还需要作进行一步处理。处理步骤如下:

(1)运行脚本,得到相应数据:1000 10000

(2)sleep 60秒

(3)运行脚本,得到相应数据:7000 70000

(4)那么在这段时间内,CPU的使用率就等于:(7000 - 1000)/(70000 - 10000)= 10%。

(5)定时运行脚本,就可以得到每个时段CPU的使用率。

3、与获取Ping响应时间代码的异同:

这两个程序实现的功能基本类似,就是获取数据,利用JRobin保存和画图。其中利用JRobin保存和画图的功能除了保存的数据源、显示的文本信息不同以外,其他都是相同的。他们最大的不同在于获取和处理数据的方式。

在WIndows下,Ping程序利用Ping命令来获取数据,而CPU监视程序则使用VBScript利用WMI接口通过CScript.EXE执行脚本来实现。

在Linux下,不能直接获取CPU使用率信息,需要在下一次获取到CPU使用信息时,对数据进行进一步出来才能得到。

4、看看成果:

5、事例代码:

import java.awt.Color;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Logger;

import org.jrobin.core.RrdDb;
import org.jrobin.core.RrdDef;
import org.jrobin.core.Sample;
import org.jrobin.graph.RrdGraph;
import org.jrobin.graph.RrdGraphDef;

public class CPUMonitor {

public static String[] execute(String[] commands) {
String[] strs = null;
File scriptFile = null;
try {
List cmdList = new ArrayList();
String osName = System.getProperty("os.name");
if (osName.indexOf("Windows") > -1) {
scriptFile = File.createTempFile("monitor", ".vbs");
cmdList.add("CMD.EXE");
cmdList.add("/C");
cmdList.add("CSCRIPT.EXE");
cmdList.add("//NoLogo");
} else {
scriptFile = File.createTempFile("monitor", ".sh");
cmdList.add("/bin/bash");
}
String fileName = scriptFile.getCanonicalPath();
PrintWriter writer = new PrintWriter(scriptFile);
for (int i = 0; i < commands.length; i++) {
writer.println(commands[i]);
}
writer.flush();
writer.close();
cmdList.add(fileName);

writer.flush();
writer.close();
cmdList.add(fileName);

ProcessBuilder pb = new ProcessBuilder(cmdList);
Process p = pb.start();

p.waitFor();

String line = null;
BufferedReader stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
List stdoutList = new ArrayList();
while ((line = stdout.readLine()) != null) {
stdoutList.add(line);

[1]   

【责编:Chuan】

--------------------next---------------------

阅读(320) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~