極客時間 - 《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.pswp.cn/web/40090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40090.shtml
英文地址,請注明出處:http://en.pswp.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、代碼…