这几天新项目每次发布,都发现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突然升高时,这通常意味着服务器正在承受过大的压力,可能由多种因素引起。以下是...
- **`uptime` / `w`**:用于查看系统运行时间、当前登录用户数以及过去 1、5、15 分钟内的平均负载。 - **`cat /proc/cpuinfo`**:列出 CPU 信息,如型号、频率等。 - **`grep 'processor' /proc/cpuinfo | wc -l...
【性能压力测试load5】是一种针对软件系统进行的测试方法,旨在评估和验证系统在高负载和并发情况下的性能、稳定性和可扩展性。这种测试通常用于确定一个系统在正常和峰值使用情况下的表现,帮助开发者和运维人员找...
在Linux系统运维过程中,系统问题排查是一项基本而重要的工作。本文档将详细介绍Linux系统中常见的问题排查方法,包括CPU问题、内存问题、网络问题以及磁盘问题等。通过这些知识点的学习,可以帮助用户更高效地识别...
在排查问题的过程中,使用合适的方法和工具至关重要,它们可以帮助我们更高效地进行问题分析和定位。下面详细地介绍一些常用的线上问题排查工具和手段,以及它们在实际中的应用场景。 首先,日志分析是排查问题的...
MySQL导致的CPU高负载问题 今天下午发现了一个MySQL导致的向上服务器负载高的问题,事情的背景如下: 在某个新服务器上,新建了一个MySQL的实例,该服务器上面只有MySQL这一个进程,但是CPU的负载却居高不下,...
MySQL 里 load data 遇到的问题及解决方法 MySQL 是一个关系数据库管理系统,load data 是 MySQL 中的一种数据导入方法,它可以将文本文件中的数据导入到 MySQL 数据库中。但是,在使用 load data 时,可能会遇到...
LoadOrder工具就是这样一个实用程序,它专为用户提供了一种简便的方式来查看系统在启动过程中加载的各种驱动程序和服务的顺序,这对于排查系统问题和确保硬件与软件的兼容性具有重要意义。 首先,让我们详细了解...
这里的0.65、0.42和0.36分别代表了过去1分钟、5分钟、15分钟内的负载平均值。 #### 二、Load Average 的计算方式 负载平均值是通过统计在指定时间窗口内运行队列中的进程数量来计算的。运行队列是指那些正在运行或...
在这个过程中,`dataload` 将数据和对应的键盘事件组织成表格格式,简化了复杂的数据导入流程。 **工作原理** `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
安全性:dataload 工具可以实现数据的安全导入,因为静态档案是从软件的界面进行导入的,在导入过程中完成了一定的数据校验,不易出问题。 灵活性:dataload 工具设置简单,基本上在做档案导入时,不论客户档案之间...
错误描述: 1、保存模型:model.save_weights...问题分析: 模型创建后还没有编译,一般是在模型加载前调用model.build(input_shape), 但我通过Dataset将输入已经变为dict格式了,暂时没找这样输入怎么匹配input_shap
- **解决原有问题**:原有 mass load 工具存在诸多问题,例如需要深入了解模式、编写 XSL 转换脚本以及难以隔离涉及多个过程中的问题。 - **简化流程与降低成本**:新的 dataload 工具简化了数据加载过程,并降低了...
以上就是关于在Red Hat Linux上安装`db_load`的详细过程。确保在执行这些操作时具有适当的权限,并且了解可能的风险,特别是涉及到系统级别的更改。在执行任何安装操作之前,记得备份重要数据以防意外情况发生。
装柜专家LoadExpert是一款在物流、仓储行业中广泛使用的专业软件,其2.6正式版的发布,为用户带来了更为高效、便捷的装柜解决方案。这款软件无需注册,用户可以直接使用,极大地提升了用户体验和工作效率。 1. **装...
"LoadExpert装柜专家"是一款专为外贸公司和物流公司设计的高效工具,旨在优化货柜装载过程,提高空间利用率,降低运输成本,确保货物安全准时到达目的地。这款软件的应用,不仅提升了业务流程的自动化水平,还为企业...
- 错误处理和日志记录:可能改进了错误处理机制,提供更详细的错误报告,同时日志记录功能可能更加完善,便于排查问题和审计操作。 3. **使用DataLoad v4.2的步骤**: - 解压缩:首先,用户需要下载并解压缩"Data...
家里台式机和笔记本安装的KEIL与Jink版本相同,台式机一直使用正常,这几天准备用笔记本使用KEIL在线仿真,选择Jlink时Keil自动闪退,或报“Cannot load driver 'C:\Keil_v5\ARM\Segger\JL2CM3.dll ”,更新JlinK...