分类:
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
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
while ((line = stdout.readLine()) != null) {
stdoutList.add(line);
[1]