zoukankan      html  css  js  c++  java
  • 开源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 " 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

  • 相关阅读:
    Flutter——Text组件(文字组件)
    Dart的导包
    Dart 面向对象 类 方法
    Dart中的匿名方法与自执行方法
    Dart的List比较特殊的几个API
    SearchView监听关闭正确方案
    Android选择多图上传
    ListView嵌套ScrollView会出现的问题
    禁用ViewPager的滑动事件
    SQLite相关异常
  • 原文地址:https://www.cnblogs.com/qmfsun/p/10731311.html
Copyright © 2011-2022 走看看