这几天新项目每次发布,都发现load在jetty重启过程中突然load会从0.1突然升高到15以上,3分钟后慢慢降到正常非常,cpu使用率也升高了一些,但是jvm内存线程,gc都比较正常,所以怀疑应用已启动,执行了一些耗CPU的处理过程,查看了代码之后,应用已启动,执行最多的方法是dowork,而这个方法里面会有解析xml的过程:
public OfferInfo parseXml(String content) throws NumberFormatException, XMLStreamException {
if (content == null || content.isEmpty()) {
return null;
}
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = null;
try {
reader = factory.createXMLStreamReader(new StringReader(content));
} catch (XMLStreamException e1) {
return null;
}
if (reader == null) {
return null;
}
OfferInfo offerInfo = new OfferInfo();
while (reader.hasNext()) {
int event = 0;
try {
event = reader.nextTag();
} catch (Exception e) {
}
switch (event) {
case XMLStreamConstants.START_ELEMENT:
if (reader.getLocalName().equalsIgnoreCase(OFFER_ID)) {
offerInfo.setOfferId(Long.parseLong(reader.getElementText()));
} else if (reader.getLocalName().equalsIgnoreCase(MEMBER_ID)) {
offerInfo.setMemberId(reader.getElementText());
} else if (reader.getLocalName().equalsIgnoreCase(ACTION)) {
offerInfo.setAction(reader.getElementText());
}
break;
case XMLStreamConstants.END_ELEMENT:
break;
}
}
return offerInfo;
}
这段代码会解析整个xml文档,只取出里面三个字段,这里的应用场景是异步消息处理,因为应用在重启过程中,消息堆积,应用启动完后会处理比较多的堆积消息,导致load和cpu升高,开始怀疑这段解析xml的过程耗性能,因为xml内容很大,达到1m以上,而且消息堆积量一下子也可能上万,然后就开始进行优化,
在while循环中加入以下代码:
//如果已经解析完需要的字段,则跳过剩余xml内容的解析,提高性能
if(offerInfo.getOfferId() != null && offerInfo.getMemberId() != null && offerInfo.getAction() != null){
return offerInfo;
}
只要解析出我们需要的三个字段,剩余的xml内容就不需要解析了,返回。
加上这段代码后,线上果然正常了。
因为在发布过程中来不及用jstack dump线程信息,用jstack dump线程信息,查看下当前线程处理状况,也应该很快能诊断出问题。
解析xml时解析完需要的数据就需要返回了,剩下的xml内容不需要解析,xml解析很耗性能。
我们看下修改这段代码前后的load和cpu的图
其他jvm指标都比较正常。
分享到:
相关推荐
mysql调优; mysql服务器LOAD突然飙高,可能的5种情况, 以及解决办法;
性能压力测试load5
MySQL导致的CPU高负载问题 今天下午发现了一个MySQL导致的向上服务器负载高的问题,事情的背景如下: 在某个新服务器上,新建了一个MySQL的实例,该服务器上面只有MySQL这一个进程,但是CPU的负载却居高不下,...
家里台式机和笔记本安装的KEIL与Jink版本相同,台式机一直使用正常,这几天准备用笔记本使用KEIL在线仿真,选择Jlink时Keil自动闪退,或报“Cannot load driver 'C:\Keil_v5\ARM\Segger\JL2CM3.dll ”,更新JlinK...
错误描述: 1、保存模型:model.save_weights...问题分析: 模型创建后还没有编译,一般是在模型加载前调用model.build(input_shape), 但我通过Dataset将输入已经变为dict格式了,暂时没找这样输入怎么匹配input_shap
在 DB2 数据库的日常使用中,很重要的一项工作就是移动数据,那么在此时就经常会用到 LOAD 工具。DB2 的 LOAD 工具的功能非常强大,...下面结合本人的实践经验介绍一下在使用 LOAD 工具的过程中比较有帮助的一些技巧。
1、 安全性:由于静态档案是从软件的界面进行导入的,所以在导入的过程就完成了一定的数据校验,比在档案在数据库中导入更安全,不易出问题 2、 灵活性:由于该工具设置简单,基本上在做档案导入时,不论客户档案...
在安装VCS过程中,出现DEV不能打开,如何排除相关问题
整理出了dataload导入过程中键盘操作的命令集合,很方便,很实用。
rtmp服务器压力测试工具 [root@localhost ~]# yum install git unzip patch gcc gcc-c++ make ...5. start 10000 vod clients ./objs/sb_hls_load -c 10000 -o -r http://127.0.0.1:3080/hls/hls.m3u8
OpenGL Load3DS OpenGL Load3DS OpenGL Load3DS
load图片,网页页面的load图片!load图片-28个
pyzbar库生成EXE,PyInstallerImportError: Failed to load dynlib/dll问题解决方法附源码
python解决np.load异常问题,适用于Python3X import numpy as np # save np.load np_load_old = np.load # modify the default parameters of np.load np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True...
解决VirtualBox启动Unable to load R3 module问题,解决无法启动Android模拟器。
如何TroubleShooting Jload
赠送jar包:spring-cloud-loadbalancer-3.1.1.jar; 赠送原API文档:spring-cloud-loadbalancer-3.1.1-javadoc.jar; 赠送源代码:spring-cloud-loadbalancer-3.1.1-sources.jar; 赠送Maven依赖信息文件:spring-...
lazyload, JavaScript, 图片懒加载, h5
性能测试load3
Load Flow Analysis of IEEE 5 Bus model in Simmulink.rar