公司微服务产品改造上线后,在开发环境的时候,使用的是springboot默认的连接池HikariCP,为什么springboot2.0后选择的是HikariCP,可以参考博客,Springboot 2.0选择HikariCP作为默认数据库连接池的五大理由https://blog.csdn.net/liuhuiteng/article/details/10762753。
其实总结一句话就是HikariCP性能最高,可以pk掉其他所有的连接池;
而我们在对产品进行压测后发现,程序经常卡在获取数据库连接上,经查公司产品底座对连接池的大小的都没有进行调整,默认是最大是8个连接,没有人员负责连接池,随即接手处理,之后就对连接增大,后面再进一步优化sql;
做进一步的压测的时候,发现sql执行快慢情况,不能很好的监控出来,对性能调优有一定影响,当即决定切换阿里的Druid数据库连接池,并开启监控,发现真香啊;
在性能对比上,Druid还是可以的。
主要还是监控真的香,基于Druid强大的监控功能,有利于日常的开发工作、和线上的运维监控,同时可以基于接口自定义扩展监控;
云上某服务上线没几天反馈卡慢宕机,一上午陆续几个集群节点出现问题;
随即和运维同事沟通确认应用的jvm内存正常,该服务对应的数据库实例负载正常,问题现象是某些节点正常,某些不节点不正常,当即确认为当时有问题节点应用这边阻塞导致;
问题类型,卡慢宕机无非是应用的jvm内存溢出,数据库负载高,应用线程阻塞、各种资源泄漏(如redis连接泄漏,数据库连接池泄漏)等。
分析问题时间点日志,会发现很多的请求会卡在获取Druid连接池连接上,这种要反应过来,要么是池里面连接都拿去执行sql了,要么池里面的连接都泄漏了;
如何判断连接都去执行sql了?
在线程快照里面找mysql相关的,从连接池里面拿完连接,当然是执行sql了。
如下图,正在执行的sql很少,那岂不是就是泄漏了?
如何判断连接泄漏了呢?
结合技术架构来看,除了Druid会去池里面的connection,业务地方取的可能性应该是极小的;
反向之,如果是连接泄漏,那按照上图为什么还有8个连接没泄漏完(有一种情况,刚刚好泄漏仅剩8个连接,而刚刚好这8个连接执行的sql较慢,或者并发请求更高,可以进一步确认);
当时直接认定没连接泄漏,然后做一步线程快照分析;
进一步分析发现,还有请求在获取Druid连接池的connection的时候,会阻塞在以下的锁上waiting to lock <0x00000006c69c35f8> (a java.lang.Object)
进一步分析0x00000006c69c35f8锁占用问题发现,
这个当时我脑子是没有转过来的,什么卡在org.apache.catalina.loader.WebappClassLoaderBase.loadClass() 卡在类加载器加载class上了?为什么会卡? 没想通。。。愣是愣了几分钟;
然后又换了一个线程快照查看,如下图基本都是卡慢在同一个地方加载class
查看此处加载的class是com.mysql.jdbc.MysqlIO
然后去确认这个卡慢宕机服务里面搜索com.mysql.jdbc.MysqlIO,确实不存在这样的class,这种查找不存在的class,肯定是慢的,即classload会遍历所有的class目录,即涉及到磁盘IO,然后对于这种druid取连接和执行sql的情况是属于并发高的场景,很容易锁阻塞;
问题确认为druid加载不存在的class com.mysql.jdbc.MysqlIO 导致classload全盘扫描加载class目录导致的锁等待,线程阻塞问题;
如何验证loadclass慢的问题?
写一个demo,反射加载一个不存在的class,和反射加载一个存在的class即可;
可以明显对比出加载不存在的class耗时可能在几十ms(和jar包数量有关);
该服务里面为什么不存在com.mysql.jdbc.MysqlIO?
这个看包名是属于mysql驱动包的,检查项目里面使用的是8.0高驱动版本,确实是不存在的;
然后到maven参考拉mysql的不同版本的驱动包,确认是mysql驱动包低版本6以后就不存在了;
拉对应版本的Druid源码,简单的看下druid源码,按照以下处理注释掉loadclass,不加载不就没问题了吗;
然后专门打包了一个jar包,druid-weaver.jar ,修改架构框架druid依赖为druid-weaver.jar ,上传jar到私服解决;
上述直接 调整源码注释掉loadclass的逻辑,可以解决性能问题,但是某种情况下会导致获取链接不稳定。
根本解决方案是 升级版本到 druid-1.1.23
我们对比下源码:
1.1.22
1.1.23
该服务之后就没因为druid宕机,稳定运行,由于我们线上的服务节点多达200多个,部分并发高的业务服务之后也陆续出现问题,经确认也是同问题,影响较大;
test-on-borrow = true, 线上建议关闭,确实是很耗性能,在我们线上生产环境,我们有监控统计获取druid获取连接检测,基本每次检查要耗时几ms,一个请求执行上百sql,就是几百ms;建议关闭为false;
然后开启test-while-idle = true,防止连接失效有问题场景;
Springboot使用POI读写excel(超级详细)一、poi简单介绍官网 http://poi.apache.org/download.html1. workbook工作簿由于Excel存在xls以及xlsx两种格式,所以创建方式也有所不同。对于xls格式,需要使用HSSFWorkbook来创建对象;对于xlsx格式,需要使用XSSFWorkbook来创建工作薄;需要注意HSSFWorkBook与XSSSFWorkbook两个类都是Workbook接口的实现类。
Turing TreeTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4455 Accepted Submission(s): 1561Problem DescriptionAfter invent
一、实验目的 1、掌握ThinkPHP5.0用户分页浏览功能。二、实验内容1、掌握ThinkPHP5.0用户分页浏览功能。
SSD总共11个block,网络结构如下import torchimport torch.nn as nndef VGG(): vgg = [] # conv1 # 300,300,3 -> 150,150,64 vgg.append(nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)) vgg.append(nn.ReLU(inplace=Tr
#include#include#includetypedef struct user{int id;int sex;char name[20];char tel[12];char address[80];struct user * prev;struct user * next;}User;typedef struct
configparserconfigparser用于处理特定格式的文件,其本质上是利用open来操作文件。configparser.ConfigParser# 注释1; 注释2 [section1] # 节点k1 = v1 # 值k2:v2 # 值 [section2] # 节点k1 = v1 # 值获取所有节点import configparserconfig = configparser.ConfigParser()# 读取文件c
为NestedScrollView添加属性android:fillViewport="true"就可以了.
--PO界面头查询SQLSELECT org_id, attribute15, segment1, revision_num, doc_type_name, creation_date_disp, vendor_name, vendor_site_code, vend
On 64-bit Windows, 32-bit programs run in an emulation layer, and if you don’t like that, then don’t use the emulator在64位Windows上,32位程序在仿真层中运行,如果您不喜欢这样做,则不要使用仿真器Raymond雷蒙德December 22nd, 20082008年...
SLF4Jlog4j一、介绍:简单日记门面(simple logging Facade for java)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4...
分布式任务调度平台XXL-Job目录分布式任务调度平台XXL-Job一、学习资料二、下载源码,分析结构2.1 初始化“调度数据库”2.2 xxl-job-admin 调度中心一、背景:原生的框架几个概念:1、执行器2、触发器,就类似于这个:(秒,分 ,时,日,月,年)网上有很多cron表达式的工具 cron.qqe2.com原生的框架:缺点:天生不支持集群,为避免任务重复执行的问题是单机部署的二、学习资料X...
文/王新禧大家平常扫描识别一些文字资料的时候,通常会用到OCR文字识别软件,不过有时候手头没有这类软件或者懒得安装,这就需要笔者推荐的在线OCR网站来帮忙了。在线OCR识别网站(www.netocr.net)应用了清华大学研制的国际领先OCR识别技术,支持TIF、BMP、JPG等多种常见图像格式,能识别出纯英文、简繁体中文、日文、韩文以及手写体和中英文混排的文本图像。通过它,可以从此告别OCR软件...