CPU报警,有哪些原因? 大量的计算; 内存报警,有哪些原因? 大量的文件读写;  如何排查问题?

现象:CPU报警,使用率高达90%.

CPU报警期间----->当前哪个接口调用次数最高(通过cat进行监控)----->当前接口做了哪些业务处理?是否可以使用缓存处理进行优化?(CPU高的常规原因有哪些:里面是否有for循环,是否进行大量的对象创建,是否频繁触发Full GC)

哪个进程占用的cpu最高? 哪个线程占用的cpu最高?

20191111 系统调优

mysql服务占用CPU很高,建议项目应用不要和mysql占用同一台服务器,Mysql需要单独部署在某台机器上Mysql也要做HA

是mysql积压导致CPU处理不过来,后续队列里面的其他进程CPU占用也会升高。先处理最高的。

CPU消耗应该上下起伏并且不高于80%的;

最常见的一个场景是程序的线程或进程数过多。

 

如何查看某个进程的cpu占用率?top命令;如何查看线程的cpu占用率?top -Hp pid命令

pid,tid线程id。 进程中全部都是线程。

打印出某个进程中所有线程的cpu消耗状态。

ps -mp 28358 -o THREAD,tid,time

ps -aux 详细信息包含cpu,内存

ps -mp pid -o THREAD,tid,time | sort -rn:查看指定进程中各个线程占用CPU的状态,选出耗时最多、最繁忙的线程id。

 

当前进程消耗的cpu占比,内存占比? top命令,pid,USER(进程名称)

当前系统的内存大小Mem total;已经使用内存,空余内存。(内存和cpu)

 

查看各个进程的cpu使用情况,默认按cpu使用率排序;

结束掉异常进程:kill -9 pid  ;

top -Hp pid 查看该进程下各个线程的cpu使用情况。

如何把某个线程信息打印到文件里?

上图中可以看出pid为25077的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。

 

jstack -F pid:打印出某个进程中的线程信息。 线程和内存堆栈之间的关系。

jstack -F pid >> 20191014.txt 查看内存快照。

在dump中,线程一般存在如下几种状态:

1、RUNNABLE,线程处于执行中;

2、BLOCKED,线程被阻塞;

3、WAITING,线程正在等待.

 

jstack定位cpu高占用

1、top命令找出最高占用的进程(command为java)

2、输入:top -H -p PID 或 ps -mp PID -o THREAD,tid,time

找出最高占用的线程并记录thread_id

3、使用命令将pid转换为十六进制(为什么需要将pid转化为16进制?

printf "%X\n" thread_id

4、查看dump信息(-a 30 意思打印30行)

jstack pid |grep 16进制的thread_id -a 30

或者导出

jstack pid |grep 16进制的thread_id -a 30 > xx.log 29049。

 

CPU占用过高的可能原因(哪些代码正在进行大量的计算)

1、代码中写死循环时,一直占用cpu;如果加上线程睡眠时间,则释放cpu占用,不会一直抢占cpu;

2、在循环中不停的创建对象,也会导致GC频繁;

3、FullGC。

 

常用命令: 进程,线程,虚拟机参数,垃圾收集状况

jps:本地所有的jvm进程。

jsp -v:查看虚拟机的参数配置。

jinfo -flags vmid;查看和调整虚拟机参数,虚拟机参数。

jstack -F vmid;jstack用于生成java虚拟机当前时刻的线程快照。打印线程信息,看看那些代码阻塞了线程。

jstat -gcutil 进程id 1000 10(每秒打印一次,打印十次,运行时堆栈信息,和垃圾回收机制有关系) 

jstat -gcutil 12682 1000 10

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数 (累计回收次数)

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间 y+f

(当前区域使用比例,Ed区域,幸存1区,幸存2区,老年代,垃圾回收次数,垃圾回收消耗时间)

本地可以跑,已发布到线上就有问题 怎么解决? 怎么打印线程信息?

杀死pid进程,kill pid;

相关文章: