开源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,开 ...
随机推荐
- Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)
传送门 题意: 给出一个数x,有两个操作: ①:x ^= 2k-1; ②:x++; 每次操作都是从①开始,紧接着是② ①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式? 最多操作40次, ...
- 如何安装多个mysql 或者如何更改mysql服务名
此教程适合免安装版本(压缩包)的mysql: 有的时候你需要一台计算机上安装不同的mysql版本,而不同版本的mysql服务名称都是mysql,安装时会有冲突 解决的办法就是安装的时候更改名字 在命令 ...
- vue 中监测滚动条加载数据(懒加载数据)
vue 中监测滚动条加载数据(懒加载数据) 1:钩子函数监听滚动事件: mounted () { this.$nextTick(function () { window.addEventListene ...
- day16,模块 , 用户管理系统 , 购物车程序 , 分页显示.
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举你常见的内置函数."""强制转换:int() / str() / li ...
- Windows API 调用示例
Ø 简介 本文主要记录 Windows API 的调用示例,因为这项技术并不常用,属于 C# 中比较孤僻或接触底层的技术,并不常用.但是有时候也可以借助他完成一些 C# 本身不能完成的功能,例如:通 ...
- GBDT原理及利用GBDT构造新的特征-Python实现
1. 背景 1.1 Gradient Boosting Gradient Boosting是一种Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向.损失函数是 ...
- 关于HashMap put元素的原理
HashMap集合put元素的原理:(1)计算key的hashCode(2)将key的hashCode作为计算因子,通过哈希算法计算HashMap的数组下标index(3)如果index下标的数组元素 ...
- 解决axios在ie浏览器下提示promise未定义的问题
参考链接: https://blog.csdn.net/bhq1711617151/article/details/80266436 在做项目的时候发现在ie11上出现不兼容的问题,对于和后台交互这块 ...
- mac 删除文件夹里所有的.svn文件
先用命令行,进入你要删除的文件夹中(./ 为这个文件夹的当前路径,也可以填写绝对路径) 命令行下输入: sudo find ./ -name ".svn" -exec rm -r ...
- mui 记录
1.轮播添加无限循环 需要在 .mui-slider-group节点上增加.mui-slider-loop类 2.web移动端侧滑与滑动同时存在 参考https://segmentfault.com/ ...