一、模拟程序出现问题,代码如下:
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
总结:诊断服务器和性能评估,基本就这些命令和步骤。