极客时间 - 《Linux 性能优化实战》

极客时间 - 《Linux 性能优化实战》原文链接:https://time.geekbang.org/column/intro/100020901

02 | 基础篇:到底应该怎么理解"平均负载"?

在Linux系统中,当一个进程启动时,操作系统会为该进程申请哪些资源?(9点)

  • PID:系统中唯一标识,用于区分不同的进程,进行进程管理和调度。
  • 虚拟内存空间:包括代码段、数据段、堆、栈等,存储进程代码、数据、运行时堆栈等信息。
  • 文件描述符:进程可以打开文件、管道、套接字等,操作系统会为这些打开的资源分配文件描述符,用于标记和访问这些资源。
  • CPU时间片:确保进程能够获得必要的CPU资源来执行其任务。
  • 进程控制块 PCB:操作系统会为每个进程创建一个进程控制块,其中包含进程的状态信息、寄存器值、调度信息等,用于管理和调度进程。
  • 环境变量:包含了一些配置信息和运行时参数,影响进程运行和配置。
  • 信号处理器:操作系统会为进程设置信号处理器,用于处理各种信号事件(如中断、终止信号等),确保进程能够正确响应各种信号事件。
  • 用户和组ID,用于权限管理和访问控制。
  • 网络资源:socket,支持进程进行网络通信。

如何理解进程的 S 状态?

  • S(interruptible Sleep)
  • 进入条件:需要等待可被信号中断的事件发生。
  • 可处理信号。
  • 进程暂停执行,释放CPU资源。
  • 等待的特定事件发生后,从S状态转换为就绪状态,等待CPU调度执行。
  • 应用场景:文件IO,网络通信,进程间通信。

如何理解进程的 D 状态?

  • D(Uninterruptible Sleep)
  • 进入条件:需要等待可被信号中断的事件发生。
  • 不可处理信号,直到等待事件发生。(这个时候信号会等事件响应之后处理吗?)
  • 进程暂停执行,释放CPU资源。
  • 等待的特定事件发生后,从S状态转换为就绪状态,等待CPU调度执行。
  • 应用场景(进程与硬件设备直接交互):磁盘读写,DMA操作,内核锁,内核同步操作。

如何理解进程的 R 状态?

  • R(Running):进程正在被CPU调度,占用CPU。
  • R(Runnable):进程等待被CPU调度,不占用CPU。

如何理解进程的 Z 状态?

  • Z(Zombie)僵尸状态。
  • 子进程执行结束,子进程描述符保留在操作系统进程表中。
  • 子进程不能通过发送信号杀死,需要通过父进程调用 wait()waitpid() 来获取其退出状态信息后,操作系统释放进程描述符。
  • 父进程执行结束,操作系统也会释放子僵尸进程描述符。
  • 不占用CPU和内存资源,占用进程表中的一个进程描述符。

如何理解父进程执行结束,操作系统也会释放子僵尸进程描述符?

  • 操作系统检测到父进程结束。
  • 将僵尸子进程PPID改为1,即 init 进程的PID。
  • init进程会定期调用 wait() 或 waitpid() 系统调用来获取僵尸子进程的退出状态,操作系统释放僵尸子进程资源(包括文件描述符),结束这些僵尸子进程的生命周期。

如何理解进程的 I 状态?

如何理解进程的 T 状态?

如何理解平均负载?

单位时间内,系统处于 R状态(正在使用 CPU 或者正在等待 CPU 的进程) 和 D状态(不可中断睡眠状态的进程) 的平均进程数。

如何理解 uptime 的运行结果?如何判断结果是否正常或异常?

TUPIAN

shell 复制代码
$ uptime
02:34:03 up 2 days, 20:14,  1 user,  load average: 0.63, 0.83, 0.88

正常情况:

  • 平均负载数值 / CPU逻辑核心数 < 70%。
  • 分析趋势:1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大。

异常情况:

  • 平均负载数值 / CPU逻辑核心数 > 70%。
  • 分析趋势:1 分钟、5 分钟、15 分钟的三个值递减,说明最近这段时间负载在增加,一旦 1 分钟的平均负载接近或超过了逻辑 CPU 的个数,就意味着系统正在发生过载问题,需要分析问题并进行优化。

如何理解CPU使用率?

如何理解CPU使用率和平均负载的关系?

场景 CPU使用率 平均负载
CPU密集型进程 ↑(CPU实际使用率会升高。) ↑(正在使用CPU的进程数增加。)
IO密集型 ---(IO操作不会占用CPU。) ↑(等待IO,不可中断睡眠状态进程数增加。)
大量等待CPU调度的进程 ↑(大量进程在进行上下文切换,会消耗CPU,CPU并没有在真正的执行进程指令。) ↑(等待CPU调度的进程数增加。)

如何理解 mpstat 工具?

功能:多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。

执行结果分析:

如何理解 pidstat 工具?

功能:进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

执行结果分析:

03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)

CPU中有哪些常见的寄存器,功能是什么?(9种)

  • 通用寄存器(General Purpose Registers, GPRs):存储数据和地址。
  • 程序计数器(Program Counter):存储下一条要执行的指令的地址。
  • 栈寄存器(Stack Pointer, SP):指向当前栈的顶部。
  • 基址指针(Base Pointer, BP):指向栈中的某个固定地址(通常是函数的栈起始地址),通过 基址指针 + 偏移 访问局部变量和参数
  • 指令寄存器(Instruction Register):存储当前正在执行的指令。
  • 状态寄存器(Status Register):存储CPU执行指令后的状态信息,如进位标志(CF)、零标志(ZF)、符号标志(SF)、溢出标志(OF)等。
  • 浮点寄存器:用于存储浮点数和SIMD(单指令多数据)指令的数据。
  • 控制寄存器:存储CPU的控制信息,如分页机制、保护模式、调试等。
  • 调试寄存器:用于硬件调试,如设置断点、监视内存访问等。

进程的上下文切换都切换了哪些信息?(7条)

  • 所有寄存器信息。
  • 虚拟内存信息。
  • 进程状态。(就绪,等待,运行等)
  • 进程优先级。
  • IO状态信息:IO缓冲区、文件打开状态等。
  • 资源使用情况。(CPU使用时间,内存使用情况等)
  • 信号处理相关信息。(待处理的信号列表,信号处理函数地址等)

CPU在什么情况下切换到其他进程运行?(6点)

  • 分片的时间片用完。
  • 当前进程执行结束。
  • 程序主动 sleep。
  • 资源不足(例如:内存)。
  • 硬件中断,执行内核中断服务程序。
  • 高优先级进程运行存在时。

同一进程内线程的上下文切换,哪些信息会切换?哪些信息不会切换?

会切换的信息(5条)

  • 程序计数器(Program Counter):保存当前线程下一条要执行的指令的地址。
  • 寄存器状态:包括通用寄存器、浮点寄存器、状态寄存器等所有CPU寄存器的内容。
  • 栈指针和基址指针:保存当前线程栈顶和栈起始位置。
  • 线程状态:运行、就绪、阻塞等状态。
  • 线程本地存储:保存线程私有数据。

不会切换的信息(4条)

  • 进程虚拟地址空间:同一进程内所有线程共享相同的虚拟地址空间(代码段、数据段、堆等)。
  • 全局变量和静态变量:进程的虚拟地址空间共享。
  • 打开的文件描述符和文件系统信息:进程级别资源。
  • 信号处理设置。

中断的上下文切换,哪些信息会切换?哪些信息不会切换?

会切换的信息(4条)

  • 通用寄存器。
  • 程序计数器(Program Counter):存储下一条要执行的指令的地址。
  • 栈寄存器(Stack Pointer, SP):指向当前栈的顶部。
  • 状态寄存器(Status Register):存储CPU执行指令后的状态信息,如进位标志(CF)、零标志(ZF)、符号标志(SF)、溢出标志(OF)等。

不会切换的信息(3条)

  • 内存内容:内存中的数据通常不会因为中断而切换,除非中断处理程序需要修改这些数据。
  • 外部设备状态:外部设备的状态(如硬盘、网络接口等)不会因为中断而切换,这些状态由设备自身管理。
  • 全局变量和静态变量:这些变量的值通常不会因为中断而切换,除非中断处理程序需要修改这些变量。

04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)

如何理解 vmstat 工具?

功能:

执行结果分析:

如何理解 pidstat 工具查看线程上下文切换?

功能:pidstat -wt 1

执行结果分析:

如何理解 cswch 和 nvcswch ?

cswch(每秒自愿上下文切换(voluntary context switches)的次数):系统资源不足发生。

cswch变多,进程都在等待资源,有可能发生了 I/O 等其他问题;

nvcswch(每秒非自愿上下文切换(non voluntary context switches)的次数):时间片用完,系统强制调度。

nvcswch变多,进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;

如何查看中断升高发生的类型?

功能:watch -d cat /proc/interrupts

interrupt变多, CPU 被中断处理程序占用,需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

什么情况的每秒上下文切换才算正常?

  • 稳定在1万次以内。
  • 有增长,但是次数不是数量级的增长。

05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?

如何理解 top 命令的运行结果?

如何理解 ps 命令的运行结果?

如何理解 平均CPU使用率?

TUPIAN:公式

如何理解CPU节拍率?

CPU节拍率:CPU每秒发生时钟中断的次数,如果是100,则CPU每秒发生100次时钟中断。

每次时钟中断的发生,操作系统都有机会进行上下文切换,实现多个任务共享CPU时间,实现多任务并发处理。

分析一下 man proc?

如何使用 perf 工具定位到 CPU占用率高的具体源码行数?

相关推荐
梦游钓鱼18 分钟前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v24 分钟前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
沉默的八哥43 分钟前
K8S高可用Web应用部署方案
运维
winyh51 小时前
Vite 打包后Nginx部署配置
运维·nginx
钢板兽1 小时前
Java后端高频面经——JVM、Linux、Git、Docker
java·linux·jvm·git·后端·docker·面试
byxdaz1 小时前
NVIDIA显卡驱动、CUDA、cuDNN 和 TensorRT 版本匹配指南
linux·人工智能·深度学习
pyliumy2 小时前
在基于Arm架构的华为鲲鹏服务器上,针对openEuler 20.03 LTS操作系统, 安装Ansible 和MySQL
服务器·架构·ansible
大白的编程日记.2 小时前
【Linux学习笔记】Linux基本指令分析和权限的概念
linux·笔记·学习
运维小贺2 小时前
Nginx常用的模块
运维·nginx·正则表达式
努力学习的小廉2 小时前
深入了解Linux —— 调试程序
linux·运维·服务器