一、先全面分析系统的瓶颈在哪里
使用top工具全面查看系统性能:
输入M,进程列表按内存使用大小降序排序,便于我们观察最大内存使用问题
输入P,进程列表按cpu使用大小降序排序,观察最昊cpu资源的使用者是否有问题
%id显示系统空闲cpu百分比,如果值过低,说明系统cpu存在瓶颈
%wa:等待i/o的cpu时间百分比,如果值过高,表明io存在瓶颈
二、IO瓶颈
通过 iostat -d -x -k 11分析,如果%iowait值过高,表示硬盘存在I/O瓶颈
如果%util接近100%,说明产生IO请求过多,io系统已经满负荷,磁盘存在瓶颈
如果svctm接近await,说明IO几乎没有等待时间
如果await远大于svctm,说明io队列太长,io响应太慢,则需要进行必要优化
如果avgqu-sz比较大,也表示有大量io在等待
三、进程问题
通过top发现系统性能由某个进程导致后,就需要进一步分析这个进程
通过工具pstack 和 pstrace
pstack:pstack pid 用来跟踪进程栈,如果发现一个服务一直处在work状态,可以在一段时间内,多执行几次pstack,若发现代码栈总停在同一个位置,那这个位置就需要重点关注
strace:用来跟踪进程中的系统调用,动态跟踪进程执行时的系统调用和所接收的信号
四、排查cpu:
1、使用 jstack 分析 CPU 问题,
使用top -H -p pid命令找到使用率比较高的线程,将占用最高的 pid 转换为 16 进制 printf ‘%x\n’ pid 得到 nid,接着直接在 jstack 中找到相应的堆栈信息 jstack pid |grep ‘nid’ -C5 –color:
2、频繁GC
使用 jstat -gc pid 1000 命令来对 GC 分代变化情况进行观察,1000 表示采样间隔(ms),S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU 分别代表两个 Survivor 区、Eden 区、老年代、元数据区的容量和使用量
3、上下文切换
使用 vmstat 命令来进行查看,cs 表示每秒上下文切换次数
五、磁盘
1、使用 df -hl 来查看文件系统状态
2、通过 iostatiostat -d -k -x 来进行分析磁盘性能问题。最后一列 %util 可以看到每块磁盘写入的程度,而 rrqpm/s 以及 wrqm/s 分别表示读写速度
3、查看这个进程具体的读写情况 cat /proc/pid/io
4、通过 lsof 命令来确定具体的文件读写情况 lsof -p pid:
六、内存
内存泄漏分析思路:
1⃣️jmap dump出进程堆信息文件: jmap -dump:live,format=b,file=mem11.hprof 25081
2⃣️-jvisualvm分析dump文件–多个dump文件做对比–
3⃣️找出单位时间段内对象创建靠前的对象–分析创建对象数据是否合理–
4⃣️ 分析代码并修改
六、网络问题
TIME_WAIT和Close_wait:可以直接用命令 netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’来查看 time-wait 和 close_wait 的数量。