linux性能分析-cpu-memory

本文围绕Linux系统展开,介绍了平均负载、CPU上下文切换、CPU使用率等概念及排查命令。阐述了不可中断和僵尸进程的含义与排查方法,还讲解了软中断的上下半部处理机制。此外,对内存映射、虚拟内存空间分布、内存分配等进行说明,并提及系统内存问题的排查要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平均负载

top或uptime命令

指的是系统可运行状态和不可中断状态的进程数。

 

load average: 0.63, 0.83, 0.88

可运行状态指的是正在使用cpu或正在等待cpu的进程。

  • 不可中断状态指的是内核态关键流程中,比如说等待硬件设备I/O响应(ps命令D状态)。

一般平均负载大于cpu数量的70%需要关注性能问题。

平均负载高不一定CPU使用率高,等待I/O也会导致平均负载升高。

CPU上下文切换

概念

CPU的上下文切换就是把CPU寄存器和程序计数器保存起来,然后加载新任务的上下文。

系统调用

进程用户态到内核态需要系统调用完成,比如文件读写。一次系统调用会发生两次CPU上下文切换。
通过系统调用过程称为特权模式切换,并且不会涉及虚拟内存等进程用户态资源

进程上下文切换

进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
Linux通过TLB管理虚拟内存到物理内存,所以虚拟内存更新会导致TLB刷新。多核处理器共享缓存,所以会影响当前处理器的进程和共享缓存的其他处理器的进程。
时间片轮转调度、系统资源不足、进程sleep挂起和硬件中断都会导致进程上下文切换。

线程上下文切换

  1. 前后两个线程属于不同进程,和进程上下文切换相同;
  2. 属于同一进程,因为虚拟内存共享,所以只切换线程私有数据、寄存器等不共享数据。

中断上下文切换

中断会打断进程的正常调度和执行。上下文只包括内核态中断服务程序执行所必须的状态,CPU寄存器、内核堆栈、硬件中断参数等。

CPU上下文切换排查命令

$ vmstat

$ pidstat -w -u 1

//wt可以看线程上下文切换
$ pidstat -wt 1

// -d 参数表示高亮显示变化的区域
$ watch -d cat /proc/interrupts

CPU使用率

为了维护系统CPU时间,linux通过定义节拍率,触发事件中断。每次中断,jiffies的值+1。

//内核,每秒触发250次时间中断
$ grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=250

//用户空间节拍率
USER_HZ=100

jiffies统计值:

$ cat /proc/stat | grep ^cpu

$ cat /proc/[pid]/stat

cpu使用率 = 1 - (空闲时间/总cpu时间)

查看CPU使用率的命令

  • top 默认统计3秒间隔;
  • ps 统计进程的整个生命周期;
  • pidstat [pid] 查看进程内核用户态CPU使用率。

CPU过高排查

  • GDB调试;
  • perf top命令,可以显示占用CPU时钟最多的函数或指令。

有时,会发现top命令%Cpu(s)使用率高,但进程cpu使用率总和达不到%Cpu(s)。

  • 应用调用其他二进制程序,这些程序运行时间较短;
  • 应用本身在不停奔溃重启。

不可中断和僵尸进程

$ ps aux | grep /app
  • 1
  • 不可中断(D),一般表示进程在和硬件交互,不允许中断;
  • 僵尸进程(Z),表示进程实际已经结束,但父进程没有回收它的资源(比如进程的描述符、PID等)。

进程组和会话

  • 进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员;
  • 会话是指共享同一个控制终端的一个或多个进程组。

比如,SSH会打开一个控制终端(TTY),这个就对应一个会话(s)。我们在终端运行命令以及它们的子进程,构成了一个个进程组。前台运行构成前台进程组(+),后台运行构成后台进程组。

问题排查

如果进程长时间不可中断,通过dsta、pidstat查看是否磁盘I/O问题。但iowait高不一定代表I/O有瓶颈,当系统中只有I/O类型的进程运行时,iowait也会很高。

僵尸进程可以使用$ pstree -aps [pid]查看父进程。

软中断

Linux将中断分成上半部和下半部:

  • 上半部快速处理中断,中断禁止模式下运行,主要处理与硬件相关或时间敏感工作(会打断CPU正在执行的任务);
  • 下半部用来延迟处理上半部未完成的工作,以内核线程方式运行。

以网卡接受数据包为例

  1. 上半部把网卡数据读到内存中,然后更新硬件寄存器的状态,再发送一个软中断信号。
  2. 下半部被软中断信号唤醒,会从内存中找网络数据,按照网络协议栈,对数据进行逐层解析处理,直到把它送给应用程序。

查看软中断和内核线程

//提供了软中断的运行情况
$ /proc/softirqs

//提供了硬中断的运行情况
$ /proc/interrupts

//查看软中断对应的内核线程,ksoftirqd/CPU 编号
$ ps aux | grep softirq
root         7  0.0  0.0      0     0 ?        S    Oct10   0:01 [ksoftirqd/0]

问题排查

使用watch命令数值变化

$ watch -d cat /proc/softirqs
  • 1

网络收发软中断排查命令

$ sar -n DEV 1

//抓包命令
//-i eth0 只抓取 eth0 网卡,-n 不解析协议名和主机名
$ tcpdump -i eth0 -n tcp port 80
15:11:32.678966 IP 192.168.0.2.18238 > 192.168.0.30.80: Flags [S], seq 458303614, win 512, length 0

CPU分析工具

根据指标找工具

在这里插入图片描述

根据根据查指标

在这里插入图片描述

快速分析路径

在这里插入图片描述

 

内存映射

Linux内核给每个进程提供了一个独立的连续虚拟地址空间(独立!可以将进程内存隔离)。

每个进程的虚拟地址分为内核空间用户空间。但内核空间,其实关联的都是相同的物理内存。进程用户态只能访问用户空间内存;内核态可以访问内核空间内存。

内存映射就是将虚拟内存地址映射到物理内存地址,内核为每个进程都维护了一张页表,记录映射关系。
页表实际存储在CPU的内存管理单元MMU中,页表还有一个缓冲TLB(Translation Lookaside Buffer,转译后备缓冲器)。
在这里插入图片描述
页的大小为4KB,为了解决页过多,Linux提供了两种机制多级页表和大页(HugePage)。
多级页表就是把内存分成区块来管理,将原来的映射关系改成区块索引和区块内的偏移,这样可以大大减少页表的项数。(其实也可以直接映射正使用的页,但这会导致页不连续,不能使用偏移量查找)
Linux使用四级页表管理内存页。
在这里插入图片描述
大页就是比普通页更大的内存块。

当访问虚拟地址在页表中找不到时,会产生缺页异常,进入内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

虚拟内存空间分布

在这里插入图片描述
上图为32位系统虚拟内存空间分布。
除内核空间外,用户空间内存,从低到高分别是五种不同内存段。

  1. 只读段,包括代码和常量等。
  2. 数据段,包括全局变量等。
  3. 堆,包括动态分配的内存,从低地址开始向上增长。
  4. 文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
  5. 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。

比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

内存分配

malloc()两种实现方式:

  1. 对小块内存(小于 128K),C 标准库使用 brk() 来分配,通过移动堆顶的位置来分配内存。这些内存释放后并不会立刻归还系统,而是被缓存起来,这样就可以重复使用。
  2. 大块内存(大于 128K),使用内存映射 mmap()在文件映射段找一块空闲内存分配。释放时直接归还给系统。

在内核空间,Linux 则通过 slab 分配器来管理小内存。可以把 slab 看成构建在伙伴系统上的一个缓存,主要作用就是分配并释放内核中的小对象。

malloc() 申请内存后,内存并不会立即分配,而是在首次访问时,才通过缺页异常陷入内核中分配内存。

理解内存中的Buffer和Cache

man free ,可以看到buffer 和 cache 的说明:

  • Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached与 SReclaimable 之和。

man proc,关于meminfo 说明:

  • Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。
  • Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据
  • SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。

系统内存问题排查

在这里插入图片描述
性能指标和工具的联系
在这里插入图片描述
在这里插入图片描述
分析流程图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值