前提:面试我的阿里的哥们儿听到我这么详细的分析了一波,我从他的语气里面看出,他大概知道,我做过这方面的分析,但是光是这些分析,也只能说明一些基础的问题,还是得在工作中实战的去总结问题。
1.问题描述:生产环境变慢问题,变慢这个问题主要是感官上的变慢,究其原因有两方面 服务器全局慢,服务器局部慢。
1.2.服务器全局慢包括cpu 慢,内存慢,io/磁盘慢,io/网络慢。
1.3.服务器局部慢指得是发现某一个或者多个服务很慢。
2.全局查询思路:
2.1 top 命令(进程,cpu,内存)
第 1 行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
第 2 行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。一般情况下,只要没有僵死的进程,就没啥大问题。
第 3 行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。
第 4 行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量。
第 5 行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量。
第 6 行里面主要看 PID 和 COMMAND 这两个参数,其中 PID 就是进程 ID , COMMAND 就是执行的命令,能够看到比较靠前的两个进程都是 java 进程。
在当前这个界面,按下数字键盘1刷新信息,能够看到各个 CPU(多核情况) 的详细利用率变化,按下数字键盘m ,能够查看内存使用情况.
2.2 vmstat 命令(cpu 内存 io 系统)
vmstat -n 3 2
-n 3 2 间隔3秒采集2次
procs :
r :运行和等待 CPU 时间片的进程数,一般来说整个系统的运行队列不要超过总核数的 2 倍,要不然系统压力太大了
b : 等待资源的进程数,比如正在等待磁盘 IO ,网络 IO 这种
cpu :
us :用户进程消耗 CPU 时间百分比, us 值高的话,说明用户进程消耗 CPU 时间比较长,如果长期大于 50% 的话,那就说明程序还有需要优化的地方
sy :内核进程消耗的 CPU 时间百分比
us + sy 参考值为 80% ,如果大于 80% 的话,说明可能存在 CPU 不足
2.3 free(内存)
free -m
2.4 df (磁盘使用情况)
df -h
2.5 iostat(cpu 核心数,网络io)
iostat -xdk 3 2
rkB/s :每秒读取数据量 kB ;
wkB/s :每秒写入数据量 kB ;
svctm :I/O 请求的平均服务时间,单位毫秒;
util :一秒中有百分之几的时间用于 I/O 操作,如果接近 100% 说明磁盘带宽跑满了,这个时候就要优化程序或者增加磁盘了
3.局部查询思路。
top 发现有问题的进程,对于进程进行查看,这里我只说java 进程的服务,cpu 标高,怀疑内存泄漏导致的full gc 还有就是线程死锁,
3.1 jps -ln (查看java 进程)
3.2 jmap -histo {pid}
grep 一下GC 的信息,也可以查询GC 的 信息。(这里就能查询到是否都是FULL GC)
grep Wating on (这里就可以查看到是否是有线程死锁的问题)