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

Linux性能分析:常用工具与指令

文章目录

    • 一、系统基础信息查看:性能分析的前提
      • 1.1 CPU信息查看:主频、核心数与架构
        • 1.1.1 `lscpu`:简洁直观的CPU信息汇总
        • 1.1.2 `/proc/cpuinfo`:详细CPU硬件信息
      • 1.2 内存(RAM)信息查看:容量、使用状态
        • 1.2.1 `free`:快速查看内存使用概况
        • 1.2.2 `/proc/meminfo`:详细内存参数
        • 1.2.3 `vmstat`:内存与I/O状态监控
      • 1.3 磁盘信息查看:容量、分区、I/O状态
        • 1.3.1 `df`:磁盘分区容量查看
        • 1.3.2 `du`:目录/文件占用空间统计
        • 1.3.3 `lsblk`:磁盘分区结构查看
        • 1.3.4 `iostat`:磁盘I/O性能监控
    • 二、进程与线程分析:定位资源占用源头
      • 2.1 `ps`:进程静态信息查看
        • 2.1.1 常用参数组合
        • 2.1.2 输出字段解读(以`ps aux`为例)
        • 2.1.3 进程状态(STAT)含义
        • 2.1.4 线程查看示例
      • 2.2 `top`:进程动态监控
        • 2.2.1 基本使用与输出解读
        • 2.2.2 常用交互命令(top运行中输入)
        • 2.2.3 线程监控示例
      • 2.3 `htop`:top的增强版工具
        • 2.3.1 核心优势
        • 2.3.2 常用操作
        • 2.3.3 查看进程运行的CPU核心
      • 2.4 进程/线程运行核心查询:精准定位调度状态
        • 2.4.1 查看进程运行的CPU核心
        • 2.4.2 查看线程运行的CPU核心
    • 三、CPU亲和性配置:`taskset`工具详解
      • 3.1 `taskset`核心概念
      • 3.2 `taskset`语法格式
        • 常用选项
      • 3.3 查看CPU亲和性(允许运行的核心)
      • 3.4 设置CPU亲和性:指定进程/线程运行的核心
        • 3.4.1 为已运行的进程设置亲和性
        • 3.4.2 启动进程时指定亲和性
        • 3.4.3 为线程设置亲和性
      • 3.5 关键注意事项
    • 四、实战场景:性能排查与优化示例
      • 场景:系统CPU使用率持续过高,排查原因并优化
        • 步骤1:查看系统CPU整体状态
        • 步骤2:定位CPU占用最高的进程
        • 步骤3:分析该进程的线程状态
        • 步骤4:查看线程运行的CPU核心
        • 步骤5:优化CPU亲和性
        • 步骤6:验证优化效果

在Linux系统运维、应用开发优化过程中,性能分析是核心技能之一。无论是排查CPU占用过高、内存泄漏,还是磁盘I/O瓶颈,熟练掌握系统自带的性能分析工具和指令,能帮助我们快速定位问题根源。本文将从系统基础信息查看、进程线程分析、CPU亲和性配置三个核心维度,详细拆解Linux性能分析的常用手段,结合实战指令与场景示例,助力运维和开发人员高效完成性能优化工作。

一、系统基础信息查看:性能分析的前提

在进行性能排查前,首先需要掌握系统的硬件资源基线,包括CPU、内存、磁盘的核心参数。这不仅能帮助我们判断硬件是否满足应用需求,更能为后续性能瓶颈定位提供参考依据。

1.1 CPU信息查看:主频、核心数与架构

CPU作为系统运算核心,其主频、核心数、缓存大小等参数直接影响系统处理能力。常用查看工具包括lscpu/proc/cpuinfo等。

1.1.1 lscpu:简洁直观的CPU信息汇总

lscpu是最常用的CPU信息查看指令,无需复杂参数,直接执行即可输出CPU的核心参数,包括架构、核心数、线程数、主频、缓存等:

lscpu

核心输出解读

  • Architecture:CPU架构(如x86_64、aarch64);
  • CPU(s):总逻辑CPU数(物理核心数×超线程数);
  • Thread(s) per core:每个核心的线程数(超线程开启时为2);
  • Core(s) per socket:每个CPU插槽的物理核心数;
  • Socket(s):CPU插槽数;
  • CPU MHz:CPU当前主频(动态调频时会变化);
  • CPU max MHz:CPU最大主频;
  • CPU min MHz:CPU最小主频;
  • Cache L1d/L1i/L2/L3:各级缓存大小。
1.1.2 /proc/cpuinfo:详细CPU硬件信息

/proc/cpuinfo是内核提供的虚拟文件,包含CPU的底层硬件信息,适合需要精准获取单个核心参数的场景。通过 grep 过滤关键信息:

# 查看CPU主频(所有核心)
cat /proc/cpuinfo | grep "cpu MHz"
# 查看物理核心数(去重统计)
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
# 查看每个物理核心的逻辑线程数
cat /proc/cpuinfo | grep "siblings"
# 查看CPU型号
cat /proc/cpuinfo | grep "model name" | head -n 1

注意/proc/cpuinfo会为每个逻辑CPU输出一段信息,因此通过“physical id”去重可得到物理核心数,通过“core id”可区分同一物理核心的不同线程。

1.2 内存(RAM)信息查看:容量、使用状态

内存是应用运行的关键资源,内存不足或泄漏会直接导致系统卡顿、应用崩溃。常用工具包括freevmstat/proc/meminfo

1.2.1 free:快速查看内存使用概况

free指令用于显示系统内存的总容量、已用、空闲、缓存等状态,常用参数-h(人性化显示单位)、-m(以MB为单位):

free -h

输出解读

  • total:物理内存总容量;
  • used:已使用内存(包含应用占用、缓存、缓冲区);
  • free:完全空闲的内存;
  • shared:共享内存占用;
  • buff/cache:缓冲区(buffer)+ 页缓存(cache)占用;
  • available:实际可分配给应用的内存(free + buff/cache中可回收部分)。

关键说明:Linux系统会主动使用空闲内存作为缓存(加速文件读写),因此used包含缓存是正常现象,判断内存是否充足应重点关注available

1.2.2 /proc/meminfo:详细内存参数

/proc/meminfo提供比free更详细的内存信息,包括内核占用、交换分区、缓存细分等:

# 查看内存总容量、空闲、缓存
cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached"

核心字段

  • MemTotal:物理内存总容量;
  • MemFree:完全空闲内存;
  • MemAvailable:可分配内存(与free -havailable一致);
  • Buffers:块设备缓冲区(如磁盘I/O缓存);
  • Cached:页缓存(如文件内容缓存);
  • SwapTotal/SwapFree:交换分区总容量/空闲容量。
1.2.3 vmstat:内存与I/O状态监控

vmstat不仅能查看内存使用,还能监控CPU、磁盘I/O、交换分区等状态,适合持续观察内存变化:

# 每2秒输出一次,共输出5次
vmstat 2 5

内存相关字段

  • si:每秒从交换分区读入内存的大小(换入);
  • so:每秒从内存写入交换分区的大小(换出);
  • siso持续不为0,说明物理内存不足,系统频繁使用交换分区,会严重影响性能。

1.3 磁盘信息查看:容量、分区、I/O状态

磁盘I/O瓶颈是数据库、文件服务器等应用的常见问题,需先掌握磁盘容量、分区结构,再进一步排查I/O性能。常用工具包括dfdulsblkiostat

1.3.1 df:磁盘分区容量查看

df用于显示文件系统的磁盘空间使用情况,常用参数-h(人性化单位)、-T(显示文件系统类型):

df -hT

输出解读

  • Filesystem:文件系统(分区)名称;
  • Type:文件系统类型(如ext4、xfs、tmpfs);
  • Size:分区总容量;
  • Used:已使用容量;
  • Avail:可用容量;
  • Use%:使用率;
  • Mounted on:挂载点。

注意df统计的是分区层面的容量,若某分区使用率接近100%,需及时清理文件或扩容。

1.3.2 du:目录/文件占用空间统计

df查看分区容量,du则用于统计具体目录或文件的占用空间,常用参数-h(人性化单位)、-s(汇总统计,不显示子目录)、-c(显示总计):

# 统计/home目录总占用空间
du -sh /home
# 统计当前目录下各子目录占用,显示总计
du -hc *

实战场景:当df显示分区使用率过高时,用du定位大文件/目录:

# 查找/目录下大于100MB的文件
du -ah / --max-depth=1 | grep -E "[0-9]+M" | sort -nr
1.3.3 lsblk:磁盘分区结构查看

lsblk(list block devices)用于显示磁盘、分区的层级结构,清晰展示磁盘与分区的对应关系:

lsblk

输出解读

  • NAME:设备名称(如sda、sda1、nvme0n1);
  • MAJ:MIN:主设备号:次设备号;
  • RM:是否为可移动设备(1=是,0=否);
  • SIZE:设备容量;
  • RO:是否为只读(1=是,0=否);
  • TYPE:类型(disk=磁盘,part=分区,loop=循环设备);
  • MOUNTPOINT:挂载点(未挂载则为空)。
1.3.4 iostat:磁盘I/O性能监控

iostat用于监控磁盘I/O的读写速率、响应时间等,需安装sysstat包(yum install sysstatapt install sysstat):

# 每2秒输出一次,共3次,显示所有磁盘
iostat -x 2 3

核心字段(-x参数显示扩展统计)

  • %util:磁盘I/O使用率(核心指标,接近100%说明I/O饱和);
  • tps:每秒I/O请求数;
  • rkB/s/wkB/s:每秒读/写数据量(KB);
  • avgrq-sz:平均每个I/O请求的大小(扇区数);
  • avgqu-sz:平均I/O队列长度(数值越大,等待时间越长);
  • await:平均每次I/O请求的等待时间(毫秒,包含队列等待+设备处理时间);
  • svctm:设备处理每次I/O请求的时间(毫秒)。

二、进程与线程分析:定位资源占用源头

系统性能问题往往与具体进程/线程相关(如某进程CPU占用100%、内存泄漏)。掌握pstophtop等工具,能快速定位异常进程,分析其资源占用、线程状态、运行核心等。

2.1 ps:进程静态信息查看

ps(process status)用于列出系统当前的进程信息,支持多种参数组合,适合静态查询(快照式)。

2.1.1 常用参数组合
指令功能描述
ps aux显示所有用户的所有进程(BSD风格),包含CPU、内存占用
ps -ef显示所有进程的完整信息(System V风格),包含父进程ID(PPID)
ps -T -p <pid>查看指定进程的所有线程
ps -Lfp <pid>查看指定进程的线程详情(包含线程ID、CPU核心)
ps aux --sort=-%cpu按CPU使用率降序排序
ps aux --sort=-%mem按内存使用率降序排序
2.1.2 输出字段解读(以ps aux为例)
  • USER:进程所属用户;
  • PID:进程ID(唯一标识);
  • %CPU:进程占用的CPU百分比(按逻辑CPU核心数计算,如4核CPU下最大为400%);
  • %MEM:进程占用的物理内存百分比;
  • VSZ:虚拟内存大小(KB);
  • RSS:物理内存常驻大小(KB,进程实际占用的内存);
  • TTY:进程所属终端(?表示无终端,如后台进程);
  • STAT:进程状态(关键字段);
  • START:进程启动时间;
  • TIME:进程累计占用的CPU时间;
  • COMMAND:进程启动命令(包含参数)。
2.1.3 进程状态(STAT)含义
状态符含义
R运行中(正在占用CPU或等待CPU调度)
S可中断睡眠(等待某个事件完成,如I/O)
D不可中断睡眠(深度睡眠,通常与磁盘I/O相关,无法被kill)
Z僵尸进程(进程已终止,但父进程未回收其资源)
T暂停状态(被ctrl+zkill -STOP暂停)
<高优先级进程
N低优先级进程
L包含分页锁定在内存中的进程(如实时进程)
+前台进程组中的进程
2.1.4 线程查看示例
# 查看PID为1234的进程的所有线程(BSD风格)
ps -T -p 1234
# 查看PID为1234的进程的线程详情(包含线程ID、CPU核心)
ps -Lfp 1234

输出字段

  • LWP:线程ID(Light Weight Process);
  • NLWP:该进程的线程总数;
  • PSR:线程当前运行的CPU核心编号(0开始)。

2.2 top:进程动态监控

top是实时监控进程资源占用的核心工具,默认每3秒刷新一次,支持交互操作,适合持续观察异常进程。

2.2.1 基本使用与输出解读

直接执行top,输出分为两部分:

  • 系统状态行(前5行)

    1. 第一行:系统时间、运行时间、登录用户数、负载均衡(load average:1分钟、5分钟、15分钟平均负载,通常不超过CPU核心数);
    2. 第二行:进程总数(total)、运行中(running)、睡眠(sleeping)、停止(stopped)、僵尸(zombie)进程数;
    3. 第三行:CPU使用率(us=用户态,sy=内核态,ni= nice值调整的优先级进程,id=空闲,wa=等待I/O的CPU时间,hi=硬中断,si=软中断,st=虚拟化窃取的CPU时间);
    4. 第四行:内存使用(总量、已用、空闲、缓存);
    5. 第五行:交换分区使用(总量、已用、空闲、缓冲)。
  • 进程列表(后续行):字段与ps类似,重点关注PID%CPU%MEMCOMMAND

2.2.2 常用交互命令(top运行中输入)
命令功能
P按CPU使用率降序排序
M按内存使用率降序排序
T按进程累计CPU时间降序排序
H显示线程(默认只显示进程,开启后进程行下会显示其线程)
f自定义显示字段(可添加PSR(CPU核心)、NLWP(线程数)等)
o调整排序字段
k终止进程(输入PID后按回车,再输入信号量,如9强制终止)
r调整进程优先级(nice值,范围-20~19,值越小优先级越高)
q退出top
2.2.3 线程监控示例
# 实时监控PID为1234的进程的线程(按CPU排序)
top -H -p 1234
  • -H:强制显示线程(每个线程作为一行);
  • -p <pid>:只监控指定进程;
  • 结合交互命令P,可快速找到该进程中CPU占用最高的线程。

2.3 htop:top的增强版工具

htoptop的替代工具,界面更友好,支持鼠标操作,默认显示更多实用信息(如CPU核心、内存使用条形图、线程树),需手动安装(yum install htopapt install htop)。

2.3.1 核心优势
  1. 彩色界面,资源占用用条形图直观展示;
  2. 支持鼠标点击排序、选择进程;
  3. 默认显示CPU核心数与每个核心的使用率;
  4. 内置进程树视图(按F5);
  5. 支持快速终止进程(F9)、调整优先级(F7/F8);
  6. 可直接查看线程(默认按H键开启/关闭)。
2.3.2 常用操作
操作功能
F1查看帮助文档
F2自定义界面(添加/删除字段、调整显示样式)
F3搜索进程/线程(输入关键词)
F4过滤进程/线程(仅显示包含关键词的条目)
F5切换进程树视图(显示父进程与子进程关系)
F7降低进程优先级(nice值+1)
F8提高进程优先级(nice值-1)
F9终止进程(选择信号量,如9=强制终止)
F10退出htop
H开启/关闭线程显示
U筛选指定用户的进程
P按CPU使用率排序
M按内存使用率排序
2.3.3 查看进程运行的CPU核心

htop中,开启线程显示(H键)后,选中目标进程/线程,查看界面左侧的CPU核心编号(或通过F2添加“PSR”字段),即可知道该进程/线程当前运行在哪个CPU核心上。

2.4 进程/线程运行核心查询:精准定位调度状态

除了pshtop,还可以通过以下指令直接查询进程/线程运行的CPU核心:

2.4.1 查看进程运行的CPU核心
# 方法1:ps显示进程的CPU核心(PSR字段)
ps -o pid,ppid,cmd,%cpu,%mem,psr -p <pid>
# 方法2:通过/proc/<pid>/stat文件查询(第39字段为CPU核心编号)
cat /proc/<pid>/stat | awk '{print "CPU核心:" $39}'
# 方法3:taskset查看进程的CPU亲和性(允许运行的核心)
taskset -cp <pid>
2.4.2 查看线程运行的CPU核心

线程是调度的基本单位,每个线程可独立运行在不同核心上。查询线程核心需用到线程ID(LWP):

# 1. 先获取进程的所有线程ID(LWP)
ps -T -p <pid>
# 2. 查看指定线程的CPU核心(将<tid>替换为线程ID)
ps -o pid,lwp,psr -p <pid> -L <tid>
# 或通过/proc/<pid>/task/<tid>/stat查询
cat /proc/<pid>/task/<tid>/stat | awk '{print "CPU核心:" $39}'

三、CPU亲和性配置:taskset工具详解

CPU亲和性(CPU Affinity)是指将进程/线程绑定到指定的CPU核心上运行,避免系统调度器频繁切换核心,减少缓存失效(CPU缓存是核心私有资源,切换核心会导致缓存重新加载),从而提升性能。taskset是Linux系统自带的CPU亲和性配置工具。

3.1 taskset核心概念

  • CPU亲和性掩码(Affinity Mask):用二进制表示进程可运行的CPU核心。例如,4核CPU(核心0~3)的掩码0x03(二进制0011)表示允许运行在核心0和1上;
  • 核心列表(Core List):用逗号分隔的核心编号(0开始),更直观,如0,2-3表示核心0、2、3;
  • taskset支持两种模式:掩码模式(默认)和列表模式(-c参数)。

3.2 taskset语法格式

# 查看进程的CPU亲和性
taskset [选项] -p <pid>
# 设置进程的CPU亲和性
taskset [选项] -p <掩码/核心列表> <pid>
# 启动进程时指定CPU亲和性
taskset [选项] <掩码/核心列表> <命令>
常用选项
  • -p:操作已存在的进程(指定PID);
  • -c:使用核心列表(而非掩码),更易理解;
  • -a:当指定多个PID时,对所有PID生效;
  • --all-tasks:对进程的所有线程生效(默认仅对主线程生效)。

3.3 查看CPU亲和性(允许运行的核心)

# 方法1:列表模式(推荐),查看PID为1234的进程的亲和性
taskset -cp 1234
# 输出示例:pid 1234's current affinity list: 0-3(允许运行在核心0~3)# 方法2:掩码模式,查看PID为1234的进程的亲和性(十六进制掩码)
taskset -p 1234
# 输出示例:pid 1234's current affinity mask: f(十六进制f=二进制1111,对应核心0~3)

3.4 设置CPU亲和性:指定进程/线程运行的核心

3.4.1 为已运行的进程设置亲和性
# 示例1:将PID为1234的进程绑定到核心0(列表模式)
taskset -cp 0 1234
# 输出示例:pid 1234's new affinity list: 0# 示例2:将PID为1234的进程绑定到核心0、2、3(列表模式,逗号分隔单个核心,短横线表示范围)
taskset -cp 0,2-3 1234
# 输出示例:pid 1234's new affinity list: 0,2-3# 示例3:掩码模式(不推荐,需手动转换),绑定核心0和1(掩码0x03=二进制0011)
taskset -p 0x03 1234
3.4.2 启动进程时指定亲和性
# 示例1:启动./app程序,绑定到核心1和2
taskset -c 1-2 ./app# 示例2:启动Python脚本,绑定到核心0、3
taskset -c 0,3 python script.py
3.4.3 为线程设置亲和性

taskset默认对进程的主线程生效,若需为进程的特定线程设置亲和性,需指定线程ID(TID):

# 1. 先获取进程1234的所有线程ID(LWP)
ps -T -p 1234
# 假设线程ID为1235# 2. 为线程1235绑定到核心2
taskset -cp 2 1235

注意:线程的亲和性会继承自进程,但可单独设置,且优先级高于进程亲和性。

3.5 关键注意事项

  1. 核心编号从0开始:CPU核心编号以0为起始(如4核CPU为0、1、2、3),避免误将核心1当作第一个核心;
  2. 亲和性是“允许”而非“强制”:设置亲和性后,进程/线程只会在指定核心上运行,但核心繁忙时仍会等待调度,不会抢占核心;
  3. 避免绑定过多核心:若应用为单线程,绑定到单个核心即可(减少缓存失效);多线程应用可绑定到多个核心,但需避免跨NUMA节点(可通过lscpu | grep NUMA查看NUMA节点);
  4. 设置后重启失效taskset设置的亲和性仅对当前进程有效,进程重启后会恢复默认(允许所有核心),若需持久化,需在启动脚本中添加taskset指令;
  5. root权限:设置其他用户的进程亲和性需root权限(sudo)。

四、实战场景:性能排查与优化示例

结合上述工具,我们通过一个实战场景演示性能分析的完整流程:

场景:系统CPU使用率持续过高,排查原因并优化

步骤1:查看系统CPU整体状态
top  # 或 htop

发现%us(用户态CPU使用率)高达90%,系统负载(load average)超过CPU核心数(4核CPU,load average=8.5)。

步骤2:定位CPU占用最高的进程
# 按CPU使用率降序排序,查看前10个进程
ps aux --sort=-%cpu | head -n 10

发现PID为5678的java进程CPU占用率达350%(4核CPU下,相当于占用3.5个核心)。

步骤3:分析该进程的线程状态
# 实时监控该进程的线程(按CPU排序)
top -H -p 5678

发现该进程下有4个线程(LWP:5679、5680、5681、5682),每个线程CPU占用率约80%,且分散在4个核心上运行。

步骤4:查看线程运行的CPU核心
# 查看该进程的所有线程及其运行核心
ps -Lfp 5678

发现4个线程分别运行在核心0、1、2、3上,由于该应用是CPU密集型,跨核心运行导致缓存频繁失效,性能下降。

步骤5:优化CPU亲和性

将4个线程绑定到相邻的核心0~3(或根据NUMA节点绑定到同一节点的核心),减少缓存失效:

# 为进程5678设置亲和性(允许运行在核心0~3)
taskset -cp 0-3 5678
# 或为每个线程单独绑定核心(假设线程ID为5679~5682)
taskset -cp 0 5679
taskset -cp 1 5680
taskset -cp 2 5681
taskset -cp 3 5682
步骤6:验证优化效果

再次通过tophtop监控,发现java进程CPU占用率降至300%,系统负载降至4.2,应用响应速度提升约20%。

http://www.dtcms.com/a/553389.html

相关文章:

  • 软件测试面试的排序算法问题如何回答
  • Verilog和FPGA的自学笔记8——按键消抖与模块化设计
  • 深入解析 display: flow-root:现代CSS布局的隐藏利器
  • 汕头网站制作方法购物网站价格
  • 电商网站建设精准扶贫的目的建筑施工特种证书查询入口官网
  • spring-ai advisors 使用与源码分析
  • 关键词解释:点积(Dot Product)在深度学习中的意义
  • 本地部署DeepSeek-OCR:打造高效的PDF文字识别服务
  • 机器视觉系统中工业相机的常用术语解读
  • 【论文精读】GenRec:基于扩散模型统一视频生成与识别任务
  • seo提高网站排名wordpress内容页不显示
  • Velero(原名Heptio Ark) 是一个专为 Kubernetes 设计的开源备份恢复工具
  • 企业网站模板中文 产品列表深圳福田区住房和建设局网站
  • 制作网站的价格一般由什么组成
  • Spring MVC 架构总览与请求处理流程
  • 网站推广的优势有做二手厨房设备的网站吗
  • 请问聊城做网站wordpress模板个人博客
  • 蒲福风力等级表
  • 小小电脑安装logisim-evolution
  • C# 六自由度机械臂正反解计算
  • 【开题答辩全过程】以 基于Java的旅游网站的设计与开发为例,包含答辩的问题和答案
  • 【深入学习Vue丨第一篇】Props 完全指南
  • U-net 系列算法总结
  • 什么网站可以做模型挣钱网站建设公司有多少家
  • 网站建设的杂志建筑专业网站建设
  • vue3+ts面试题(一)JSX,SFC
  • 网站开发 数字证书网站制作设计方案
  • PCB设计----阻抗不连续的解决方法
  • 网站制作北京网站建设公司哪家好安平县哪家做网站
  • 14. setState是异步更新