zoukankan      html  css  js  c++  java
  • 性能优化-CPU占用过高问题排查

    1. 性能优化是什么?
    1.1 性能优化就是发挥机器本来的性能
    1.2 性能瓶颈在哪里,木桶效应。
     
    CPU占用过高
    1、现象重现
    CPU占用过高一般情况是代码中出现了循环调用,最容易出现的情况有几种:
    a)递归调用,退出机制设计的不够合理;
    b)定时器启动过频繁;
    c)代码出现死循环
     GC频繁也可能导致CPU占用过高
    我用最简单的死循环来举例:
    while (true){
            ...
    }
    执行后用top 命令查看系统情况
    这个时候可以看大pid 21270 的进程 cpu占用率为100%
    这里有一个小细节,就是总体cpu占用率却为6.8
    原因是服务器为多核的,而示例代码为单线程,只会一直占用其中一核
     
    假如在while 里面不断创建线程就会把整个CPU占满
    while (true){
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
    2、定位方法
    首先可以确定占用CPU的进程pid为21270
    然后按shift + h 可以切换成tid(线程id)
    可以看到占用cpu的tid为21318
    也可以用命令# top -H -p21270 说明: -H 指显示线程,-p 是指定进程
    或者用命令ps -mp pid -o THREAD,tid,time 查看pid的线程
     
    再将得到的tid转换成16进制
    printf %x 21318 得到 5346
     
    执行
    jstack -l pid > test.txt
    得到线程信息
    然后再在test.txt中查找5346会看到一个nid=ox5346的异常信息
    这里可以很清晰的看到是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 " tid
    4.4、在p.txt中找到16进制对应的线程信息
     
     
    5、heap内存分析
    jmap -heap 23451
    jmap -dump:format=b,file=aa 23451
    获取文件之后使用MAT去查看内存被占用的对象。
  • 相关阅读:
    统计单词数 OpenJ_Bailian
    整数划分 NBUT
    高精度(x ,/, +, -, %)良心模板
    binary-tree-maximum-path-sum
    2080 特殊的质数肋骨 USACO (深度优先搜索)
    1413 权势二进制
    POJ 1258
    poj 3126
    hdu 1195
    POJ 3752
  • 原文地址:https://www.cnblogs.com/zh-ch/p/9895140.html
Copyright © 2011-2022 走看看