Linux | 性能问题排查

@

相关指令快速索引

希望查看的信息 指令 示例
系统进程列表 ps -ef | grep 进程名 ps -ef | grep java
系统资源占用较高的进程与它们占用资源的概览 top 常用
进程运行、内存、cpu情况的实时统计 vmstat 采样间隔 采样次数 vmstat 1 5
上电时间 & CPU 负载系数 uptime 就是 top 的第一行
CPU 各个核的资源占用统计 mpstat -P ALL 采样间隔 mpstat -P ALL 1 信息类似 vmstat 的 CPU 部分
进程状态实时统计 pidstat 监控项 -p 进程号 采样间隔 采样次数 pidstat -u -r -p 1114 1 5 常用监控项
-u cpu
-r 内存
-d IO
-w 上下文切换
-t 线程
线程状态实时统计 pidstat -t -p 进程号 采样间隔 采样次数 pidstat -u -t -p 1114 1 5
线程状态统计 ps -mp 进程号 -o THREAD,tid,time ps -mp 1114 -o THREAD,tid,time 可以指定输出格式
可用内存 free -m 推荐使用 -m,以 MB 为单位统计
查看磁盘可用 df df -h
磁盘 IO 实时统计 iostat -xdk 采样间隔 采样次数 iostat -xdk 1 5
网络 IO 实时统计 ifstat -tT 采样间隔 采样次数 ifstat -tT 1 -t 增加时间列,-T 增加统计列

指令

ps -ef | grep 进程名 查看进程信息
在这里插入图片描述
ps -mp 进程号 -o THREAD,tid,time 查看某进程下各线程的信息
在这里插入图片描述

通常关注的信息

  • PID
  • 命令行参数
  • %CPU + TID,常用于定位占用资源的线程

详见 Linux | 进程管理 & 服务管理

top 系统进程监控
在这里插入图片描述
需要关注的信息

  • 系统的平均负载是否过大
  • 每个进程的 %CPU %MEM 是否有过大

详见 Linux | 进程管理 & 服务管理

vmstat 采样间隔 采样次数 进程运行、内存、cpu情况的实时统计
在这里插入图片描述
vmstat = VirtualMeomoryStatistics
信息说明:

  • procs 进程信息
    • r 运行中等待 CPU 的 进程数
      通常认为达到并超过 CPU 核心数 2 倍时,系统压力过大
    • b 阻塞(等待资源)中进程数
  • memory 内存信息
    • swpd 使用的虚拟内存大小
    • free 可用内存大小
    • buff 作为缓冲区使用的内存大小
    • cache 作为缓存使用的内存大小
  • swap 交换区信息
    swap 只有在内存不够用的时候才会启用
    启用后在内存和硬盘之间做交换,相当于虚拟内存
    此时,下面两个参数才不是 0
    • si 交换区读速度( 磁盘 -> 内存 的速度),KB
    • so 交换区写速度( 内存 -> 磁盘 的速度),KB
  • io 读写信息
    • bi 交换区每秒读块数
    • bo 交换区每秒写块数
  • system
    下面两个参数大,说明系统内核消耗了较多的 CPU 时间,而没有处理 app 业务,这些时间算是浪费的
    • in 中断平均数,次/s,包括时钟中断
    • cs 上下文切换平均数,次/s
  • cpu
    • us 用户进程执行的时间比例
      通常认为长期 > 50,表示需要优化算法或加速
    • sy 内核系统进程执行的时间比例
      通常认为长期较高,表示大量 CPU 时间被系统内核浪费
      通常认为长期 (us + sy) > 80,表示 CPU 资源不足
    • id 空闲的时间比例
    • wa IO 等待的时间比例
      通常认为长期 > 30,表示 IO 等待严重
      可能由大量磁盘随机访问,或磁盘带宽限制导致
    • st 虚拟机所盗用的时间比例

通常关注的信息

  • procs -r 的数量是否过多
    通常认为阈值是 (CPU 核心数 * 2)
  • memory -free 是否过少
    还要结合 swap 区,
    memory -free 很少,说明内存不富裕
    memory -free 很少,同时 swap -si/so 不是 0 ,说明内存不够用
  • cpu -us/sy/wa 是否过高

uptime 系统上电时间与 CPU 负载系数
在这里插入图片描述
通常关注的信息:CPU 负载系数

mpstat -P ALL 采样间隔 CPU 各个核的资源占用统计
在这里插入图片描述
mpstat = Multiprocessor Statistics
通常关注的信息:类似 vmstat

pidstat -u 1 -p 进程号 进程状态统计
在这里插入图片描述
在这里插入图片描述

通常关注的信息:

  • 按不同的监控项,关注内容不同
  • 关注 CPU(-u) 时,通常注意 CPU 使用率
  • 关注 线程(-t) 时,通常注意 tid,一般是在排除性能问题时关注

free -m 内存使用统计
在这里插入图片描述
通常关注的信息

  • 内存使用率
    通常服务器内存使用率在 [20,70]

df -h 查看磁盘可用
在这里插入图片描述
通常关注的信息:各磁盘使用率

iostat -xdk 采样间隔 采样次数 磁盘 IO 实时统计
在这里插入图片描述
通常关注的信息:

  • rkB/s、wkB/s 是否出现长期过大
    如果是,则需要优化程序读写速度
  • await 是否过高
    await 与 svctm 的值接近时,说明 IO 几乎不用等待,磁盘性能良好
    await 远高于 svctm 时,说明 IO 等待队列太长需要优化或更换更快磁盘
  • util 是否过高
    util 表示每秒 IO 所占时间的比例
    过高表示磁盘带宽全被占用,需要优化或添加磁盘

ifstat -xdk 采样间隔 采样次数 网络 IO 实时统计
在这里插入图片描述
安装指令

wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
tar -xvf ifstat-1/1/tar/gz
cd ifstat-1.1
./configure
make
make install

通常关注的信息:各个网卡 IO 是否过高

JVM 性能工具

参考 基础 | JVM - [指令 & 性能监控]

排查思路

以 CPU 飙高为例

  • 定位占用资源的进程
    可以使用 topps -efjps 定位进程
  • 定位占用资源的线程
    可以使用下面方式进行定位
    • pidstat -t -p 进程号
    • ps -mp 进程号 -o THREAD,tid,time 可以自定义字段
  • 定位问题代码
    通过 jstack 进程号 | grep 线程号(16进制表示) A 行数 定位

示例

  • top
  • ps H -eo pid,tid,%cpu| grep 364520 | sort -r -k 3
    在这里插入图片描述
  • 线程 Id 进制转换:364971 -> 591ab,16进制的字母用小写
  • jstack 364520 | grep 591ab -A 20
posted @ 2025-05-20 14:36  问仙长何方蓬莱  阅读(29)  评论(0)    收藏  举报