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

发布于:2024-07-02 ⋅ 阅读:(173) ⋅ 点赞:(0)

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状态 和 D状态 的平均进程数。

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

TUPIAN

$ 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实际使用率会升高。) ↑(R状态进程增加。)
IO密集型 —(IO操作不会占用CPU。) ↑(D状态进程增加。)
大量等待CPU调度的进程 ↑(大量进程在进行上下文切换。) ↑(R状态进程增加。)

如何理解 mpstat 工具?

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

执行结果分析:

如何理解 pidstat 工具?

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

执行结果分析: