`
cerany
  • 浏览: 18025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

性能的对比分析(后台)

阅读更多
    持久化的数据源特性:总体上看,单个指标的数据应该按时间顺序进入持久化。可扩展的持久化框架包括:数据库持久化,文档持久化,RRD持久化。数据库持久化:只保留最新一条数据,主要用于自定义型界面;文档持久化:保留原始的历史数据;RRD持久化:主要用于历史曲线图绘制,通过图形引导进入原始数据等,可考虑和“统计类指标的实时ETL”功能进行整合。数据访问方式主要以提供对历史数据的访问为主,考虑以Restful WebServcie的方式提供界面。
     1.功能定义:
(1)持久化控制流程:控制采集数据流向和启动每天的定时服务。
(2)数据库持久化:只保留最新一条数据,主要用于自定义型界面。
(3)文档持久化:按定义的格式写入文档中。
(4)RRD持久化:每天定时把数据持久化到RRD中。使用JRobin。
(5)数据访问:提供最新数据的访问和历史数据访问。
术语:
(1)时间周期:dateCycle,规定的对比时间范围的单位。
(2)对比区间:contrastArea,曲线绘制所需数据的所在时间范围。
(3)数据粒度:dataSize,表示数据汇总的时间间隔。
(4)显示记录数 topn、排序列 sortColum。
3.对比分析
(1)定义:对多监管对象多指标指定时间,范围内的数据绘制曲线,绘制后的曲线图可让用户更加直观的对比出所选指标在所选时间范围内的走势。
(2)功能:分析数据须具有连续性。可以选择多个管理对象的多个指标在同一时间段上比较分析得到图表。可选择单个管理对象的单个指标在不同时间上比较分析得到图表。可以在1或2的分析结果上继续添加对比。
数据接口
    对比分析参数json格式和URL示例如下
     var params =  = {
anaType : 'dbfx',
contrastArea : 'week', //对比区间 year、month、week、day、selfDef
dataSize : 'hour', //数据粒度  month、day、hour、30m、15m、5m、selfSuit
items : [ {
alias : '1',
MOSN : '102500003',
kpiCode : '40006',
startTime : '2010-08-02 00:00',
endTime : '2010-08-08 23:59',
scale : '1'
}, {
alias : '2',
MOSN : '102500003',
kpiCode : '40006',
startTime : '2010-08-09 00:00',
endTime : '2010-08-15 23:59',
scale : '1'
} ]
};
url="${pageContext.request.contextPath}/perfAna/dbfx.action?params="+encodeURIComponent(params);
contrastArea为selfDef时,dataSize必须设置为selfSuit,并且所有对比项的开始时间与结束时间相同。
 
   5.指标自身对比分析
   指标自身对比近期3日数据:
Params为:{ "anaType":"dbfx","contrastArea":"day","dataSize":"30m","items":[  {"alias":"1","MOSN":"100500001","kpiCode":"40008","startTime":"2010-11-14 00:00","endTime":"2010-11-14 23:59","scale":"1" },{"alias":"2","MOSN":"100500001","kpiCode":"40008","startTime":"2010-11-15 00:00","endTime":"2010-11-15 23:59","scale":"1" },{"alias":"3","MOSN":"100500001","kpiCode":"40008","startTime":"2010-11-16 00:00","endTime":"2010-11-16 23:59","scale":"1" }]}

DbfxCondtion condition = JsonTransform.parseDb(params);

DbfxCondtion :private String contrastArea; //对比区间
private String dataSize;  //数据粒度
private List<DbfxItem> items = new ArrayList<DbfxItem>();

DbfxItem item = (DbfxItem) JSONObject.toBean(jsonItem, DbfxItem.class);
condtion.addItem(item);

ContrastAnalysis dbfx = (ContrastAnalysis) getRequest().getSession().getAttribute("dbfx");
dbfx.proccess(condition);

对比分析流程控制方法 1 由于对比分析的特殊性,会把上次的分析结果缓存,避免两个相同对比项的重复分析:
condition.reCalc();
doClear(condition.getContrastArea(), condition.getDataSize());
List<DbfxItem> items = condition.getItems();
对于每个items:if (!item_dataset.containsKey(item)) { // 缓存有,则不分析
doAnalysis(item);
}else{
/* 改变缓存的 别名和色彩*/
String[] array = item_anaResults.get(item);
array[0] = AmStock.getColor(item.getAlias()); // nodePath
array[1] = item.getAlias(); // nodePath
}
对比分析主类:ContrastAnalysis(总和分支)
总: private String contrastArea; // 对比区间
private String dataSize; // 数据粒度
private Date baseDate;

private Map<DbfxItem, String[]> item_anaResults = new HashMap<DbfxItem, String[]>(); // item项映射到分析结果的显示项
private Map<DbfxItem, String> item_dataset = new HashMap<DbfxItem, String>(); // 保存分析的结果数据,给xml的data标签。每行记录格式:日期,数据-2008-12-12

private String amPath;
private List<String[]> results;
总:doAnalysis(DbfxItem item)方法。其中item可以通过get方式获得MOSN,kpiCode,startTime,endTime。

总:IDataAccess access = AccessFactory.createDataAccess(MOSN);
分支: public static IDataAccess createDataAccess(Integer MOSN){
String moType = ModelUtil.getType(MOSN);
return createDataAccess(moType);
}
在createDataAccess中判断是否为业务
分支: if (CoreModelUtil.isYewuType(moType)) {
return new InnerDataAccess();
}
总:SortedMap<String, String> map = access.search(MOSN, kpiCode, startTime, endTime,dataSize);//dataSize为30m

webservice获取数据:
分支: private static SortedMap<String, String> get(int mosn, String kpiCode, String startTime, String endTime) {
Client client = Client.create();
WebResource resource = client.resource("http://" + WebServiceConst.host + ":" + WebServiceConst.port + "/history/" + mosn + "/" + kpiCode);
MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("params", "[{startTime:'" + startTime + "',endTime:'" + endTime + "'}]");
String s = resource.queryParams(queryParams).get(String.class);
JSONArray array = JSONArray.fromObject(s);
if(array!=null&&array.size()>0){
JSONArray result = array.getJSONObject(0).getJSONArray("values");
if(result!=null){
for (int i = 0; i < result.size(); i++) {
JSONObject item = result.getJSONObject(i);
String value = item.getString("value");
if (StringUtils.isNotBlank(value)) {
map.put(item.getString("time"), value);
}
}
}
}
}

Map的值为:2010-11-16 03:14:00=1.34, 2010-11-16 03:15:00=1.34, 2010-11-16 03:16:00=1.33, 2010-11-16 03:17:00=1.33, 2010-11-16 03:18:00=1.36, 2010-11-16 03:19:00=1.37, 2010-11-16 03:20:00=1.37, 2010-11-16 03:21:00=1.34, 2010-11-16 03:22:00=1.32, 2010-11-16 03:23:00=1.30 ...

long moveTime = calcMoveTime(startTime);//返回当前填充的曲线需要移动的毫秒数

protected long calcMoveTime(String startTime) throws Exception {
if (MyTimeUtil.isValideDateTime2(startTime)) {判断是否是长日期格式(yyyy-MM-dd HH:mm)及字符串的length为16
Date start = MyTimeUtil.parseDate2(startTime);
if (baseDate == null) {
baseDate = start;
return 0;
} else {
return start.getTime() - baseDate.getTime();
}
}
}

总:汇总模式huizong(),如果是"default",false。其他为true,比如本例中为"30m"。
分析:-->将标准时间字符串转换成为时间对象(java.util.Date)
private static SimpleDateFormat format2 = new SimpleDateFormat(
"yyyy-MM-dd HH:mm");
  synchronized(format2){
return format2.parse(timeStr);
}
总:Date t1 = MyTimeUtil.parseDate2(startTime);
    Date t2 = add(t1, dataSize);
将时间加上粒度:5m,10m,15m,30m,hour,day,week,month,quarter,year
public static Date add(Date date, String lidu){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if (PerfAnaConst.DATASIZE_1M.equalsIgnoreCase(lidu)) { //粒度为原始数据时
calendar.add(Calendar.MINUTE, 30);
}
}
Date d;
for (Entry<String, String> entry : map.entrySet()[Map里键值对,时间=值,每分钟采集一次的数据。]) {
d = MyTimeUtil.parseDate(entry.getKey());
if (d != null) {
String value = entry.getValue();
if(StringUtils.isBlank(value)){
//null或者空串表示没有数据,但是改点为一次采集值
}else{
double data = FloatingDecimal.readJavaFormatString(value).doubleValue();
max = Math.max(max, data);//比较最大值
min = Math.min(min, data);
sum += data;
count++;
if (d.getTime() < t2[t2为粒度为30m时的时间,从0~29次叠加算平均值。].getTime()) {
shortSum += data;
shortCount++;
} else {
if (shortCount > 0) {
dataset[Dataset保存最近30分钟的记录,第30分钟的数据比如2:30的数据划归到下一次数据记录的第一次进行分析。].append(calc(t1, moveTime));
dataset.append(",");
dataset.append(shortSum / shortCount);
dataset.append("\n");
shortSum = 0.0d;
shortCount = 0;
}
t1 = t2;
t2 = add(t2, dataSize);
while (d.getTime() >= t2.getTime()) {
/* 是否补充空数据 */
dataset.append(calc(t1, moveTime));
dataset.append(",");
dataset.append("\n");
t1 = t2;
t2 = add(t2, dataSize);
}
shortSum += data;
shortCount++;
}
}

} else {
throw new Exception("SortedMap中的时间" + entry.getKey() + "不是yyyy-MM-dd HH:mm:ss格式....");
}
}

/* 末尾补充空数据 */
d=MyTimeUtil.parseDate2(endTime);
while (d.getTime() >= t2.getTime()) {
dataset.append(calc(t1, moveTime));
dataset.append(",");
dataset.append("\n");
t1 = t2;
t2 = add(t2, dataSize);
}
} else {
/*  */
// double max = Double.MIN_VALUE;//bug:Double.MIN_VALUE大于0
for (Entry<String, String> entry : map.entrySet()) {
String time = calc(entry.getKey(), moveTime);
if (time == null) {
throw new Exception("gcw___ SortedMap中的时间" + entry.getKey() + "不是yyyy-MM-dd HH:mm格式....");
} else {
// double value = Double.parseDouble(entry.getValue());
String value = entry.getValue();
dataset.append(time);
dataset.append(",");
if(StringUtils.isBlank(value)){
//null或者空串表示没有数据
}else{
double data = FloatingDecimal.readJavaFormatString(value).doubleValue();
max = Math.max(max, data);
min = Math.min(min, data);
sum += data;
count++;
dataset.append(data);
}
dataset.append("\n");
}
}
}

/* 缺少末尾数据时,添加(最后时间+1分钟)的一个空数据 */
dataset.append(calc(MyTimeUtil.parseDate2(endTime), moveTime - 60000));
dataset.append(",");

/* 统计结果 */
String unit = ModelUtil.getUnit(MOSN, kpiCode);
String[] result = new String[11];
result[0] = AmStock.getColor(item.getAlias()); // nodePath
result[1] = item.getAlias(); // nodePath
result[2] = ModelUtil.getShortPath(MOSN); // nodePath
result[3] = ModelUtil.getDisplayName(MOSN);//
result[4] = ModelUtil.getKpiName(MOSN, kpiCode);
result[5] = startTime;
result[6] = endTime;
if (count > 0) {//小数点后保留两位数字
result[7] = ItimsNumber.formatDouble(max) + unit;
result[8] = ItimsNumber.formatDouble(min) + unit;
result[9] = ItimsNumber.formatDouble(sum / count) + unit;
// result[10] = ItimsNumber.formatDouble(calcScale(max));
result[10] = RateNumber.formatDouble(calcScale(max));
} else {
result[7] = "";
result[8] = "";
result[9] = "";
result[10] = "";
}
item_dataset.put(item, dataset.toString());
item_anaResults.put(item, result);
}

分析:将item_dataset和item_anaResults的数据写入HashMap。在proccess()方法中读出使用,同时存入到amstock中。

总: /* 生成结果 */
AmStock amStock = new AmStock(IPerfAnaConst.DBFX_XML);
this.results = new ArrayList<String[]>();
int count = 0;
for (DbfxItem item : items) {
String datas = item_dataset.get(item);
if (count == 0) {
amStock.setDataset(item, datas, true);
} else {
amStock.setDataset(item, datas, false);
}
results.add(item_anaResults.get(item));
count++;
}
amStock.setFormats[通过对比区间和数据粒度设置amStock的x轴刻度上如何显示文字和date_formats的legend格式。
* 同时设置period_selector标签
](contrastArea, dataSize);
String path = IPerfAnaConst.TMP_DIR_PATH + UUID.randomUUID().toString() + ".xml";
String newPath = WebEnv.webBasePath + "/" + path;
logger.debug("生成xml的配置文件路劲" + newPath);
amStock.write[String xml = doc.asXML();
String datas = "<data_sets>" + datasets + "</data_sets>";
xml = xml.replaceFirst("<data_sets>[\\s\\S]{1,}</data_sets>", datas);
ItimsFile.writeFile(new File(newPath), xml);](newPath);
this.amPath = path;

分析: setFormats方法内容
Element periods = doc.selectSingleNode("//period_selector/periods"));
if ("day".equals(contrastArea)) { // 对比区间:天
periods.addElement("period").addAttribute("type", "hh").addAttribute("count", "1").addText("1时");
periods.addElement("period").addAttribute("type", "hh").addAttribute("count", "6").addText("6时");
this.doc.selectSingleNode("//date_formats/x_axis/minutes").setText("hh:mm");
this.doc.selectSingleNode("//date_formats/x_axis/days").setText("hh:mm");
this.doc.selectSingleNode("//date_formats/legend/minutes").setText("hh:mm");
}

分享到:
评论

相关推荐

    Oracle数据库性能分析

    - **SQL Performance Analyzer (SPA)**: SPA可以在升级前后或应用补丁前后的环境中比较SQL性能,从而发现性能变化。 #### 四、统计分析 为了优化SQL语句的执行效率,了解和分析SQL语句的统计信息非常重要。这些...

    帆软报表查询性能sql分析插件

    通过对比不同查询的执行时间,用户可以优先处理那些影响系统性能的慢查询,提高整体系统效率。 4. **报表设计优化**:除了SQL层面的优化,插件还可能提供对报表设计的建议,比如减少不必要的复杂计算,优化数据集...

    SQL服务器,性能分析语句

    常用的数据库性能分析语句,服务器卡的时候,常用的可以查看后台连接、使用能耗比较高的语句代码

    性能分析windows32位、64位

    本文旨在详细介绍针对Windows平台的性能分析工具,特别是对32位和64位系统环境下的性能分析工具进行比较和探讨。 首先,我们需要明确32位与64位操作系统的区别。简而言之,位数是CPU一次性能处理数据的位宽,32位...

    软件体系结构的性能评价

    - **历史数据参考**:如果之前有类似项目经验,则可以参考其数据进行对比分析。 #### 评估过程示例 文中还提供了一个简单案例研究来展示整个评估流程。假设有一个分布式系统,由多个相互连接的服务组成。首先需要...

    ORACLE之AWR性能分析报告详解

    7. **Comparing Baseline**: AWR报告的价值在于对比,通过与历史数据比较,我们可以发现性能变化趋势,从而找出潜在的问题。 8. **Optimization Focus**: 高Logons、Hard parses或Parses数量可能表明并发问题或SQL...

    oracle AWR性能分析详解

    Oracle AWR(Automatic Workload Repository)性能分析详解 AWR是Oracle数据库中的一个自动负载信息库,它通过收集数据库的统计信息,帮助DBA们分析并诊断数据库的性能问题。自从Oracle 10g版本起,AWR就成为了性能...

    信息安全_数据安全_后台性能测试.pdf

    本篇内容主要涵盖了后台性能测试的多个方面,包括测试的目的、方案设计、数据分析以及相关安全概念。 性能测试主要是为了评估系统的负载承受能力和稳定性。它通过模拟真实环境下的用户行为,来测试系统在高压力下的...

    性能测试理论方法及loadrunner工具使用介绍PPT,用于测试岗位的性能测试,性能测试的需求分析,性能测试方法,测试场景设计

    然而,对于数据库系统,如EAI数据库和帐管后台数据库,性能测试环境与生产环境的对比分析至关重要,以确保测试结果的准确性和可靠性。 总之,性能测试理论方法及LoadRunner工具的使用,构成了一个全面的性能测试...

    基于MATLAB实现的阵列信号处理中的延迟相加、Capon、MUSIC、ESPRIT等算法的性能比较分析+使用说明文档

    基于MATLAB实现的阵列信号处理中的延迟相加、Capon、MUSIC、Root-MUSIC、ESPRIT算法的性能比较分析+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行...

    Oracle性能分析工具的使用.docx

    这种灵活性有助于管理员对比和分析特定时间段内的系统性能指标。 #### 二、性能规划器的设置与配置 ##### 2.1 登录与界面 - **登录**: 通过服务器桌面的【开始】&gt;【程序】&gt;【Oracle-OraHome90】&gt;【Enterprise ...

    Oracle10g、Db2v9.5、SqlServer2000性能对比.docx

    根据提供的文档内容,我们可以得出关于Oracle 10g、DB2 v9.5以及SQL Server 2000这三种数据库管理系统在不同场景下的性能对比分析。以下将详细阐述各个测试场景下的具体表现: ### 一、后台调用存储过程性能对比 ...

    vCenter性能调优和性能监控

    使用vimtop进行性能监控是一种比较常见的方法。vimtop是一个开源工具,类似于Linux系统中的top命令,可以用来实时监控vCenter Server的性能状态。vimtop提供了以下功能: 1. 监控vCenter Server的所有关键进程,...

    第三讲-压力测试实战、性能瓶颈分析及服务优化实战.pdf

    通过对比优化前后的测试结果,可以看到性能有了显著的提升。 总之,这门课程是一次全面的实战学习,从项目开发到部署,再到性能测试和优化,覆盖了IT专业人员在实际工作中需要掌握的关键技能。对于想要提升自身在...

    6套bootstrap后台模板

    Bootstrap 后台模板是网页设计领域中非常受欢迎的框架应用,尤其对于开发高效且美观的...同时,通过对比分析这些模板,开发者可以汲取灵感,根据项目需求选择或组合最佳设计元素,以提升后台系统的用户体验和工作效率。

    漂亮的后台管理界面,推荐大家使用

    9. **无障碍设计**:考虑到不同用户的需求,如色盲用户或视力障碍用户,后台界面设计应支持辅助功能,如高对比度模式。 10. **数据分析**:后台界面往往需要展示数据,良好的图表设计和数据可视化工具能让数据更...

    Unity3DProfiler性能分析

    Unity3D Profiler 是一款强大的工具,用于帮助开发者在开发过程中深入分析和优化游戏或应用的性能。通过Profiler,你可以追踪CPU使用率、GPU负载、内存占用以及各种其他关键性能指标,确保你的软件运行流畅、高效。 ...

    SAP性能测试报告及分析---Part3

    - **Standard Mode**:以事务代码和后台作业的形式展示事务执行的性能。 - **Advanced Mode**:提供更多详细的统计信息。 - **Time Profile**:显示一天中各个时段的性能参数,有助于识别高负载和低负载时段。 -...

    绿色后台系统.zip

    "绿色后台系统.zip"是一个压缩包,通常包含了...由于没有具体的标签和详细描述,以上分析基于常见的后台系统架构和开发流程。要了解更多细节,需要对`ss`和`sub`的具体内容进行解压和分析,或者获取更多项目背景信息。

    GT3.1.0 app性能测试工具

    7. **多维度对比**:GT支持多个设备同时测试,进行横向对比,分析不同设备上的性能差异,为适配更多硬件提供数据支持。 8. **性能报告**:测试结果可以导出为报告,方便分享和分析,为团队协作提供便利。 尽管GT...

Global site tag (gtag.js) - Google Analytics