CPU上下文切換

来源:https://www.cnblogs.com/killianxu/archive/2018/12/02/10052927.html
-Advertisement-
Play Games

CPU上下文頻繁切換會導致系統性能下降,切換分為進程切換、線程切換及中斷切換,進程切換的開銷較大,除了需要保存寄存器和程式計數器中的值還需保存全局變數、棧等到記憶體中,以便下次運行恢復,而同一進程中的線程切換開銷會小很多,只需更新寄存器和線程獨有的棧,共用資源如打開的文件、全局變數等無需切換,當硬體中... ...


  CPU上下文切換包括進程上下文切換、線程上下文切換及中斷上下文切換,當任務進行io或發生時間片事件及發生中斷(如硬體讀取完成)時,就會進入內核態,發生CPU上下文切換。

  1. 進程上下文切換,進程的上下文信息包括, 指向可執行文件的指針, 棧, 記憶體(數據段和堆), 進程狀態, 優先順序, 程式I/O的狀態, 授予許可權, 調度信息, 審計信息, 有關資源的信息(文件描述符和讀/寫指針), 關事件和信號的信息, 寄存器組(棧指針, 指令計數器)等等,當發生進程切換時,這些保存在寄存器或高速緩存的信息需要記錄到記憶體,以便下次恢復進程的運行。
  2. 線程上下文切換,同一個進程的線程切換,只需保存線程獨有的信息,比如棧和寄存器,而共用的虛擬記憶體和全局變數則無需切換,因此切換開銷比進程小。
  3. 中斷上下文切換,中斷會打斷一個正常執行的進程而運行中斷處理程式,因為中斷處理程式是內核態進程,而不涉及到用戶態進程之間的切換,當被中斷的是用戶態進程時,不需保存和恢復這個進程的虛擬記憶體和全局變數,中斷上下文只包括中斷服務程式所需要的狀態,比如CPU寄存器、內核堆棧、硬體中斷等參數。

  過多的上下文切換會導致將大量CPU時間浪費在寄存器、內核棧以及虛擬記憶體的保存和恢覆上,導致系統整體性能下降。可以用vmstat查看系統的整體上下文切換情況,如下圖1,空閑系統的上下文切換次數cs(context switch)為100多,中斷次數in(interrupt)為100多,在運行態r(running or runable)的進程數為2,在阻塞態的進程數b為0。

圖1 空閑系統上下文切換和中斷情況

  案例:我們用sysbench來模擬多線程頻繁上下文切換的場景,並用vmstat、pidstat和/proc/interrupts來分析定位具體的線程。

  用sysbench模擬10個線程,運行300s來觀察線程切換的頻繁場景,如下圖2所示。

圖2 大量線程切換場景模擬

 

   用vmstat查看系統整體的上下文切換和中斷情況,如下圖3,可看到cs和in的數目和空閑的時候比增加了很多。

 圖3 系統整體上下文切換情況

  發現系統切換情況比較頻繁,可以用pidstat查看具體切換比較頻繁的線程,命令:pidstat -w -t 1,含義如下,

-w Report task switching activity (kernels 2.6.23 and later only). The following values may be displayed:

cswch/s
Total number of voluntary context switches the task made per second. A voluntary context switch occurs when a task blocks because it requires a resource that is unavailable.

每秒自願上下文切換次數,如等待io等。

nvcswch/s
Total number of non voluntary context switches the task made per second. A involuntary context switch takes place when a task executes for the duration of its time slice and then is
forced to relinquish the processor.

每秒非自願上下文切換次數,如時間片用完切換。

 -t展示具體的線程情況。

結果如下圖4所示,可以看到,切換頻繁的線程是sysbench

圖4 線程切換情況


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 總體原則:命名一定要體現其在程式中的作用; Camel命名法:第一個單詞的首字母小寫,其餘每個單詞的首字母大寫;多用給變數或者欄位命名;給欄位命名必須以下劃線開始; Pascal命名法:每個單詞的首字母都大寫,其餘字母小寫;適用於方法名、類名、屬性名等; ...
  • 一. 起始 去年.NetCore2.0的發佈,公司決定新項目採用.NetCore開發,當作試驗。但是問題在於當前公司內部使用的RPC服務為Thrift v0.9 + zookeeper版本,經過個性化定製,支持了非同步,但也因為如此,這麼多年來一直沒有去升級,導致遷移工作很複雜(歷史遺留項目太多,有各 ...
  • 前言 曾有做過一個產品,有一個功能是視頻監控模塊,視頻監控首先想到的是視頻多畫面切換功能,由於前端是用WPF開發的,所以當時就做了一個多畫面切換組件,效果如下: 功能設計前提: 由於要使用海康大華天地偉業等視頻廠家的視頻,對接的方式是通過各個廠家提供的SDK(官網下載),由於播放視頻的時候需要傳遞控 ...
  • .NET 術語 1. AOT 預編譯器。與 JIT 類似,此編譯器還可將 IL 轉換為機器代碼。 與 JIT 編譯相比,AOT 編譯在應用程式執行前進行並且通常在不同電腦上執行。 由於在運行時 AOT 工具鏈不編譯,因此它們不需要最大程度地減少編譯所花費的時間。 這意味著它們可花更多的時間進行優化 ...
  • 1 .gz 1)壓縮 2)解壓縮: 註意:不能壓縮目錄!支持批量壓縮,源文件被替換成.gz結尾的文件。 2 .bz2 1)壓縮 2)解壓縮: 3)強制壓縮: 註意:不能壓縮目錄!支持批量壓縮,源文件被替換成.bz2結尾的文件。 3 .zip 1)壓縮 2)解壓縮 註意:可以壓縮目錄!支持批量壓縮,源 ...
  • VMware 安裝提示缺少MicrosoftRuntime DLL 問題解決辦法 剛剛安裝VMware失敗了試了好多辦法,在這總結一下。 下麵是程式的截圖 這是報錯信息 網上的解決方法: 當出現安裝失敗的提示時,不要將界面關閉,然後在運行視窗輸入 %temp% 然後會進如文件夾, 在文件夾里找到類似 ...
  • 1. 主機規劃 主機名稱 IP地址 操作系統 部署軟體 運行進程 備註 mini01 172.16.1.11【內網】 10.0.0.11 【外網】 CentOS 7.5 Jdk-8、zookeeper-3.4.5、Hadoop2.7.6、hbase-2.0.2、kafka_2.11-2.0.0、sp ...
  • "參考1 https://computing.llnl.gov/tutorials/pthreads/" "參考2 http://man7.org/linux/man pages/man7/pthreads.7.html" join 阻塞調用線程,直至指定pthread_t線程終止 在同一個線程中重 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...