案例1:系统调用导致CPU利用率高
CPU利用高 ---vmstat 1
谁高 ---top
find / -name loop.sh
cat -n /home/jiangkuan/loop.sh
导致CPU高的原因可能会有很多中,需要具体情况具体分析。
#!/bin/bash
while(true)
do
cd;
done
案例2:用户CPU使用率高的例子
#include <stdio.h>
#include <math.h>
int main (void)
{
while(1){
sqrt(3.1415926);
}
}
编译运行上面的脚本:
案例3:TPS小,RT大,资源利用高
对接口:http://192.168.231.131:8089/jforum-2.1.9/forums/show/9.page进行压测
从压测结果看出响应时间比较长,TPS比较低
监控发现有一个java进程占用了大量的CPU,用top -Hp 2772继续监控:
jstack 2772 > 2772.txt
将2832,2838,2810,2831,2837转换为十六进制,在2772.txt查询是否有对应的日志信息
查看对应位置的代码:发现代码中在进行大量的开方运算,导致了性能问题
案例4:TPS小,RT大,资源利用低
对接口http://192.168.231.131:8089/jforum-2.1.9/posts/list/65350.page压测结果如下:
用vmstat总体监控没发现任何异常,然后去看下JVM和MySQL是否正常
监控发现YGC和FGC基本上没用到,可排除JVM内存的问题,再dump下线程看是否有问题
jstack 2449 > 2449.txt,有可能一次抓不到想要的信息,这时可以多dump几次
响应时间长说明有线程在等待,top -Hp 2449 看下那个线程的占用时间长(TIME+)
可看到2480占用的时间最长,2480转换为十六进制是9B0,在刚刚dump的2449.txt中搜索9B0,结果如下:
发现有线程在等待,但是没看出具体什么业务触发的等待,这时就在2449.txt中寻找状态为TIMED_WAITING自己熟悉的东西,
在dump的日志中找到了自己业务相关的信息,然后查看对应的代码,发现代码创建线程的时候等待了2S
案例总结:
依据数据经过的节点,逐个排查是排查出问题;
vmstat 1 -- 排除掉了OS的问题;
接下来要排查的是:JVM和Mysql是否有问题
JVM:①内存回收是否有问题 ②线程是不是有等待有阻塞的情况 ③jstat pid > pid ④反编译找代码
案例5:IO导致的性能问题
5.1 用vmstat监控发现有大量的io在进行写操作
5.2 用iostat监控发现有等待队列中有大量的操作在等待
5.3 用iotop进行监控发现很多java线程在进行IO操作
5.4 用top监控找到java进程的进程号为3129
5.5 jstack 3129 > 3129.txt,dump 3129这个进程,查看日志,找到对应的代码位置,发现在进行大量的写操作