CPU消耗,跟踪定位理论与实践

一.性能指标之资源指标定位方案

1、打tprof报告方法

抓取perfpmr文件 60秒。

perfpmr.sh 60

从结果文件中取出tprof.sum

或直接抓取tprof

tprof –uskejzlt –x sleep 60

2、分析思路

首先看是Kernel、User、Shared
Library中的那个方面占比消耗高。例如,如果是share
lib占比比较高,则找到对应的share
lib分页,查看具体哪个lib占用CPU高,再查看这个特定的lib中哪个函数占用CPU高。

如果通过以上方法不能定位到一个应用层的函数,而是定位到消耗CPU最高的是个系统函数。不但不认识这个系统函数,也看不出谁调用了这个系统函数,因为一些系统层的函数是通用函数(比如h_cede_end_point),从这类函数并不能看出是谁在调用。这种情况,可以通过这个系统函数相邻的那些能看懂的函数来猜测,因为占用CPU高的函数往往是同一个应用、同一个模块、同一类系统调用导致,他们具有扎堆出现的特点。

如果是kernal->lock占 2~3%
cpu就是很多了。

如果定位到一个进程有问题,可以用Truss
–c –p pid查看一个进程在干什么,比如,是在做fork,还是文件读写。

3. 示例

二.理论分析,到底谁在消耗cpu?

用户+系统+IO等待+软硬中断+空闲

祸首是谁?

用户

用户空间CPU消耗,各种逻辑运算

正在进行大量tps

函数/排序/类型转化/逻辑IO访问…

用户空间消耗大量cpu,产生的系统调用是什么?那些函数使用了cpu周期?

IO等待

等待IO请求的完成

此时CPU实际上空闲

如vmstat中的wa 很高。但IO等待增加,wa也不一定会上升(请求I/O后等待响应,但进程从核上移开了)
 

产生影响

用户和IO等待消耗了大部分cpu

吞吐量下降(tps)

查询响应时间增加

慢查询数增加

对mysql的并发陡增,也会产生上诉影响

三.如何减少CPU消耗?

减少等待

减少IO量

SQL/index,使用合适的索引减少扫描的行数(需平衡索引的正收益和维护开销,空间换时间)

提升IO处理能力

加cache/加磁盘/SSD

减少计算

减少逻辑运算量

避免使用函数,将运算转移至易扩展的应用服务器中 如substr等字符运算,dateadd/datesub等日期运算,abs等数学函数

减少排序,利用索引取得有序数据或避免不必要排序 如union
all代替 union,order by 索引字段等

禁止类型转换,使用合适类型并保证传入参数类型与数据库字段类型绝对一致 如数字用tiny/int/bigint等,必需转换的在传入数据库之前在应用中转好

简单类型,尽量避免复杂类型,降低由于复杂类型带来的附加运算。更小的数据类型占用更少的磁盘、内存、cpu缓存和cpu周期

减少逻辑IO

index,优化索引,减少不必要的表扫描 如增加索引,调整组合索引字段顺序,去除选择性很差的索引字段等等

table,合理拆分,适度冗余
如将很少使用的大字段拆分到独立表,非常频繁的小字段冗余到“引用表”

SQL,调整SQL写法,充分利用现有索引,避免不必要的扫描,排序及其他操作 如减少复杂join,减少order by,尽量union all,避免子查询等

数据类型,够用就好,减少不必要使用大字段 如tinyint够用就别总是int,int够用也别老bigint,date够用也别总是timestamp

减少query请求量(非数据库本身)

适当缓存,降低缓存数据粒度,对静态并被频繁请求的数据进行适当的缓存 如用户信息,商品信息等

  • 优化实现,尽量去除不必要的重复请求 如禁止同一页面多次重复请求相同数据的问题,通过跨页面参数传递减少访问等
  • 合理需求,评估需求产出比,对产出比极端底下的需求合理去除

升级cpu若经过减少计算和减少等待后还不能满足需求,cpu利用率还高T_T 是时候拿出最后的杀手锏了,升级cpu,是选择更快的cpu还是更多的cpu了?

低延迟(快速响应),需要更快的cpu(每个查询只能使用一个cpu) 

  • 高吞吐,同时运行很多查询语句,能从多个cpu处理查询中收益

CPU消耗,跟踪定位理论与实践的更多相关文章

  1. java笔记----cpu消耗快速定位代码

    下载ProcessExplorer ProcessExplorer下载地址:ProcessExplorer 下载运行代码 打开ProcessExplorer 查看javaw.exe的pid jstac ...

  2. Java 理论与实践: 用弱引用堵住内存泄漏

    弱引用使得表达对象生命周期关系变得容易了 虽然用 Java™ 语言编写的程序在理论上是不会出现“内存泄漏”的,但是有时对象在不再作为程序的逻辑状态的一部分之后仍然不被垃圾收集.本月,负责保障应用程序健 ...

  3. 高翔《视觉SLAM十四讲》从理论到实践

    目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...

  4. 计算广告CTR预估系列(七)--Facebook经典模型LR+GBDT理论与实践

    计算广告CTR预估系列(七)--Facebook经典模型LR+GBDT理论与实践 2018年06月13日 16:38:11 轻春 阅读数 6004更多 分类专栏: 机器学习 机器学习荐货情报局   版 ...

  5. 优化.NET 应用程序 CPU 和内存的11 个实践

    https://michaelscodingspot.com/cpu-bound-memory-bound/ 优化.NET 应用程序 CPU 和内存的11 个实践 凡事都有其限度,对吧?汽车只能开这么 ...

  6. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  7. Java 理论与实践: 处理 InterruptedException

    捕捉到它,然后怎么处理它? 很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为 ...

  8. Java 理论与实践: 处理 InterruptedException(转)

    很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为它是一个检查异常(check ...

  9. 开源jar包bug导致的CPU消耗200%问题分析案例

    mapdb是什么 mapdb是一个快速.易用的嵌入式java数据库,主要提供map和set形式的数据存储,使用起来就像是在操作java本身的map,set, mapdb可以提供内存级别和磁盘级别的缓存 ...

随机推荐

  1. Django--虚拟环境、项目和应用的创建

    第一点:官方手册 -- https://yiyibooks.cn/ 第二点:运行环境 -- django项目采用虚拟运行环境 之前我们pip install都是在Python的安装目录(底层)上安装的 ...

  2. 1. Robot Framework入门

    RF定义: 通用型的 自动测试框架, 绝大部分的软件的的自动化系统都可以采用它. 特点: 测试数据文件(Test Data)对应一个个的测试用例.测试数据文件里面使用的功能小模块叫关键字,由测试库(T ...

  3. 从苏宁电器到卡巴斯基第27篇:难忘的三年硕士时光 V

    一发不可收拾 安全领域的公司都喜欢在看雪或者是吾爱破解这样的网站上发布招聘贴,因为这样的话很容易就能够招到适合的人才,也算是精准营销了.而像我这种想进入安全圈的,也会在这里发布自己的求职简历,以期望能 ...

  4. Python中math和cmath模块的使用

    目录 Math模块 Cmath模块 Math模块 pi                数字常量,圆周率 e                 表示一个常量 sqrt(x)         求x的平方根 ...

  5. 快速上手NumPy

      NumPy is the fundamental package for scientific computing in Python. NumPy是一个开源的Python科学计算库. 官网:ht ...

  6. C# 泛型Generic

    泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为 ...

  7. SpringBoot系列——Activiti7工作流引擎

    前言 工作流程是我们日常开发项目中常见的功能,本文记录springboot整合activiti7. Activiti介绍 官网:https://www.activiti.org 数据库表 act_hi ...

  8. Java数组学习之前基础小案例

    不多说,1天时间看完数组之前内容,这就靠代码的实践总结一下吧~~ 打印三角形 简单易懂,初学都会,就不注释了,前者为取巧的三角形实现方法,我注释了,直接上源码~~ public class Trian ...

  9. 在?开源社区版的 AirTag 请收下——GitHub 热点速览 v.21.21

    作者:HelloGitHub-小鱼干 在比特币跌到怀疑人生的时候,看着"出血不止"的荷包,是时候来"薅"一波羊毛了.openhaystack 能让你免去购买 A ...

  10. [DB] MapReduce 例题

    词频统计(word count) 一篇文章用哈希表统计即可 对互联网所有网页的词频进行统计(Google搜索引擎的需求),无法将所有网页读入内存 map:将单词提取出来,对每个单词输入一个<wo ...