当前位置: 首页 > news >正文

Linux | 性能问题排查

INDEX

      • 相关指令快速索引
      • 指令
      • JVM 性能工具
      • 排查思路

相关指令快速索引

希望查看的信息指令示例
系统进程列表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,timeps -mp 1114 -o THREAD,tid,time可以指定输出格式
可用内存free -m推荐使用 -m,以 MB 为单位统计
查看磁盘可用dfdf -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 行数 定位

相关文章:

  • 【微服务容器化】第二章-Docker常用命令
  • 慧差\畸变 zemax示例
  • 硬件控制方法
  • 【单细胞高级绘图】08.细胞通讯_两组比较_气泡图
  • java计算机毕业设计基于安卓Android/微信小程序的校园报修管理APP
  • Mysql 的安装
  • 8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}
  • Python装饰器通俗理解
  • 1516. 移动 N 叉树的子树 DFS
  • 【计算机图形学】高级外观建模
  • 阿里云dataworks中业务流程中问题(odps2)
  • 数据库基础小练习
  • java计算机毕业设计基于安卓Android/微信小程序的汽车租赁小程序-app
  • 学习-Java类和对象之访问限制
  • MATLAB2016笔记(十一):基本粒子群优化算法(PSO)的MATLAB实现
  • [Vue CLI 3] 配置解析之 css.extract
  • 【刷算法】从上往下打印二叉树
  • Android 控件背景颜色处理
  • C++类中的特殊成员函数
  • centos安装java运行环境jdk+tomcat
  • gf框架之分页模块(五) - 自定义分页
  • httpie使用详解
  • HTTP请求重发
  • Java小白进阶笔记(3)-初级面向对象
  • js面向对象
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React的组件模式
  • SegmentFault 2015 Top Rank
  • 分布式任务队列Celery
  • 机器学习学习笔记一
  • 技术发展面试
  • 问题之ssh中Host key verification failed的解决
  • 用jQuery怎么做到前后端分离
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​​​​​​​​​​​​​​Γ函数
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​渐进式Web应用PWA的未来
  • ​力扣解法汇总946-验证栈序列
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • %check_box% in rails :coditions={:has_many , :through}
  • (12)Linux 常见的三种进程状态
  • (Ruby)Ubuntu12.04安装Rails环境
  • (超详细)语音信号处理之特征提取
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)深入super,看Python如何解决钻石继承难题
  • .Net MVC4 上传大文件,并保存表单
  • .NET Standard 的管理策略
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖