一次CPU过载的简单排查历程
文章目录
- 背景
- 排查
- 性能火焰图
- 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查看性能火焰图
性能火焰图
- druid异军突出,在获取数据库连接这里,会获取线程堆栈 -> 15%
- pagehelper分页插件解析mybatis配置 -> 5%
- 其他线程耗时主要在序列化反序列化、编解码等操作
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。
结论
- Druid开启连接泄露检测存在性能问题,线上请关闭。我们从火焰图上也大概能看出来可能能提升15%
- PageHelper,不用分页的话把自动配置exclude,能提升个5%
处理Druid和Pagehelper,大概能带来15-20%的性能提升(cpu使用率) 。
一次CPU过载的简单排查历程相关推荐
- load average多少是正常_从阿里大促中,我理出的CPU与Load异常排查思路
前言 大家都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高,本文将与大家一起巩固cpu和load的概念,为今年各种大促做准备的同时也是增加自己的技能储备. 不过cpu和load这 ...
- Java程序占用 CPU 过高怎么排查
Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...
- go程序cpu过高问题排查方法
目录 一.前言 二.问题排查过程 2.1 通过top查看高cpu的进程pid 2.2 通过top查看高cpu的线程tid 2.3 通过dlv附加到进程,分析线程/协程cpu过载的堆栈 2.4 在dlv ...
- Linux网卡中断使单个CPU过载
Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核.然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题.我们已经 在拥有一个或多个饱和1Gbps网卡的高性能系 ...
- 技术项目 - Linux网卡中断使单个CPU过载
Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核.然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题.我们已经在拥有一个或多个饱和1Gbps网卡的高性能系统 ...
- JVM:线上服务CPU爆满,如何排查(三)
0. 引言 前一段时间出现了一个正则表达式引起的线上CPU爆满的问题,一开始没有在第一时间定位到问题,这里也特此记录一下,同时也系统的梳理下CPU爆满问题的排查思路和方法,为后续的同学提供参考. 1. ...
- Java代码-CPU占用过高排查思路
Java代码-CPU占用过高排查思路: 1.top 查看占用cpu过高的进程PID 2.top -Hbp 32048|awk '/java/ && $9>50' 查看进程中占用 ...
- Java服务器内存过高CPU过高问题排查
Java服务器内存过高&CPU过高问题排查 一.内存过高 1.内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报 ...
- linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路
发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况 mpstat -P ALL 2 1 Linux 2.6.32-358.el6.x86_64 (linux- ...
最新文章
- var和dynamic的区别及如何正确使用dynamic ?
- guava缓存数据到本地_扩展Guava缓存以溢出到磁盘
- android 多个模块,Android 模块化中两个模块之间传递model
- 【深度优先搜索】计蒜客:踏青
- Cannot load php5apache2_4.dll into server解决办法;
- python创建一个银行账户类account_银行账户(示例代码)
- python将图片转换成手绘_利用Python生成手绘效果的图片
- hdu 5144 NPY and shot
- Android 仿微信/支付宝 字体大小 调整控件
- 永久免费虚拟主机、免费云服务器,白嫖党福利!
- 阿里巴巴店铺的所有商品API接口(item_search_shop-获得店铺的所有商品接口),阿里巴巴API接口
- ubuntu 安装网卡驱动
- 维斯易联网络打印机配置教程
- Swoole vs Workman
- office2013
- C语言使用strcmp()函数对两个汉字字符进行比较
- 周杰伦粉丝赢了超话大战
- c语言围棋程序代码,围棋编程C++或C语言.doc
- 基于opencv的模板匹配详解
- python指定爬取新浪新闻