来源:http://www.cnblogs.com/haifg/p/3217699.html

 

最近项目需要监控服务器cpu的利用率,并做成动态图。在网上查找了一些资料,最终选择了HighChartS来做动态图。

HIghChartS官网:http://www.highcharts.com/

HighCharts Demo:http://www.highcharts.com/demo/

项目中参考的Demo:http://www.highcharts.com/demo/dynamic-update

完成这个cpu利用率的动态图,做了一个小的Demo,分为三层:界面层(jsp),控制层(servlet),模型层(javabean)。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page"> <script src="js/jquery.min.js"></script><!-- 1.8.2 -->
<script type="text/javascript">
$(function() {
Highcharts.setOptions({
global: {
useUTC: false
}
}); //声明报表对象 chart = new Highcharts.Chart({
chart: {
renderTo: 'container',
defaultSeriesType: 'spline',
marginRight: 10
},
title: {
text: 'CPU使用率动态曲线图'
},
xAxis: {
title: {
text: '时间'
},
//linear" or "datetime"
type: 'datetime',
//坐标间隔
tickPixelInterval: 150
},
yAxis: {
title: {
text: '使用率'
},
//指定y=3直线的样式
plotLines: [
{
value: 0,
width: 1,
color: '#808080'
}
]
},
//鼠标放在某个点上时的提示信息
//dateFormat,numberFormat是highCharts的工具类
tooltip: {
formatter: function() {
return '<b>' + this.series.name + '</b><br/>' +
Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
Highcharts.numberFormat(this.y, 4);
}
},
//曲线的示例说明,像地图上得图标说明一样
legend: {
enabled: true
},
//把曲线图导出成图片等格式
exporting: {
enabled: true
},
//放入数据
series: [
{
name: 'CPU使用率',
data: (function() {
// 初始化数据
var data = [],
time = (new Date()).getTime(),
i;
for (i = -19; i <= 0; i++) {
data.push({
x: time + i * 1000,
y: Math.random() * 100
});
}
return data;
})()
}
]
});
getCpuInfo();
});
function getCpuInfo(){
$.ajax({
url: "GetCpu",
type: "post",
dataType:'json',
success: function(data){
chart.series[0].addPoint([data.x,data.y], true, true);
}
});
}
setInterval(getCpuInfo, 1000);
</script>
</head> <body>
<script src="js/highcharts.js"></script>
<script src="js/exporting.js"></script>
<div id="container" style="min-width: 400px; height: 400px; margin: 0 auto"></div>
</body>
</html>

界面层代码

package com.highcharts.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import com.highcharts.dao.SnmpGetAsyn; public class GetCpu extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
String ip = "219.230.155.67";
String community = "public"; List<String> oidList = new ArrayList<String>();
//ssCpuRawUser
oidList.add(".1.3.6.1.4.1.2021.11.50.0");
//ssCpuRawNice
oidList.add(".1.3.6.1.4.1.2021.11.51.0");
//ssCpuRawSystem
oidList.add(".1.3.6.1.4.1.2021.11.52.0");
//ssCpuRawIdle
oidList.add(".1.3.6.1.4.1.2021.11.53.0");
//ssCpuRawWait
oidList.add(".1.3.6.1.4.1.2021.11.54.0");
//ssCpuRawKernel
//oidList.add(".1.3.6.1.4.1.2021.11.55.0");
//ssCpuRawInterrupt
oidList.add(".1.3.6.1.4.1.2021.11.56.0");
//ssCpuRawSoftIRQ
oidList.add("1.3.6.1.4.1.2021.11.61.0");
// 异步采集数据
List cpuData = SnmpGetAsyn.snmpAsynGetList(ip, community, oidList); double ssCpuRawUser = Double.parseDouble(cpuData.get(0).toString());
double ssCpuRawNice = Double.parseDouble(cpuData.get(1).toString());
double ssCpuRawSystem = Double.parseDouble(cpuData.get(2).toString());
double ssCpuRawIdle = Double.parseDouble(cpuData.get(3).toString());
double ssCpuRawWait = Double.parseDouble(cpuData.get(4).toString());
double ssCpuRawInterrupt = Double.parseDouble(cpuData.get(5).toString());
double ssCpuRawSoftIRQ = Double.parseDouble(cpuData.get(6).toString());
Map<String, Object> jsonMap = new HashMap<String, Object>();//定义map double cpuRatio = 100*(ssCpuRawUser+ssCpuRawNice+ssCpuRawSystem+ssCpuRawWait+ssCpuRawInterrupt+ssCpuRawSoftIRQ)/(ssCpuRawUser+ssCpuRawNice
+ssCpuRawSystem+ssCpuRawIdle+ssCpuRawWait+ssCpuRawInterrupt+ssCpuRawSoftIRQ); System.out.println("CPU利用率:"+cpuRatio); jsonMap.put("y",cpuRatio);
jsonMap.put("x", new Date().getTime());
JSONObject result = JSONObject.fromObject(jsonMap);//格式化result 一定要是JSONObject
out.print(result.toString());
out.flush();
out.close();
}
}

控制层代码

package com.highcharts.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping; /**
* 演示:异步GET OID值
*
* blog http://www.micmiu.com
*
* @author Michael
*
*/
public class SnmpGetAsyn { public static final int DEFAULT_VERSION = SnmpConstants.version2c;
public static final String DEFAULT_PROTOCOL = "udp";
public static final int DEFAULT_PORT = 161;
public static final long DEFAULT_TIMEOUT = 3 * 1000L;
public static final int DEFAULT_RETRY = 3; /**
* 创建对象communityTarget
*
* @param targetAddress
* @param community
* @param version
* @param timeOut
* @param retry
* @return CommunityTarget
*/
public static CommunityTarget createDefault(String ip, String community) {
Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
+ "/" + DEFAULT_PORT);
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(address);
target.setVersion(DEFAULT_VERSION);
target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
target.setRetries(DEFAULT_RETRY);
return target;
} /**
* 异步采集信息
*
* @param ip
* @param community
* @param oid
*/
public static List snmpAsynGetList(String ip, String community,
List<String> oidList) {
final List cpuData = new ArrayList();
CommunityTarget target = createDefault(ip, community);
Snmp snmp = null;
try {
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
snmp.listen(); PDU pdu = new PDU();
for (String oid : oidList) {
pdu.add(new VariableBinding(new OID(oid)));
} final CountDownLatch latch = new CountDownLatch(1);
ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
((Snmp) event.getSource()).cancel(event.getRequest(), this);
PDU response = event.getResponse();
PDU request = event.getRequest();
System.out.println("[request]:" + request);
if (response == null) {
System.out.println("[ERROR]: response is null");
} else if (response.getErrorStatus() != 0) {
System.out.println("[ERROR]: response status"
+ response.getErrorStatus() + " Text:"
+ response.getErrorStatusText());
} else {
System.out.println("Received response Success!");
for (int i = 0; i < response.size(); i++) {
VariableBinding vb = response.get(i);
/* System.out.println(vb.getOid() + " = "
+ vb.getVariable());*/
cpuData.add(vb.getVariable());
}
System.out.println("SNMP Asyn GetList OID finished. ");
latch.countDown();
}
}
}; pdu.setType(PDU.GET);
snmp.send(pdu, target, null, listener);
System.out.println("asyn send pdu wait for response..."); boolean wait = latch.await(30, TimeUnit.SECONDS);
System.out.println("latch.await =:" + wait); snmp.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("SNMP Asyn GetList Exception:" + e);
}
return cpuData; }
public static void main(String[] args) {
String ip = "219.230.155.67";
String community = "public"; List<String> oidList = new ArrayList<String>();
//ssCpuRawUser
oidList.add(".1.3.6.1.4.1.2021.11.50.0");
//ssCpuRawNice
oidList.add(".1.3.6.1.4.1.2021.11.51.0");
//ssCpuRawSystem
oidList.add(".1.3.6.1.4.1.2021.11.52.0");
//ssCpuRawIdle
oidList.add(".1.3.6.1.4.1.2021.11.53.0");
//ssCpuRawWait
oidList.add(".1.3.6.1.4.1.2021.11.54.0");
//ssCpuRawInterrupt
oidList.add(".1.3.6.1.4.1.2021.11.56.0");
//ssCpuRawSoftIRQ
oidList.add("1.3.6.1.4.1.2021.11.61.0");
// 异步采集数据
List cpuData = SnmpGetAsyn.snmpAsynGetList(ip, community, oidList); double ssCpuRawUser = Double.parseDouble(cpuData.get(0).toString());
double ssCpuRawNice = Double.parseDouble(cpuData.get(1).toString());
double ssCpuRawSystem = Double.parseDouble(cpuData.get(2).toString());
double ssCpuRawIdle = Double.parseDouble(cpuData.get(3).toString());
double ssCpuRawWait = Double.parseDouble(cpuData.get(4).toString());
double ssCpuRawInterrupt = Double.parseDouble(cpuData.get(5).toString());
double ssCpuRawSoftIRQ = Double.parseDouble(cpuData.get(6).toString()); double cpuRatio = 100*(ssCpuRawUser+ssCpuRawNice+ssCpuRawSystem+ssCpuRawWait+ssCpuRawInterrupt+ssCpuRawSoftIRQ)/(ssCpuRawUser+ssCpuRawNice
+ssCpuRawSystem+ssCpuRawIdle+ssCpuRawWait+ssCpuRawInterrupt+ssCpuRawSoftIRQ); System.out.println("CPU利用率:"+cpuRatio); }
}

模型层

浏览器访问:http://localhost:8080/HighChartTest/highChartsTest.jsp

效果如图(截取一个静态的图):

至此,基本的效果已经出来,但是还有些地方需要完善。

一、cpu的利用率的计算方法需要改变:

1、  采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1、t2的结构均为:

(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元组;

2、  计算总的Cpu时间片totalCpuTime

a)         把第一次的所有cpu使用情况求和,得到s1;

b)         把第二次的所有cpu使用情况求和,得到s2;

c)         s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = j2 - j1 ;

3、计算空闲时间idle

idle对应第四列的数据,用第二次的第四列 - 第一次的第四列即可

idle=第二次的第四列 - 第一次的第四列

6、计算cpu使用率

pcpu =100* (total-idle)/total

二、代码需要重构

ps:这个demo多有不足之处,望指出。完善版的以后奉上。

参考资料:http://www.blogjava.net/fjzag/articles/317773.html

http://www.micmiu.com/

HighChartS cpu利用率动态图(Java版)的更多相关文章

  1. 聊聊、Highcharts 动态数据优化版

    好久没来博客园了,最近项目太紧.上一篇写了 <Highcharts 之[动态数据]>,不够完善,虽然横纵轴可以动态取数据,但是行业信息是固定的,不能随着大数据热点改变.废话不说,直接上代码 ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. jstack命令定位java程序CPU利用率高的代码位置

    高手是怎么使用jstack精确找到异常代码的(java程序CPU利用率高的情况) 请jstack神器来帮忙 本文介绍Linux环境下使用jstack定位问题的秘笈1.[top命令]找到CPU利用率持续 ...

  4. Highcharts 动态图

    Highcharts 动态图 每秒更新曲线图 chart.events chart.event 属性中添加 load 方法(图表加载事件).在 1000 毫秒内随机产生数据点并生成图表. chart: ...

  5. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. 安卓开发 利用百度识图api进行物体识别(java版)

    之前的随笔中,已经实现了python版本调用api接口,之所以使用python是因为python比java要简洁. 但是我发现在使用过程中,chaquopy插件会弹出底部toast显示"un ...

  7. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  8. 网页爬虫的设计与实现(Java版)

    网页爬虫的设计与实现(Java版)     最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...

  9. Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算

    目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps ...

随机推荐

  1. VS2005保存文件很慢

    VS2005出了点毛病,边的出奇的慢,简直不可忍受. 症状是:保存文件很慢,哪怕是修改一个变量,也要等上大概20秒 保存文件的时候,VS2005会在局域网内寻找一个主机当这个主机不在线的时候vs200 ...

  2. Ibatis.Net 入门示例(一)

    新项目用的是Ibatis.Net.哥的感觉是NHibernate才是哥的最爱.没办法,即使重复,也要抽时间学习.努力做好这份工作再说吧. 一.Ibatis.Net-SQLServer2008 还是以哥 ...

  3. 企业需要k2来解放孤岛危机

    当我谈孤岛危机时,我谈些什么?你以为我要说的是一款风靡的游戏?那恐怕要让你失望了,今天要谈的是“企业管理体系孤岛”,但更多人甚至都没意识到这是危机. 下面的场景,也许你会觉得似曾相识. 场景一 某制鞋 ...

  4. 理解Mach Port

    参考文档: 1. http://robert.sesek.com/thoughts/2012/1/debugging_mach_ports.html 2. Mach 3 Kernel Interfac ...

  5. hdu1506 dp

    //Accepted 1428 KB 62 ms // #include <cstdio> #include <cstring> #include <iostream&g ...

  6. 06-图1 List Components

    这题主要涉及到了队列,无向图的邻接矩阵表示,图的深度和广度优先搜索.又是糙哥,参考了他的程序(http://www.cnblogs.com/liangchao/p/4288807.html),主要是B ...

  7. mysql 1067 启动错误!!!

    图二:服务器启动不成功 -- 解决方法

  8. Scheme vs Schema

    在计算机数据描述领域,Scheme由于原意为“主题”,“方案”,“构想”等,因此一般指比较明确的(具体的)“方案”.“体系”,例如一个术语词表.分类表等,而Schema通常翻译成“模式”,比较强调形式 ...

  9. C++11 move_iterator

    template<typename Iterator> class move_iterator { Iterator current; public: typedef Iterator i ...

  10. 王家卫i

    〈旺角卡门〉 因为我很了解我自己,我不能对你承诺什么. 你不要说两次,说两次我就相信了. 我宁愿做一日英雄,都不想成世做条虫! 厨房里有煮好的饭,另外我还买了几个杯子,我知道,用不了多久就都会被打破, ...