linux 獨占 cpu,宋寶華:談一談Linux讓實時 高性能任務獨占CPU的事

本文主要討論在高實時要求、高效能計算、DPDK等領域,Linux如何讓某一個線程排他性獨占CPU;獨占CPU涉及的線程、中斷隔離原理;以及如何在排他性獨占的狀況下,甚至讓系統的timer tick也不打斷獨占任務,從而實現最低的延遲抖動。網絡

閱讀本文大約須要20分鐘。負載均衡

本文目錄:less

工程需求

用戶態隔離

內核態隔離

3.1 中斷

3.2 內核線程

最佳實踐指南

1. 工程需求

在一個SMP或者NUMA系統中,CPU的數量大于1。在工程中,咱們有時候有一種需求,就是讓某個可以獨占CPU,這個CPU什么都不作,就只作指定的任務,從而得到低延遲、高實時的好處。性能

好比在DPDK中,經過設置線程

GRUB_CMDLINE_LINUX_DEFAULT=“isolcpus=0-3,5,7”

隔離CPU0,3,5,7,讓DPDK的任務在運行的時候,其余任務不會和DPDK的任務進行上下文切換,從而保證網絡性能最佳[1]。在Realtime應用場景中,經過isolcpus=2隔離CPU2,而后把實時應用經過taskset綁定到隔離的核:3d

taskset-c 2 pn_dev

從而保證低延遲要求[2]。code

2. 用戶態隔離

這個地方,咱們能夠看出,它們統一都使用了isolcpus這樣一個啟動參數。blog

實踐是檢驗真理的惟一標準,下面咱們來啟動一個8核的ARM64系統,運行Ubuntu,并指定isolcpus=2這個啟動參數:進程

e21fe84dea7745269659c364.html

系統啟動后,咱們運行下面簡單的程序(啟動8個進程運行while死循環):文檔

e21fe84dea7745269659c364.html

咱們是8核的,如今又是運行8個進程,因此理論上來說,負載均衡后,8個進程應該均分地運行在8個核上面,可是咱們來看看實際的htop結果:

e21fe84dea7745269659c364.html

咱們發現3(也就是CPU2)上面的CPU占用率是0.0%。這實證了CPU2已經被隔離,用戶空間的進程不能在它上面跑。

固然,這個時候,咱們能夠經過taskset,強行把其中的一個a.out,綁定到CPU2上面去:

e21fe84dea7745269659c364.html

從上面命令的結果看出,663本來的affinity list只有0,1,3-7是沒有2的,而咱們強行把它設置為了2,以后再看htop,CPU2上面占用100%:

e21fe84dea7745269659c364.html

經過上面的實驗,咱們明顯能夠看出isolcpus=2使得CPU2上沒法再運行用戶空間的進程了(除非手動設置affinity)。

3. 內核態隔離

中斷

可是,能在CPU2上面運行的,不是只有用戶態的任務,還能夠有內核線程、中斷等,那么isolcpus=可否隔離內核線程和中斷呢?

對于中斷,咱們特別容易查看,就是實際去驗證每一個IRQ的smp_affinity就行了:

5f737e79c53f1543faa65eb546dc0fd8.png

從上圖明顯能夠看出,對于4四、47號這種外設的中斷,Linux內核把smp_affinity設置為了FB(11111011),明顯避開了CPU2,因此,實際外設中斷也不會在CPU2發生,除非咱們強行給中斷綁核,好比讓44號中斷綁定到CPU2:

echo 2 >/proc/irq/44/smp_affinity_list

以后,咱們發現44號中斷在CPU2能夠發生:

697973837af8abb8307200f46ca18403.png

可是,系統的timer中斷、IPI,因為是Linux系統的運行基石,實際仍是要在CPU2上面運行的。這里面最可能給任務帶來延遲抖動的,天然是timer tick。

下面咱們重點探討下tick的問題,因為Linux通常狀況下,已經配置IDLE狀態的NO_HZ tickless,因此CPU2上面什么都不跑的時候,實際timer中斷幾乎不發生。

下面,咱們仍是在isolcpus=2的狀況下,運行前面那個8個進程的a.out,默認狀況下沒有任務會占用CPU2。經過前后運行幾回cat /proc/interrupts | head 2,咱們會看到其余core的timer中斷頻繁發生,而CPU2幾乎不變,這顯然是IDLE時候的NO_HZ在發揮省電的做用:

4895c24708fb11717d765a90803d3c7b.png

可是,一旦咱們聽任務到CPU2,哪怕只是放1個,就會發現CPU2上面的timer中斷開始增長:

d86533bf00c4fcd4293f3ab630f3c322.png

這說明一點,哪怕隔離的CPU上面只有一個線程去跑,timer tick就會開始跑,固然,這個timer tick也會頻繁打斷這一個線程,從而形成大量的上下文切換。你確定會以為Linux怎么這么傻,既然只有一我的,那也沒有時間片分片的必要,不須要在2個或者多個任務進行時間片劃分地調度,為啥還要跑tick?其實緣由是咱們的內核默認只是使能了IDLE的NO_HZ:

0707d6566e12d46151b008625820b5ec.png

咱們來從新編譯一個內核,使能NO_HZ_FULL:

cb3d916e4dfa597e0b882df606fd9af0.png

當咱們使能了NO_HZ_FULL后,Linux支持在CPU上僅有1個任務的時候,是能夠NO_HZ的。可是有2個就傻眼了,因此這個“FULL”也不是真地FULL[3]。這固然也能夠理解,由于有2個就涉及到時間片調度的問題。何時應該使能NO_HZ_FULL,內核文檔Documentation/timers/no_hz.rst有明確地“指示”,只有在實時和HPC等的場景,才須要,不然默認的NO_HZ_IDLE是你最好的選擇:

703d98a13207ab01765e04f1e6c5906d.png

咱們從新編譯了內核,選中了NO_HZ_FULL,下面啟動Linux,注意啟動的時候參數添加nohz_full=2,讓CPU2支持NO_HZ_FULL:

c8dd1162b02451012b2c0b8aaaa9a263.png

從新運行CPU2只有一個任務的場景,看看它的timer中斷發生狀況:

ba5e69e3fb1912899159407d95090d14.png

發現CPU2上面的tick穩定在188上面,這樣相信你會更加開心,由于你獨占地更加完全了!

下面,咱們再放一個task進去CPU2,有2個任務的狀況下,CPU2上面的timer tick開始增長:

981d4bcfde06db7e74c0a1ea1a378e19.png

不過,這或許不是個問題,由于咱們說好了“獨占”,1個任務獨占的時候,timer tick不來打擾,應該已是很是理想的狀況了!

內核態線程

內核態的線程其實和用戶態差很少,當它們沒有綁定到隔離的CPU的時候,是不會跑到隔離CPU運行的。下面用筆者在內核里面添加的dma_map_benchmark來作實驗[4],開啟16個內核線程來進行DMA map和unmap(注意咱們只有8個核):

./dma_map_benchmark -s 120 -t 16

咱們看到CPU2上面的CPU占用也是0:

7f7268699619238f1341f1bbecbaaf19.png

內核里面的dma_map_benchmark線程在狂占CPU0-1, 3-7,可是就是不去占CPU2:

bb7859a142bc1bce359728c920f011f2.png

可是,內核線程若是用kthread_bind_mask()相似API把線程綁定到了隔離的CPU,則狀況就不同了,這就相似用taskset把用戶態的任務綁定到CPU同樣。

4. 最佳實踐指南

對于實時性要求高、高性能計算等場景,若是要讓某個任務獨占CPU,最理想的選擇是:

采用isolcpus隔離CPU

將指定任務綁定到隔離CPU

當心意外地把中斷、內核線程綁定到了隔離CPU,排查到這些“意外”分子

使能NO_HZ_FULL,則效果更佳,由于連timer tick中斷也不打擾你了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode347. 前 K 個高頻元素(排序)

給定一個非空的整數數組&#xff0c;返回其中出現頻率前 k 高的元素。 示例 1: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2] 示例 2: 輸入: nums [1], k 1 輸出: [1] 代碼 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer>…

如何在React中從其父組件更改子組件的狀態

by Johny Thomas約翰尼托馬斯(Johny Thomas) 如何在React中從其父組件更改子組件的狀態 (How to change the state of a child component from its parent in React) We will be building a simple React app which shows the real name of a superhero on a button click.我們…

vue-property-decorator 提供 OO 的風格 Vue Component 方便類型聲明

Prop 父子組件之間傳值 Install: npm install --save vue-property-decoratorChild: <template><div>{{fullMessage}}</div> </template><script lang"ts">import Vue from vue import {Component, Prop} from vue-property-decorato…

python學習筆記(1)

變量的命名 變量名只能包含字母、數字、下劃線&#xff0c;不能以數字打頭不要用Python關鍵字、函數名、保留用于特殊用途的單詞作變量名變量名應短且有描述性慎用小寫l和大寫O字符串 就是一系列字符 在Python中&#xff0c;用引號擴起的都是字符串&#xff0c;引號可以是單引號…

使用這些HTTP標頭保護您的Web應用程序

by Alex Nadalin通過亞歷克斯納達林 使用這些HTTP標頭保護您的Web應用程序 (Secure your web application with these HTTP headers) This is part 3 of a series on web security: part 2 was “Web Security: an introduction to HTTP”這是有關Web安全的系列文章的第3部分&…

leetcode547. 朋友圈(并查集)

班上有 N 名學生。其中有些人是朋友&#xff0c;有些則不是。他們的友誼具有是傳遞性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我們可以認為 A 也是 C 的朋友。所謂的朋友圈&#xff0c;是指所有朋友的集合。 給定一個 N * N 的矩陣 M&#xff0c;表…

linux ssh Unused,安裝openssh-portable時遇到的問題及解決辦法

問題1&#xff1a;configure: error: Your OpenSSL headers do not match yourlibrary. Check config.log for details.If you are sure your installation is consistent, you can disable the checkby running “./configure –without-openssl-header-check”.Also see cont…

windows 刪除刪除不掉的文件

DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 windows下刪除刪除不掉的文件&#xff1a; 1、打開記事本&#xff0c;把上面的命令復制進去 2、保存&#xff0c;后綴名改為.bat&#xff0c;ok 3、把想要刪除的文件托放到這個文件的圖標上 轉載于:https://www.cnblogs.com/Mike_Chang/p…

云計算技術的躍進睿云智合專業先進水平

對于未來的云計算數據中心&#xff0c;網絡虛擬化方案需要適應計算和存儲虛擬化的浪潮&#xff0c;快速的實現云計算業務的發放&#xff0c;以及能夠滿足動態的應用程序工作負載的需求;同時需要幫助管理員更簡單的管理物理網絡和虛擬網絡&#xff0c;實現網絡可視化。睿云智合&…

CSS 選擇器權重計算規則

CSS 選擇器&#xff08;Selector&#xff09;的權重&#xff08;Specificity&#xff09;決定了對于同一元素&#xff0c;到底哪一條 CSS 規則會生效。且僅有當多條 CSS 規則都對同一元素聲明了相應樣式時&#xff0c;才會涉及到權重計算的問題。 選擇器的分類 正式計算選擇器權…

本地構建和自動化構建_如何構建最強大,最安全的家庭自動化系統

本地構建和自動化構建by Amir Off由Amir Off 如何構建最強大&#xff0c;最安全的家庭自動化系統 (How to build the most robust and secure home automation system) In this article, I’ll discuss how I built a Smart Home Automation System with Angular and Node.js …

leetcode990. 等式方程的可滿足性(并查集)

給定一個由表示變量之間關系的字符串方程組成的數組&#xff0c;每個字符串方程 equations[i] 的長度為 4&#xff0c;并采用兩種不同的形式之一&#xff1a;“ab” 或 “a!b”。在這里&#xff0c;a 和 b 是小寫字母&#xff08;不一定不同&#xff09;&#xff0c;表示單字母…

random對文件隨機重命名

對文件隨機重命名&#xff0c;這個用途可廣了&#xff0c;大家可以想想 echo off setlocal ENABLEDELAYEDEXPANSION for /r %%a in (*.txt) do ( set c!random! ren %%~dpnsa.txt !c!.txt) pause 本文轉自sucre03 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog…

AC日記——Periodic RMQ Problem codeforces 803G

G - Periodic RMQ Problem 思路&#xff1a; 題目給一段序列&#xff0c;然后序列復制很多次&#xff1b; 維護序列很多次后的性質&#xff1b; 線段樹動態開點&#xff1b; 來&#xff0c;上代碼&#xff1a; #include <cstdio> #include <cstring> #include <…

數據之路 - Python爬蟲 - 數據存儲

一、文件存儲 1.文件打開方式 文件打開方式說明r以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式rb以二進制只讀方式打開一個文件。文件指針將會放在文件的開頭r以讀寫方式打開一個文件。文件指針將會放在文件的開頭rb以二進制讀寫方式打開一個文件。文件指針…

創建react應用程序_如何使用React創建一個三層應用程序

創建react應用程序Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“發現功能JavaScript”被BookAuthority評為最佳新功能編程書籍之一 &#xff01; Splitting a Single Page Application into layers has a …

linux update語句,MySQL 多表 update sql語句總結

MySQL 多表 update 有幾種不同的寫法。假定我們有兩張表&#xff0c;一張表為Product表存放產品信息&#xff0c;其中有產品價格列Price&#xff1b;另外一張表是ProductPrice表&#xff0c;我們要將ProductPrice表中的價格字段Price更新為Price表中價格字段的80%。在Mysql中我…

linux延時與定時操作

1、at ---系統延遲任務發起命令 at time >command ---任務指令 >ctrld ---發起任務 at -l ---列出延時任務Id at -r id ---刪除改id任務 at -m ---讓無輸出的命令產生郵件 at -M ---讓有輸…

windows修改PowerShell(命令提示符)默認中文編碼方式

如果以下方法都沒有作用的話&#xff0c;可以直接在代碼中調用<stdlib.h>中的system("mode con cp select65001")或者是system("chcp 65001")。當然&#xff0c;前提是你用的也是C、C、C#等強類型編程語言。 **************************************…

leetcode面試題 17.07. 嬰兒名字(并查集)

每年&#xff0c;政府都會公布一萬個最常見的嬰兒名字和它們出現的頻率&#xff0c;也就是同名嬰兒的數量。有些名字有多種拼法&#xff0c;例如&#xff0c;John 和 Jon 本質上是相同的名字&#xff0c;但被當成了兩個名字公布出來。給定兩個列表&#xff0c;一個是名字及對應…