生产环境服务器变慢,谈谈诊断思路和性能评估?
一、模拟程序出现问题,代码如下:
import java.util.UUID; public class MangoDemo { public static void main(String[] args) { while (true){ System.out.println(UUID.randomUUID()); } } }
将MangoDemo.java文件放到Linux服务器,然后运行,效果如下图: 二、诊断思路: 1、通过top命令查询整个服务器资源被占用情况,主要看下图2中的CPU和内存占用情况,以及下图1系统的负载均衡。load average:后面三个数字,分别代表1分钟,5分钟,15分钟系统的平均负载值,3个值相加除以3 再乘以100%,如果大于60%,说明系统负载严重。 如果要查询load average,也可以用uptime命令。 2、使用 vmstat 命令查看CPU: vmstat -n 2 3 (表示每2秒采样一次,总共采样三次)。 主要是看r , b , us , sy , id。这几个参数。
-
procs r : 运行和等待CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2个,整个系统的运行队列不能超过总核数的两倍,否则表示系统压力过大。 b : 等待资源的进程数,比如正在等待磁盘I/O、网络I/O等。 cpu us : 用户进程消耗CPU时间百分比,us值越高,用户进程消耗CPU时间越多,如果长期大于50%,优化程序。 sy : 内核进程消耗的CPU时间的百分比。 id : 处于空闲的CPU百分比。 us+sy+id = 100%; us + sy 如果大于40%,也即id 小于60%说明CPU可能不足。
2.1、查看所有CPU核信息: mpstat -P ALL 2 usr 等于 上图的us;sys 等于上图的sy;idle 等于上图的id。 2.2、每个进程使用cpu的用量分解信息:pidstat -u 1 -p 进程编号 3、使用 free 命令查看系统内存:free -m 3.1、也可以使用 pidstat -p 进程号 -r 采样间隔秒数 命令查看内存被占用的情况。 4、查看磁盘剩余空闲数:df -h 5、查看磁盘I/O: iostat -xdk 2 3 主要看%util字段:util表示一秒钟有百分几的时间用于I/O操作,接近100%时,表示磁盘带宽跑满了,需要优化程序或者增加磁盘。
5.1、也可以使用 pidstat -d 采样间隔秒数 -p 进程号 命令来查看磁盘I/O。 6、网络I/O:ifstat 总结:诊断服务器和性能评估,基本就这些命令和步骤。