高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

性能分析过程

目录
  1. 1. 性能分析过程
    1. 1.1. 资源利用率

性能分析过程

一般情况,该怎样定位性能问题:
Alt text

资源利用率:top、vmstat、iostat、netstat
进程:top,top -Hp < pid >
系统调用:strace
应用监控:jstack、jprofile、jvisualvm

资源利用率

top、vmstat、iostat、netstat、还有很多(sar、nmon),我比较喜欢用vmstat。

Alt text

r: 表示运行队列,简单理解为有多少线程在排队,一般不要超过cpu个数的5倍。
b: 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd :虚拟内存已使用的大小。
free : 空闲的物理内存的大小。
buff : 物理内存用来缓存读写操作的buffer大小
cache: 物理内存用来缓存进程地址空间的 cache 大小
si : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用。
so: 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi : 块设备每秒接收的块数量,一般指磁盘读入。
bo: 块设备每秒发送的块数量,一般指磁盘读出。
in: 每秒CPU的中断次数,包括时间中断
cs :每秒上下文切换次数。
us: 用户CPU时间。
sy :系统CPU时间,小于30%。
id : 空闲 CPU时间。
wt:等待IO CPU时间,小于40%。

我们先看一看哪一块的利用率超标了,下面附上OS常用阀值:

-TotalCPU% < 75%
-SysCPU% < 30%
-Load Average < 5
-Wio% < 40%
-network% < 30% -高了会大量丢包
-mem% < 80%~90%
-Disk busy% < 60%
-Disk usage < 90% -高了会进行碎片整理

如果发现比阀值高,肿么办?
不要着急,我们需要精确定位到具体的进程,看看到底哪个进程在捣鬼!
top 一下,看下cpu利用率占用或者内存占用高的进程。
将它的pid记住,开始动手分尸(分析)

1.strace -f -c -p <pid>
2.jstack -l <pid>
3.jprofile或者jvisualvm
.....

strace:可以将应用对系统的所有调用都打出来,我们可以看到应用程序到底对内核干了多少坏坏的事儿~~~

strace -f -c -p
Alt text

啥??看不懂syscall,我也看不懂,老老实实百度~~
因为我接触大多都是java程序,所以我还是比较钟情于jstack和jprofiler的,嘿嘿!

jstack -l
Alt text
JVM的所有线程都打出来,建议输出到文件中,多打几次。

至于jprofiler,灰常牛X的jvm监控工具,线程数量,方法调用次数,sql执行时间,方法占用cpu的比例,内存大小,gc频率……所有的jvm相关的东东都有,具体怎么用在这里先不多说,上个图看看先~
Alt text