性能优化-CPU占用过高问题排查

时间:2022-11-08 23:19:23
1. 性能优化是什么?
1.1 性能优化就是发挥机器本来的性能
1.2 性能瓶颈在哪里,木桶效应。
 
CPU占用过高
1、现象重现
CPU占用过高一般情况是代码中出现了循环调用,最容易出现的情况有几种:
a)递归调用,退出机制设计的不够合理;
b)定时器启动过频繁;
c)代码出现死循环
 GC频繁也可能导致CPU占用过高
我用最简单的死循环来举例:
while (true){
...
}
执行后用top 命令查看系统情况
性能优化-CPU占用过高问题排查
这个时候可以看大pid 21270 的进程 cpu占用率为100%
这里有一个小细节,就是总体cpu占用率却为6.8
原因是服务器为多核的,而示例代码为单线程,只会一直占用其中一核
性能优化-CPU占用过高问题排查
 
假如在while 里面不断创建线程就会把整个CPU占满
while (true){
Thread thread = new Thread(new MyRunnable());
thread.start();
}
2、定位方法
首先可以确定占用CPU的进程pid为21270
性能优化-CPU占用过高问题排查
然后按shift + h 可以切换成tid(线程id)
性能优化-CPU占用过高问题排查
可以看到占用cpu的tid为21318
也可以用命令# top -H -p21270 说明: -H 指显示线程,-p 是指定进程
或者用命令ps -mp pid -o THREAD,tid,time 查看pid的线程
性能优化-CPU占用过高问题排查
 
性能优化-CPU占用过高问题排查
再将得到的tid转换成16进制
printf %x 21318 得到 5346
 
执行
jstack -l pid > test.txt
得到线程信息
然后再在test.txt中查找5346会看到一个nid=ox5346的异常信息
性能优化-CPU占用过高问题排查
这里可以很清晰的看到是TestController类的28行有问题(此处是一个死循环)
 
 以上是一次代码导致cpu占用过高的问题排查过程
 
GC过于频繁也会导致CPU占用过高
 
 
 
 
 
===================================待完善===============================================
2. 性能的几个唯度
2.1 CPU
2.2 Memory
2.3 IO
2.4 network 网络
 
2.1
命令 vmstat
首先检查 cpu,cpu 使用率要提升而不是降低
CPU 空闲并不一定是没事做,也有可能是锁或者外部资源瓶颈。
命令 Top
 
2.2 Memory
命令 free -h
 
 
 
2.3 IO
命令 iostat -dx 1
rrqm/s:队列中每秒钟合并的读请求数量
wrqm/s:队列中每秒钟合并的写请求数量
r/s:每秒钟完成的读请求数量
w/s:每秒钟完成的写请求数量
rsec/s:每秒钟读取的扇区数量
wsec/s:每秒钟写入的扇区数量
avgrq-sz:平均请求扇区的大小
avgqu-sz:平均请求队列的长度
await:平均每次请求的等待时间
svctm:平均每次请求的服务时间
util:设备的利用率
注:建议对照源代码来记忆这些参数都是如何计算出来的。
 
 
2.4 Network
命令 nicstat (需要安装)
wget http://sourceforge.net/projects/nicstat/files/nicstat-1.92.tar.gz
tar -zxvf nicstat-1.92.tar.gz
sudo vim Makefile
CFLAGS = $(COPT) -m32#将此行修改为如下:
CFLAGS = $(COPT)
sudo make -f Makefile install
 
3. 术语
吞吐量:对单位时间内完成的工作量的度量
平均响应时间:提交请求和返回该请求的响应之间使用的时间
平均响应时间越短,系统吞吐量越大;平均响应时间越长,系统吞吐量越
小;但是,系统吞吐量越大,未必平均响应时间越短;因为在某些情况(例
如,不增加任何硬件配置)吞吐量的增大,有时会把平均响应时间作为牺牲,
来换取一段时间处理更多的请求。
 
 
4、top找到CPU过高的那行代码
4.1、top 找到Pid,shift+h,找到tid
4.2、jstack pid > p.txt 导出线程dump
4.3、把线程号找到16进制 printf "%x \n" tid
4.4、在p.txt中找到16进制对应的线程信息
 
 
5、heap内存分析
jmap -heap 23451
jmap -dump:format=b,file=aa 23451
获取文件之后使用MAT去查看内存被占用的对象。

性能优化-CPU占用过高问题排查的更多相关文章

  1. sqlserver 索引优化 CPU占用过高 执行分析 服务器检查

    原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚 ...

  2. 一次java Cpu占用过高的排查

    某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了排查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息 ...

  3. Java CPU占用过高问题排查,windows和Linux

    LINUX系统: linux系统比较简单: 1.使用命令 ps -ef | grep 找出异常java进程的pid.  找出pid为 20189 2. top -H -p 20189,所有该进程的线程 ...

  4. java 一次CPU占用过高问题的排查及解决

    最近一段时间  某台服务器上的一个应用总是隔一段时间就自己挂掉      用top看了看  从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID ...

  5. kubelet CPU 使用率过高问题排查

    kubelet CPU 使用率过高问题排查 问题背景 客户的k8s集群环境,发现所有的worker节点的kubelet进程的CPU使用率长时间占用过高,通过pidstat可以看到CPU使用率高达100 ...

  6. kswapd0 进程CPU占用过高

    前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...

  7. 工具运行过程中,CPU占用过高的分析定位

    之前使用Java Swing开发了一款设备档案收集工具.支持多台设备同时收集,每个设备使用一个线程.在同时收集多台设备信息时,发现CPU占用率居然达到了97%,而且高居不下.显然这样的性能是令人无法忍 ...

  8. spring session cpu占用过高

      集成spring session很简单,只需几行代码即可. @Configuration @EnableRedisHttpSession public class SessionConfig { ...

  9. Linux kswapd0 进程CPU占用过高

    图便宜买了个1核1G虚拟机,启动两个jar后cpu飙升直接卡死,查看cpu及内存占用 发现kswapd0进程cpu占用一直居高不下,于是查询资料,总结如下. swap分区的作用是当物理内存不足时,会将 ...

随机推荐

  1. 打造TypeScript的Visual Studio Code开发环境

    打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...

  2. 通过innobackupex实现对MySQL的完整备份与还原

    备份 新建一个用于存放备份的目录 mkdir /backup 执行以下命令: innobackupex --password=test /backup/ 执行完后你会看到“completed OK!” ...

  3. redis在windows上的安装

    1.下载地址:https://github.com/MSOpenTech/redis 主要支持win64的,有个msi文件可以直接安装,安装后redis会变成一个服务,对于windows来说这种最方便 ...

  4. A Simple Problem with Integers(100棵树状数组)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. Struts2学习笔记③

    今天把这两天看书体会的Struts的运行原理记录一下:其实Struts官方提供了一张图可以视为景点,几乎每一个将Struts的课程都会使用: 上面的图里面的struts核心过滤器已经更换为Struts ...

  6. Win10下安装RabbitMQ以及基本知识学习

    一.为什么选择RabbitMQ?      先说一下场景,这是我们公司遇到,当然我这里不做业务评价哈?虽然我知道他很不合理,但是我是无能为力的.APP端部分注册是Java开发的系统,然后业务端是C#开 ...

  7. 通过C#/.NET API使用CNTK

    (原文)CNTK v2.2.0提供C#API来建立.训练和评估CNTK模型. 本节概要介绍了CNTK C#API. 在CNTK github respository中可以找到C#训练示例. 使用C#/ ...

  8. Structs复习 通配符

    1.jar包 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  9. K-SVD字典学习及其实现(Python)

    算法思想 算法求解思路为交替迭代的进行稀疏编码和字典更新两个步骤. K-SVD在构建字典步骤中,K-SVD不仅仅将原子依次更新,对于原子对应的稀疏矩阵中行向量也依次进行了修正. 不像MOP,K-SVD ...

  10. RabbitMQ入门&lowbar;01&lowbar;简介与安装

    A. 资源与参考文档 官网:https://www.rabbitmq.com/ B. 学习目的 部门目前使用其他部门维护的 WebLogic 的 JMS 消息服务,缺乏足够的技术支持与运维支持.随着基 ...