发生背景

最近上线的一个项目几乎全是查询业务,并且都是大表的慢查询,sql优化是做了一轮又一轮,前几天用户反馈页面加载过慢还时不时的会timeout,但是我们把对应的sql都优化一遍过后,前台响应还是很慢,数据库测试sql运行时间在3s以内但响应的时候要么500要么就超时了,这时猜测可能是服务器出了问题,于是让运维监测了下GC情况,结果令人吃惊,近15小时发生了237次FGC,每次耗时近4000秒;于是我就让他把内存快照dump给我了

通过MAT分析内存快照

常用名词介绍

  • Leak Suspects

    相当于一个总览,通过饼图的方式展示了可能造成内存溢出或泄露的对象使用的内存大小,并且会分析是哪个类加载器加载的哪个类占用了多少字节;如图:

  • Dominator Tree

    列出了对象与其自身的引用关系,并且倒序列出了对象占用的内存大小以及百分比;通过这些能很清晰的定位到占用内存的对象
  • shallow heap

    浅堆;对象没有引用其他对象时自身的大小
  • retained heap

    深堆;对象自身的大小加其引用对象的大小,即对象被回收时垃圾回收器能回收到的内存大小

快照分析

通过Leak Suspects分析得出占用内存最大的是DruidDataSourceWrapper实例,这是连接池的类竟然不是业务代码,然后通过Dominator Tree 观察到底是哪个对象占用的内存较大,如图:



发现竟然是软引用占用了大量内存空间,此时瞄了一眼DruidDataSourceWrapper的源码就短短数行并没有什么可能造成溢出的因素,奈何又没看过mybatis和连接池的源码,只能结合这个软引用猜测,软引用一般被用在缓存的场景,而我们每次查询的结果集都是5w以上的数据量,直接放内存就算会OOM的话应该也不会用到缓存,于是猜测mybatis的xml里是否用到了fetchSize,全局搜索果然发现了有使用fetchSize,值竟然是一万,于是将fetchSize改为500发布后问题解决

记一次印象深刻的SQL优化

上面也提到了,这次问题排查对很多查询sql进行了优化,下面举个实例以作备忘;有一张六千多万的数据表T1,其共有45列数据,有a,b,c,d四个列涉及到查询,查询sql为:

  select b,c,d,count(1) from T1 where a=123 group by b,c,d

优化时执行sql响应时间大概在20多秒左右,检查索引情况发现a、b、c、d均建立了普通索引,通过执行计划分析发现只命中了a的索引,于是考虑将b、c、d建立一个联合索引,但是查询速度依然不理想,于是考虑利用稀疏索引的原理来创建一个a、b、c、d的联合索引,结果发现查询结果直接0点几秒,全结果集扫描共4万多条记录也只用了五秒左右,优化完成

记一次线上频繁fullGc的排查解决过程的更多相关文章

  1. 关于GC(上):Apache的POI组件导致线上频繁FullGC问题排查及处理全过程

    某线上应用在进行查询结果导出Excel时,大概率出现持续的FullGC.解决这个问题时,记录了一下整个的流程,也可以作为一般性的FullGC问题排查指导. 1. 生成dump文件 为了定位FullGC ...

  2. 记一次线上服务CPU 100%的处理过程

    告警 正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误.查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%. 赶紧从会上下来,SSH登录 ...

  3. 记一次线上OOM问题分析与解决

    一.问题情况 最近用户反映系统响应越来越慢,而且不是偶发性的慢.根据后台日志,可以看到系统已经有oom现象. 根据jdk自带的jconsole工具,可以监视到系统处于堵塞时期.cup占满,活动线程数持 ...

  4. 工作记录:记一次线上ZK掉线问题排查

    目录 问题的发现 zk的情况以及分析 总结 问题的发现 最早问题的发现在于用户提的,用户提出他支付时支付失败,过了一会儿再试就好了,于是翻日志,查询到当时duboo调用出现了下类错误: [TraceI ...

  5. 日常工作问题解决:记一次centos7上的lvm表错误解决过程

    问题描述: 公司大数据hadoop2服务器采用电信云服务器,后来故障,电信恢复该服务器,需要重新部署程序,需要扩展lvm分区,但是使用pvsan命令发现有报错信息,需要解决以防重启后,因挂载问题,无法 ...

  6. 解Bug之路-记一次线上请求偶尔变慢的排查

    解Bug之路-记一次线上请求偶尔变慢的排查 前言 最近解决了个比较棘手的问题,由于排查过程挺有意思,于是就以此为素材写出了本篇文章. Bug现场 这是一个偶发的性能问题.在每天几百万比交易请求中,平均 ...

  7. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  8. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  9. 记一次线上事故的JVM内存学习

    今天线上的hadoop集群崩溃了,现象是namenode一直在GC,长时间无法正常服务.最后运维大神各种倒腾内存,GC稳定后,服务正常.虽说全程在打酱油,但是也跟着学习不少的东西. 第一个问题:为什么 ...

随机推荐

  1. C++ Protobuf

    Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准.通过将结构化的数据进行序列化(串行化),用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的 ...

  2. JavaScript之数组常用API

    这篇文章主要帮助大家简单理解数组的一些常用API用法,许多小伙伴常用方法记不住?别急,看完下面的介绍您一定就会明白各个方法是如何用的了.该文章适合新手小白看,大佬可以多多指点️! 1.数组的创建以及A ...

  3. Python入门系列(八)日期时间、数学、json

    日期时间 Python中的日期本身不是数据类型,但我们可以导入一个名为datetime的模块,将日期作为日期对象使用. import datetime x = datetime.datetime.no ...

  4. git reset总结

    git reset git 的重置操作 有三种模式:hard.mixed(默认).soft 1. hard 用法 hard会重置stage区和工作区,和移动代码库上HEAD 和branch的指针所指向 ...

  5. 如何使用helm优雅安装prometheus-operator,并监控k8s集群微服务

    前言:随着云原生概念盛行,对于容器.服务.节点以及集群的监控变得越来越重要.Prometheus 作为 Kubernetes 监控的事实标准,有着强大的功能和良好的生态.但是它不支持分布式,不支持数据 ...

  6. B树-删除

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 删除 根据B树的以下两个特性 每一个非叶子结点(除根结点)最少有 ⌈m/2⌉ 个子结点 有k个子结点的非叶子结点拥 ...

  7. Linux 使用 Systemd 管理进程服务

    转载自:https://mp.weixin.qq.com/s/e-_PUNolUm22-Uy_ZjpuEA systemd 介绍 systemd是目前Linux系统上主要的系统守护进程管理工具,由于i ...

  8. 5.第四篇 Etcd存储组件高可用部署

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483792&idx=1&sn=b991443c ...

  9. Elasticsearch: 使用URI Search

    在Elasticsearch中,我们可以使用_search终端进行搜索.这个在我之前的文章 "开始使用Elasticsearch (2)" 中有很多的描述.针对这种搜索,我们可以使 ...

  10. Security Context

    概述 Security Context(安全上下文)用来限制容器对宿主节点的可访问范围,以避免容器非法操作宿主节点的系统级别的内容,使得节点的系统或者节点上其他容器组受到影响. Security Co ...