开源jar包bug导致的CPU消耗200%问题分析案例
mapdb是什么
mapdb是一个快速、易用的嵌入式java数据库,主要提供map和set形式的数据存储,使用起来就像是在操作java本身的map,set,
mapdb可以提供内存级别和磁盘级别的缓存,MapDB 提供了并发的 TreeMap 和 HashMap ,使用基于磁盘的存储。快速、可伸缩性以及易用,它提供了基于磁盘或者堆外(off- heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps、Sets、Queues。MapDB的前身是JDBM,已经有15年的历史。
它的jar包只有200KB,且无其它依赖,非常轻量。MapDB目前相对来说功能已经稳定,并有全职 的开发者支持开发。
mapdb引起app-6028-security应用CPU消耗异常问题定位案例
最近2天在测试的过程中发现基础应用服务app-6028-security应用存在一个奇怪的问题,该应用在运行一段时间后,发现这个服务的cpu经常在200%多,即使不做任务业务操作,
cpu的使用率一段时间后仍然飙升到200%,所以很奇怪,现象是运行一晚上后,就会出现这个cpu高的问题,重启应用后过一段的时间又会重新复现,
该应用主要是做一些敏感数据的加密和解密的服务(比如身份证、银行卡、姓名、手机号等数据加密和解密)。


由此确定这个cpu消耗最多的进程是app-6028-security应用
通过top -Hp 29868

发现其中的2个线程,消耗异常,始终消耗cpu 99%
登录docker通过jstack查看:


jstack 57 | grep "nid=0x98" -A30


到此,基本确定这段代码肯定存在问题
为了验证问题的准确性,接着登录我们的准生产环境,看看这个问题是否存在:
登录准生产后,查看如下:



发现准生产也存在这个问题,其实问题就是这两个线程导致的
然后让运维去线上查看这个服务的cpu消耗,占据了也是200%,也让运维拿到上面的docker环境里的进程号:

printf "%x\n" tid

nid=0xaf
nid=0xb3


APP项目中调用到mapdb的代码如下:

查看1.0.9版本代码中的代码逻辑如下:


通过和架构师讨论,建议升级到该版本的下一个版本,从当前的1.0.9版本升级到2.0的版本,如果版本跨度,怕不兼容,所以为了安全起见,暂时这样解决,最新版本的是支持jdk1.8 而我们项目是jdk1.7版本
老版本的源码如下

新版本的源码如下:

通过对比mapdb插件源码,发现存在问题的源码已经改动了,所以将mapdb从1.0.9版本升级到2.0-beta13版本后,观察2天三夜,问题不在复现



目前问题已经解决
其实这个问题很容易,但是主要是他对性能的影响不大,在和运维获取线上的这个服务的cpu占用时候,运维都觉得影响不大,cpu消耗占用都不大,但是作为性能测试人员,一定要严格要求项目,任何问题不要放过
但是说明以前的测试,没有重视和解决这个问题,毕竟这个问题已经在线上运行了2年以上了

参考文章:
https://mvnrepository.com/artifact/org.mapdb/mapdb
https://blog.csdn.net/qy20115549/article/details/53207093
https://blog.csdn.net/abc86319253/article/details/53020432
https://blog.csdn.net/u014401141/article/details/79132224
http://www.sohu.com/a/136901812_494947
https://blog.csdn.net/Appleyk/article/details/79880655
http://www.mapdb.org/
https://www.jianshu.com/p/b6f43302338e
开源jar包bug导致的CPU消耗200%问题分析案例的更多相关文章
- Java运用第三方开源jar包sigar.jar获取服务器信息
通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 一.准备工作 (1)下载jar包和相关文件 资源链接:百度云:链接:https://pan.baidu.com/s/1nxccJHJ ...
- flink clickhouse-jdbc和flink-connector 写入数据到clickhouse因为jar包冲突导致的60 seconds.Please check if the requested resources are available in the YARN cluster和Could not resolve ResourceManager address akka报错血案
一.问题现象,使用flink on yarn 模式,写入数据到clickhouse,但是在yarn 集群充足的情况下一直报:Deployment took more than 60 seconds. ...
- Java常用开源jar包
转:http://blog.csdn.net/kevingao/article/details/8125683 activation~与javaMail有关的jar包,使用javaMail时应与mai ...
- 如何在gradle项目中添加额外非开源jar包并提交代码
前提:项目开发中,遇到一个地方需要用到公司自定义的jar包,然后要放到代码里又不方便提交到私服 具体实施: 首先在项目中增加一个 libs目录,然后把这种非开源又不在私服上的jar包扔进去, 然后打开 ...
- Spark On YARN使用时上传jar包过多导致磁盘空间不够。。。
今天测试过程中发现YARN Node变成Unhealthy了,后来定位到硬盘空间不够..... 通过查找大于100M的文件时发现有N多个spark-assembly-1.4.0-SNAPSHOT-ha ...
- 项目红色感叹号eclipse因Web App Libraries中的jar包missing导致项目红色感叹号
症状: 如题 分析: 修改.更换或者删除了WEB-INF/lib中的jar包 解决方案: 右击项目>build path>Libraries 直接remove Web App Librar ...
- 修改jar包bug的方式
第一种方式 1. 直接在项目同样的包名里面新建同样的class,会优先jar包的class加载,等同于覆盖. 第二种方式 2. 拿到第一步打包后的jar或者war,找到相应的java类的.class文 ...
- 自定义API(Jar包)的创建与使用(简单实现案例)
@ 目录 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类StringUt ...
- Java去除掉HTML里面所有标签的两种方法——开源jar包和自己写正则表达式
Java去除掉HTML里面所有标签,主要就两种,要么用开源的jar处理,要么就自己写正则表达式.自己写的话,可能处理不全一些自定义的标签.企业应用基本都是能找开源就找开源,实在不行才自己写…… 1,开 ...
随机推荐
- Linux sed command
概述 sed 是一种在线非交互式编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space). 接着用sed命令处理缓冲区 ...
- Httpclient发送json请求
一.Httpclient发送json请求 public String RequestJsonPost(String url){ String strresponse = null; try ...
- Exp2 后门原理与实践
一.基础问题回答 (注:本实验中在win7上使用的ncat.exe和socat.exe均可在实验指导的附件中下载) 1.例举你能想到的一个后门进入到你系统中的可能方式? 答:非官方网站下载资源时,可能 ...
- java容器-Map
Map:基本思想是映射表(维护键-值对),HashMap,TreeMap,LinkedHashMap,ConcurrentHashMap等都是基于Map接口实现的map容器,他们特性不同,表现在效率, ...
- 【bzoj 4449】[Neerc2015]Distance on Triangulation
Description 给定一个凸n边形,以及它的三角剖分.再给定q个询问,每个询问是一对凸多边行上的顶点(a,b),问点a最少经过多少条边(可以是多边形上的边,也可以是剖分上的边)可以到达点b. I ...
- Swift PlayGround无限Running问题
这个问题我想肯定很多人都有遇到过,如果你正好面试iOS,用这个playground写算法的话遇到这种情况只能hehe了-- 我是这样解决的,一开始我build project的时候选得是iOS的pla ...
- idea如何快速查看接口的实现类
查找接口的实现类: IDEA 风格 ctrl + alt +B 在按F2查看详细文档注解 查看类或接口的继承关系: ctrl + h
- GitHub:本地项目上传与团队协作
第一部分:我的本次作业成果 我自己个人的github地址是:colintz的个人仓库 我们开发团队小组的github地址是:小组3集中营 第二部分:强烈推荐的github资源 对于和我一样,初次接触g ...
- shell脚本中关于getopts的使用方法
例子: while getopts ":e:s:pd:l" arg; do case $arg in e) ghs_env=$OPTARG ;; s) ghs_service=$O ...
- TensorFlow GPU版本号与CUDA的对应产生的错误
前言 感悟:cuda 8.0+cudnn 6.0+TensorFlow 1.3 cuda 9.0+cudnn 7.0+TensorFlow 1.7 python3.6.2+cuda 9.0+cudn ...