衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

談一談Linux讓實時任務獨占CPU的事

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-02-20 17:11 ? 次閱讀

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

本文目錄:

1. 工程需求

2. 用戶態隔離

3. 內核態隔離

3.1 中斷

3.2 內核線程

4. 最佳實踐指南

Part 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綁定到隔離的核:

taskset-c 2 pn_dev

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

Part 2

用戶態隔離

這個地方,我們可以看出,它們統一都使用了isolcpus這樣一個啟動參數。

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

3724778a-71ad-11eb-8b86-12bb97331649.png

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

375f64ee-71ad-11eb-8b86-12bb97331649.png

我們是8核的,現在又是運行8個進程,所以理論上來講,負載均衡后,8個進程應該均分地運行在8個核上面,但是我們來看看實際的htop結果:

37807ec2-71ad-11eb-8b86-12bb97331649.png

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

當然,這個時候,我們可以通過taskset,強行把其中的一個a.out,綁定到CPU2上面去:

37cd7dd0-71ad-11eb-8b86-12bb97331649.png

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

380fa0f2-71ad-11eb-8b86-12bb97331649.png

通過上面的實驗,我們明顯可以看出isolcpus=2使得CPU2上無法再運行用戶空間的進程了(除非手動設置affinity)。

Part 3

內核態隔離

中斷

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

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

3841b6c8-71ad-11eb-8b86-12bb97331649.png

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

echo 2 》/proc/irq/44/smp_affinity_list

之后,我們發現44號中斷在CPU2可以發生:

386bdfca-71ad-11eb-8b86-12bb97331649.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在發揮省電的作用:

388fdf92-71ad-11eb-8b86-12bb97331649.png

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

38b28a6a-71ad-11eb-8b86-12bb97331649.png

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

390e92c4-71ad-11eb-8b86-12bb97331649.png

我們來重新編譯一個內核,使能NO_HZ_FULL:

39338926-71ad-11eb-8b86-12bb97331649.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是你最好的選擇:

3959e594-71ad-11eb-8b86-12bb97331649.png

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

3a7d168a-71ad-11eb-8b86-12bb97331649.png

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

3abb29a2-71ad-11eb-8b86-12bb97331649.png

發現CPU2上面的tick穩定在188上面,這樣相信你會更加開心,因為你獨占地更加徹底了!

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

3aed457c-71ad-11eb-8b86-12bb97331649.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:

3b193696-71ad-11eb-8b86-12bb97331649.png

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

3b3b2788-71ad-11eb-8b86-12bb97331649.png

但是,內核線程如果用kthread_bind_mask()類似API把線程綁定到了隔離的CPU,則情況就不一樣了,這就類似用taskset把用戶態的任務綁定到CPU一樣。

Part 4

最佳實踐指南

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

1. 采用isolcpus隔離CPU

2. 將指定任務綁定到隔離CPU

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

4. 使能NO_HZ_FULL,則效果更佳,因為連timer tick中斷也不打擾你了。

原文標題:宋寶華:談一談Linux讓實時/高性能任務獨占CPU的事

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10905

    瀏覽量

    213031
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210406

原文標題:宋寶華:談一談Linux讓實時/高性能任務獨占CPU的事

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    微秒級實時在無人機控制中的重要性

    控制系統尤為關鍵。本文將深入探討這特性及其如何支持無人機控制。 在實時系統中,任務通常分為兩類:硬實時任務和軟實時任務。硬
    的頭像 發表于 01-17 14:46 ?78次閱讀

    望獲實時Linux系統與Betaflight的結合:計算與飛控的完美協作

    Linux系統實現高級計算任務,同時通過Betaflight實現無人機的飛控功能。 、望獲實時Linux與Betaflight的角色分工
    的頭像 發表于 01-10 16:17 ?131次閱讀

    LinuxCPU調度策略和CPU親和性

    、調度策略 調度進程 單個 CPU次只能執行個進程,雖然 Linux 系統通過使用多任務
    的頭像 發表于 12-05 16:38 ?595次閱讀
    <b class='flag-5'>Linux</b>之<b class='flag-5'>CPU</b>調度策略和<b class='flag-5'>CPU</b>親和性

    Linux計劃任務介紹

    1.計劃任務(定時任務)基本概述 1.什么是crond crond就是計劃任務,類似于我們平時生活中的鬧鐘。定點執行。 2.為什么要使用crond?crond主要是做些周期性的
    的頭像 發表于 11-24 15:49 ?353次閱讀

    定時器技術:Air780E如何革新定時任務管理?

    今天講的是關于Air780E如何革新定時任務管理的內容,希望大家有所收獲。
    的頭像 發表于 11-07 13:50 ?313次閱讀
    定時器技術:Air780E如何革新定<b class='flag-5'>時任務</b>管理?

    混合部署 | 在迅為RK3568上同時部署RT-Thread和Linux系統

    RT-Thread介紹 RT-Thread 是個高安全性、實時性的操作系統,廣泛應用于任務關鍵領域,例如電力、軌道交通、車載系統、工業控制和新能源等。它的加入 RK3568 能夠在
    發表于 11-01 10:31

    混合部署 | 在迅為RK3568上同時部署RT-Thread和Linux系統

    RT-Thread介紹 RT-Thread 是個高安全性、實時性的操作系統,廣泛應用于任務關鍵領域,例如電力、軌道交通、車載系統、工業控制和新能源等。它的加入 RK3568 能夠在
    發表于 09-18 10:54

    freertos最多支持多少個任務

    FreeRTOS是個輕量級的實時操作系統(RTOS),其設計初衷就是為了提供簡單、可靠且高效的實時任務管理。關于FreeRTOS最多支持多少個任務的問題,實際上并沒有
    的頭像 發表于 09-02 14:21 ?1184次閱讀

    linux時任務的用法總結

    習慣了使用 windows 的計劃任務,使用 linux 中的 crontab 管理定時任務時很不適應。
    的頭像 發表于 08-14 18:16 ?904次閱讀
    <b class='flag-5'>linux</b>定<b class='flag-5'>時任務</b>的用法總結

    實時Linux:解鎖高效能和可靠性的關鍵

    實時Linux結合容器技術,提供了高度靈活和可擴展的解決方案,特別適合于需要快速響應和高可靠性的應用場景。實時Linux能夠保證關鍵任務及時
    的頭像 發表于 08-08 11:21 ?343次閱讀
    <b class='flag-5'>實時</b><b class='flag-5'>Linux</b>:解鎖高效能和可靠性的關鍵

    談一談FPGA設計中的功率計算

    散熱問題,如對系統增加散熱片或氣流,從而有效地降低運行溫度。那么,在系統建立之前,設計師怎樣才能夠準確地估計功耗和設備的熱耗?這相當于在談論個先有雞還是先有蛋的問題!幸運的是,有個專為這項任務而設計的功耗
    發表于 07-31 22:37

    ESP8266如何實現時間小于3us的定時任務?

    想實現個穩定的軟串口,現有的軟串口程序是通過中斷實現的,但中斷好像會被其他中斷打斷,導致數據丟失,定時器按文檔上的說法,只能大于50us,能不能實現時間小于3us的定時任務或者提高GPIO中斷的優先級呢?或者還有其他什么辦法?
    發表于 07-19 06:13

    使用 PREEMPT_RT 在 Ubuntu 中構建實時 Linux 內核

    實時內核補丁來完成。簡介我們曾介紹過在Ubuntu22.04中啟用實時Linux內核有多簡單,因為Canonical已將該內核列為個選項。但要為默認
    的頭像 發表于 04-12 08:36 ?2761次閱讀
    使用 PREEMPT_RT 在 Ubuntu 中構建<b class='flag-5'>實時</b> <b class='flag-5'>Linux</b> 內核

    DMA在嵌入式實時任務處理中的應用

    DMA:Direct Memory Access,直接內存存取/訪問。簡單來說就是內存RAM直接和其他設備(外設)進行數據交互,而不需要CPU參與的種控制器。
    發表于 04-05 10:05 ?781次閱讀

    HarmonyOS CPU與I/O密集型任務開發指導

    CPU密集型任務開發指導 CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長
    的頭像 發表于 02-18 10:17 ?1003次閱讀
    HarmonyOS <b class='flag-5'>CPU</b>與I/O密集型<b class='flag-5'>任務</b>開發指導
    利高在线娱乐城| 永利高百家乐官网会员| 百家乐官网庄家怎样赚钱| 至尊百家乐20130201| 世博娱乐城| 送58百家乐官网的玩法技巧和规则 | 百家乐官网平台导航| 百家乐官网赌博论坛| 伯爵百家乐娱乐| 大发888娱乐场东南网| 百家乐官网桌小| 联合百家乐的玩法技巧和规则| 百家乐官网试玩账户| 百家乐投注心态| 岑溪市| 历史百家乐官网路单图| 网上百家乐返水| 百家乐官网开户送百元| 百家乐娱乐城博彩正网| 德州扑克教程| 赌博百家乐官网技术| 网上百家乐优博| 全讯网999| 百家乐官网透明发牌靴| 大发888游戏场下载| 百家乐官网的胜算法| 百家乐龙虎的投注法| 高安市| 免费百家乐官网计划软件| 百家乐专打单跳投注法| 盐山县| 百家乐最新破| 百家乐官网家居 | 百家乐讯特| 百家乐官网输了好多钱| 百家乐冼牌机| 百家乐官网新台第二局| 赌场百家乐打法| 最好的百家乐官网游戏平台1| 二八杠单机游戏| 百家乐官网bp|