性能监控
使用命令监控
cpu瓶颈分析
top命令
在进行性能测试时使用top命令,界面如下
上图可以看出
- CPU 概况区: %Cpu(s):
- us(用户进程占用CPU的百分比), 和 sy(系统进程占用CPU的百分比) 的数值很高说明cpu处于忙碌状态,
- 且id(空闲CPU百分比)的值也比较高说明cpu的资源还比较足。
- si(软件中断所消耗的CPU使用的百分比)只占用一点点
load average(负载平均值): 显示了1分钟、5分钟、15分钟的平均负载值。可以看出最近1分钟内发生了大量的负载
物理内存(Mem)和交换空间(Swap):
- total:物理内存的总大小。
- used:已使用的物理内存大小。
- free:剩余的物理内存大小。
- buff/cached:缓存的物理内存的大小占比
CPU使用率排序显示进程列表:
- PID:进程ID,表示每个进程的唯一标识符。
根据上面进行分析可以得出改系统进行性能测试时,可以看出us比sy高很多,且cpu使用率排在前面的应用程序主要为java程序和数据库mysql
用户态比较高:
%us (或 %user):
这个参数表示 CPU 在用户态下执行应用程序代码的时间比例。如果这个值较高,说明用户态时间比例较高。
%id (或 %idle):
这个参数表示 CPU 空闲的时间比例。如果用户态时间比例高,通常 %id 的值会比较低,因为 CPU 没有太多空闲时间。
CPU 使用率:
在 top 命令的顶部,会显示总的 CPU 使用率,包括用户态、系统态、空闲等。如果用户态时间比例高,总的 CPU 使用率也会相应较高。
进程列表:
在 top 命令的进程列表中,可以看到每个进程的 CPU 使用情况,包括用户态和系统态时间。如果某个进程的用户态时间比例较高,可能需要进一步分析该进程的行为。
java程序也就是应用程序,它的使用率高,说明它的代码消耗的cpu比较多,需要分析代码问题 详见 > 分析定位代码问题
数据库服务器cpu用户态高:说明是 sql语句的逻辑很复杂。 sql要分析优化。
系统态比较高
%sy (或 %system):
这个参数表示 CPU 在内核态下执行系统代码的时间比例。如果这个值较高,说明系统态时间比例较高。
%id (或 %idle):
这个参数表示 CPU 空闲的时间比例。如果系统态时间比例高,通常 %id 的值会比较低,因为 CPU 没有太多空闲时间。
%wa (或 %iowait):
这个参数表示 CPU 等待 I/O 操作完成的时间比例。如果系统态时间比例高,并且 %wa 的值也较高,可能意味着系统正在进行大量的 I/O 操作,导致内核态时间增加。
%st (或 %steal):
这个参数只在虚拟化环境中出现,表示被管理程序(如虚拟机监控器)“偷走”的时间,用于为其他虚拟机提供服务。在非虚拟化环境中,这个值通常为 0。
CPU 使用率:
在 top 命令的顶部,会显示总的 CPU 使用率,包括用户态、系统态、空闲等。如果系统态时间比例高,总的 CPU 使用率也会相应较高。
进程列表:
在 top 命令的进程列表中,可以看到每个进程的 CPU 使用情况,包括用户态和系统态时间。如果某个进程的系统态时间比例较高,可能需要进一步分析该进程的行为。
要分析具体的原因,而不是直接找代码问题。
原因有很多很多情况:比较常见的—— 磁盘获取资源
分析定位代码问题:
获取线程栈定位代码 arthas
下载: 百度搜索 arthas软件下载,上传到项目所在的机器
wget https://arthas.aliyun.com/arthas-boot.jar;
启动arthas: 首先,要确认机器上有 java进程 java -jar arthas-boot.jar
java -jar arthas-boot.jar
找到 导致项目机器cpu的使用率最高的 java进程的id, 输入这个进程在arthas中对应编号, 回车自动去连接到你选择的java进程
我的这里先死是1
使用arthas:
获取帮助: help
查看线程栈: thread
thread -n 5 显示出cpu使用率最高的5个线程栈信息
展示信息如下:
根据展示的信息和项目信息寻找相关的日志
根据日志我们可以定位到java程序中的67行和73行的代码需要优化。