码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 极客时间 - 《Linux 性能优化实战》


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

    • 02 | 基础篇:到底应该怎么理解“平均负载”?
      • 在Linux系统中,当一个进程启动时,操作系统会为该进程申请哪些资源?(9点)
      • 如何理解进程的 S 状态?
      • 如何理解进程的 D 状态?
      • 如何理解进程的 R 状态?
      • 如何理解进程的 Z 状态?
      • 如何理解父进程执行结束,操作系统也会释放子僵尸进程描述符?
      • 如何理解进程的 I 状态?
      • 如何理解进程的 T 状态?
      • 如何理解平均负载?
      • 如何理解 uptime 的运行结果?如何判断结果是否正常或异常?
      • 如何理解CPU使用率?
      • 如何理解CPU使用率和平均负载的关系?
      • 如何理解 mpstat 工具?
      • 如何理解 pidstat 工具?
    • 03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
      • CPU中有哪些常见的寄存器,功能是什么?(9种)
      • 进程的上下文切换都切换了哪些信息?(7条)
      • CPU在什么情况下切换到其他进程运行?(6点)
      • 同一进程内线程的上下文切换,哪些信息会切换?哪些信息不会切换?
        • 会切换的信息(5条)
        • 不会切换的信息(4条)
      • 中断的上下文切换,哪些信息会切换?哪些信息不会切换?
        • 会切换的信息(4条)
        • 不会切换的信息(3条)
    • 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
      • 如何理解 vmstat 工具?
      • 如何理解 pidstat 工具查看线程上下文切换?
      • 如何理解 cswch 和 nvcswch ?
      • 如何查看中断升高发生的类型?
      • 什么情况的每秒上下文切换才算正常?
    • 05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
      • 如何理解 top 命令的运行结果?
      • 如何理解 ps 命令的运行结果?
      • 如何理解 平均CPU使用率?
      • 如何理解CPU节拍率?
      • 分析一下 man proc?
      • 如何使用 perf 工具定位到 CPU占用率高的具体源码行数?
    • 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
      • 如何理解 pstree 命令?
      • 如何理解 execsnoop 命令?

    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

    $ 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占用率高的具体源码行数?

    06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    如何理解 pstree 命令?

    如何理解 execsnoop 命令?

  • 相关阅读:
    主流的分布式调度框架、Elastic-job简介、功能和常用介绍
    axios get请求不能通过body 数据json数据
    面试总结之并发编程
    超强换元法,二重积分计算的核武器!(雅可比行列式超通俗讲解)
    【算法竞赛入门练习题】判断输入的数字是否为回文数字的俩种方法,数字逆置的方法
    Android12 崩溃--android项目迁移
    webpack快速入门-核心概念
    【蓝桥杯国赛真题05】python读数系统 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
    【css-banner图片自适应】
    【RPA实战】 中秋节月饼不知道买哪种?UiPath零代码2分钟获取1000种月饼商品信息告诉你答案
  • 原文地址:https://blog.csdn.net/qq_43648751/article/details/140099417
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号