文章目录

  • 背景
  • 排查
    • 性能火焰图
    • druid性能问题
    • PageHelper插件性能问题
  • 结论

CPU使用问题一般做性能分析,采集性能火焰图,查看CPU耗时情况

背景

我们单机压测线上一台新服务机器,容器4c8g。
单机RPC服务单接口,压测qps=1500,TP999<200ms。
接口性能符合预期,但是CPU负载过高,qps达到1500时,cpu使用率达到100%。其他机器指标如gc等正常。
需要check下cpu使用率异常的原因。

排查

CPU利用率高:循环、垃圾回收、日志、计算 -> 一般是计算型任务会导致CPU利用率高

首先,CPU的使用率显然和我们的请求qps不断施压有关,请求qps越高,cpu使用率越高。

但是机器指标并没有特别的异常,所以可能是常规的代码运行导致cpu累计使用率增高,因为是CPU类问题,这里我们借助一些性能工具做一下性能分析。比如使用arthas查看性能火焰图

性能火焰图


  1. druid异军突出,在获取数据库连接这里,会获取线程堆栈 -> 15%
  2. pagehelper分页插件解析mybatis配置 -> 5%
  3. 其他线程耗时主要在序列化反序列化、编解码等操作

druid性能问题

show you the code…

package com.alibaba.druid.pool;public class DruidDataSource extends DruidAbstractDataSource implements DruidDataSourceMBean, ManagedDataSource, Referenceable, Closeable, Cloneable, ConnectionPoolDataSource, MBeanRegistration {public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {int notFullTimeoutRetryCnt = 0;for (;;) {// handle notFullTimeoutRetryDruidPooledConnection poolableConnection;try {poolableConnection = getConnectionInternal(maxWaitMillis);} catch (GetConnectionTimeoutException ex) {throw ex;}if (removeAbandoned) {StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();poolableConnection.connectStackTrace = stackTrace;poolableConnection.setConnectedTimeNano();poolableConnection.traceEnable = true;activeConnectionLock.lock();try {activeConnections.put(poolableConnection, PRESENT);} finally {activeConnectionLock.unlock();}}if (!this.defaultAutoCommit) {poolableConnection.setAutoCommit(false);}return poolableConnection;}}
}

第17行:当removeAbandoned=true时,每次获连接后,都会取下当前线程堆栈,丢到活跃链接检测的map里。┭┮﹏┭┮

这是干嘛的呢?官方文档来啦:连接泄漏监测

其实就是用于检测数据库连接会不会用完忘了关,存在泄露的。┭┮﹏┭┮

比如如果连接你是手动获取,手动释放,那万一看到个漂亮妹子走了下神忘了关…

但是想想,我们都是各种框架boy,哪里会关心这种事情啊!

PageHelper插件性能问题

5%的性能耗时在根据请求参数,解析XML的动态SQL生成要执行的SQL。

结论

  1. Druid开启连接泄露检测存在性能问题,线上请关闭。我们从火焰图上也大概能看出来可能能提升15%
  2. PageHelper,不用分页的话把自动配置exclude,能提升个5%

处理Druid和Pagehelper,大概能带来15-20%的性能提升(cpu使用率) 。

一次CPU过载的简单排查历程相关推荐

  1. load average多少是正常_从阿里大促中,我理出的CPU与Load异常排查思路

    前言 大家都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高,本文将与大家一起巩固cpu和load的概念,为今年各种大促做准备的同时也是增加自己的技能储备. 不过cpu和load这 ...

  2. Java程序占用 CPU 过高怎么排查

    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...

  3. go程序cpu过高问题排查方法

    目录 一.前言 二.问题排查过程 2.1 通过top查看高cpu的进程pid 2.2 通过top查看高cpu的线程tid 2.3 通过dlv附加到进程,分析线程/协程cpu过载的堆栈 2.4 在dlv ...

  4. Linux网卡中断使单个CPU过载

    Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核.然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题.我们已经 在拥有一个或多个饱和1Gbps网卡的高性能系 ...

  5. 技术项目 - Linux网卡中断使单个CPU过载

    Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核.然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题.我们已经在拥有一个或多个饱和1Gbps网卡的高性能系统 ...

  6. JVM:线上服务CPU爆满,如何排查(三)

    0. 引言 前一段时间出现了一个正则表达式引起的线上CPU爆满的问题,一开始没有在第一时间定位到问题,这里也特此记录一下,同时也系统的梳理下CPU爆满问题的排查思路和方法,为后续的同学提供参考. 1. ...

  7. Java代码-CPU占用过高排查思路

    Java代码-CPU占用过高排查思路: 1.top 查看占用cpu过高的进程PID 2.top -Hbp 32048|awk '/java/ && $9>50'  查看进程中占用 ...

  8. Java服务器内存过高CPU过高问题排查

    Java服务器内存过高&CPU过高问题排查 一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报 ...

  9. linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路

    发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况 mpstat -P ALL 2 1 Linux 2.6.32-358.el6.x86_64 (linux- ...

最新文章

  1. var和dynamic的区别及如何正确使用dynamic ?
  2. guava缓存数据到本地_扩展Guava缓存以溢出到磁盘
  3. android 多个模块,Android 模块化中两个模块之间传递model
  4. 【深度优先搜索】计蒜客:踏青
  5. Cannot load php5apache2_4.dll into server解决办法;
  6. python创建一个银行账户类account_银行账户(示例代码)
  7. python将图片转换成手绘_利用Python生成手绘效果的图片
  8. hdu 5144 NPY and shot
  9. Android 仿微信/支付宝 字体大小 调整控件
  10. 永久免费虚拟主机、免费云服务器,白嫖党福利!
  11. 阿里巴巴店铺的所有商品API接口(item_search_shop-获得店铺的所有商品接口),阿里巴巴API接口
  12. ubuntu 安装网卡驱动
  13. 维斯易联网络打印机配置教程
  14. Swoole vs Workman
  15. office2013
  16. C语言使用strcmp()函数对两个汉字字符进行比较
  17. 周杰伦粉丝赢了超话大战
  18. c语言围棋程序代码,围棋编程C++或C语言.doc
  19. 基于opencv的模板匹配详解
  20. python指定爬取新浪新闻

热门文章

  1. 虚拟运营商治理170垃圾短信推举报平台
  2. GIS应用案例1:绘制某县人口密度图
  3. 银河麒麟系统部署.net core环境
  4. 基于脉搏波信号和人工智能方法的应用
  5. 飞机步道(plane trails)
  6. 数据的描述性统计与python实现
  7. 被final修饰的变量到底能不能被修改
  8. python下载详细教程
  9. JS_01_变量_数据类型
  10. 进程间各种通信方式的C++实现