极客时间 - 《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占用率高的具体源码行数?

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习从0开始——Kaggle实践可视化001

Python学习从0开始——Kaggle实践可视化001 一、创建和加载数据集二、数据预处理1.按name检查&#xff0c;处理重复值&#xff08;查重&#xff09;2.查看存在缺失值的列并处理&#xff08;缺失值处理&#xff09;2.1按行或列查看2.2无法推测的数据2.3可由其它列推测的数据 3.拆…

QT实现GIF动图显示(小白版,可直接copy使用)

需要你自己提前设置好动图的位置&#xff0c;本例中存放于"/Users/PLA/PLA/PLA.gif widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QLabel>class Widget : public QWidget {Q_OBJECTpublic:explicit Wid…

mysql数据表时间字段自动存时间

时间字段自动存时间&#xff0c;不用通过插入语句存当前操作时间&#xff1a; created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,

深入分析 Android BroadcastReceiver (九)

文章目录 深入分析 Android BroadcastReceiver (九)1. Android 广播机制的扩展应用与高级优化1.1 广播机制的扩展应用1.1.1 示例&#xff1a;有序广播1.1.2 示例&#xff1a;粘性广播1.1.3 示例&#xff1a;局部广播 1.2 广播机制的高级优化1.2.1 示例&#xff1a;使用 Pending…

空调计费系统是什么,你知道吗

空调计费系统是一种通过对使用空调的时间和能源消耗进行监测和计量来进行费用计算的系统。它广泛应用于各种场所&#xff0c;如家庭、办公室、商场等&#xff0c;为用户提供了方便、准确的能源使用管理和费用控制。 可实现功能 智能计费&#xff1a;中央空调分户计费系统通过智…

SOLIDWORKS分期许可(订阅形式),降低前期的投入成本!

SOLIDWORKS 分期许可使您能够降低前期软件成本&#xff0c;同时提供对 SOLIDWORKS 新版本和升级程序的即时访问&#xff0c;以及在每个期限结束时调整产品的灵活性&#xff0c;帮助您跟上市场需求和竞争压力的步伐。 目 录&#xff1a; ★ 1 什么是SOLIDWORKS分期许可 ★ 2 …

gen_region_line 生成直线

gen_region_line (Operator) Name 名称 gen_region_line — Store input lines as regions.将输入行存储为region。 生成直线&#xff0c;直线区域 Signature 签名 gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : ) Description 描述 运算符ge…

【LLM大模型】程序员为什么要学习大模型应用开发?

0 prompt engineer 就是prompt工程师它的底层透视。 1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#…

请查收!模拟电路精选书单一份(可下载)

在电子工程的广阔天地中&#xff0c;模拟电路设计是一门艺术&#xff0c;也是一种科学。它要求设计师不仅要有深厚的理论知识&#xff0c;还要有精湛的实践技能。随着技术的发展&#xff0c;模拟电路设计领域不断涌现新的理论、技术和工具&#xff0c;这使得学习和掌握模拟设计…

css使用伪元素after或者before的时候想要给after设置z-index无效

css使用伪元素after或者before的时候想要给after或者before设置一个层级关系&#xff0c;使该伪类写入的样式在box的下面&#xff0c;发现给box设置z-index无效&#xff0c; 需要找到父级元素&#xff0c;在父级元素上设置z-index值并且将伪类设置z-index:-1

开放式耳机哪个牌子好?五款优质产品推荐,老司机带飞!

后台有粉丝滴滴我说&#xff0c;还想再多分享一些耳机的测评或者选购指南&#xff0c;开放式耳机确实越来越火了&#xff0c;市面上的品牌从十几块到几千块的开放式耳机也比比皆是&#xff0c;但是要选择适合自己的一款开放式耳机确实还挺难的&#xff0c;所以作为耳机测评师这…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型——这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&…

【算法题解】部分洛谷题解(下)

前言 本篇为我做过的洛谷题的部分题解&#xff0c;大多是我认为比较具有代表性的或者比较有意思的题目&#xff0c;包含我自己的思考过程和想法。 [NOIP2001 提高组] 一元三次方程求解 题目描述 有形如&#xff1a; a x 3 b x 2 c x d 0 a x^3 b x^2 c x d 0 ax3bx2…

SAP-SD同一物料下单价格确不同

业务说明&#xff1a; 业务部门反馈&#xff0c;同一物料下销售订单时&#xff0c;价格确不同。 那么这个价格是怎么取到的呢&#xff1f; 逻辑说明&#xff1a; 1、首先查看销售订单 可以看到相同物料价格是不同的&#xff0c;条件类型都是ZPR5&#xff0c;但是客户是不同…

如何网页在线编辑微软Office Word,并导出为PDF格式。

随着互联网技术的不断发展&#xff0c;越来越多的企业开始采用在线办公模式&#xff0c;微软Office Word 是最好用的文档编辑工具&#xff0c;然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的&#xff0c;如果可以实现Web在线预览编辑Of…

电商平台的高并发处理与安全防护策略

一、引言 随着电商行业的蓬勃发展&#xff0c;大型促销活动如“双11”、“黑色星期五”等已经成为消费者期待的年度盛事。然而&#xff0c;这些活动也带来了前所未有的技术挑战——高并发访问和潜在的安全威胁&#xff0c;如DDoS攻击和抢购脚本。本文将探讨如何构建一个既能承…

SpringBoot | 大新闻项目源码打包

对于一个完成好的后端项目&#xff0c;如何进行打包发送给其他人&#xff0c;在电脑上进行查看 1.在pom.xml添加&#xff1a; <build><plugins> <!-- 打包插件--><plugin><groupId>org.springframework.boot</groupId><art…

Cube-Studio:开源大模型全链路一站式中台

开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/data-infra/cube-studio 一款真正意义的 LLMOps 框架 LLMOps&#xff08;Large Language Model Operations&#xff09;是一个涵盖了大型语言模型&#xff08;如GPT系列&#xff09;开发、部署、维护和优化的一…

【深度学习】第3章实验——回归模型

根据相关数据集进行回归分析 1. import statsmodels.api as sm # df.loc[:, ...] 表示选择所有行。 # df.columns != mpg 创建一个布尔数组,指示哪些列不等于 mpg。 # df.loc[:, df.columns != mpg] 选择 df 中所有行和列名不等于 mpg 的所有列。 x =df.loc[:,df.columns!=m…

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…