chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

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

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-02-20 17:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

本文目錄:

1. 工程需求

2. 用戶態(tài)隔離

3. 內核態(tài)隔離

3.1 中斷

3.2 內核線程

4. 最佳實踐指南

Part 1

工程需求

在一個SMP或者NUMA系統(tǒng)中,CPU的數(shù)量大于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

用戶態(tài)隔離

這個地方,我們可以看出,它們統(tǒng)一都使用了isolcpus這樣一個啟動參數(shù)。

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

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

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

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

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

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

我們發(fā)現(xiàn)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

內核態(tài)隔離

中斷

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

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

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

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

echo 2 》/proc/irq/44/smp_affinity_list

之后,我們發(fā)現(xiàn)44號中斷在CPU2可以發(fā)生:

386bdfca-71ad-11eb-8b86-12bb97331649.png

但是,系統(tǒng)的timer中斷、IPI,由于是Linux系統(tǒng)的運行基石,實際還是要在CPU2上面運行的。這里面最可能給任務帶來延遲抖動的,自然是timer tick。

下面我們重點探討下tick的問題,由于Linux一般情況下,已經配置IDLE狀態(tài)的NO_HZ tickless,所以CPU2上面什么都不跑的時候,實際timer中斷幾乎不發(fā)生。

下面,我們還是在isolcpus=2的情況下,運行前面那個8個進程的a.out,默認情況下沒有任務會占用CPU2。通過先后運行幾次cat /proc/interrupts | head 2,我們會看到其他core的timer中斷頻繁發(fā)生,而CPU2幾乎不變,這顯然是IDLE時候的NO_HZ在發(fā)揮省電的作用:

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

但是,一旦我們放任務到CPU2,哪怕只是放1個,就會發(fā)現(xiàn)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,注意啟動的時候參數(shù)添加nohz_full=2,讓CPU2支持NO_HZ_FULL:

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

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

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

發(fā)現(xiàn)CPU2上面的tick穩(wěn)定在188上面,這樣相信你會更加開心,因為你獨占地更加徹底了!

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

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

不過,這或許不是個問題,因為我們說好了“獨占”,1個任務獨占的時候,timer tick不來打擾,應該已經是非常理想的情況了!

內核態(tài)線程

內核態(tài)的線程其實和用戶態(tài)差不多,當它們沒有綁定到隔離的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把用戶態(tài)的任務綁定到CPU一樣。

Part 4

最佳實踐指南

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

1. 采用isolcpus隔離CPU

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

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

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

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

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

責任編輯:haq

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

    關注

    68

    文章

    11256

    瀏覽量

    224132
  • Linux
    +關注

    關注

    88

    文章

    11701

    瀏覽量

    218681

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    直播預告 | 睿擎平臺AMP混合部署實戰(zhàn):如何Linux和RT-Thread高效協(xié)同工作

    在工業(yè)控制器、機器人或高端設備開發(fā)中,你是否正被這樣的問題困擾:實時任務(如電機控制、數(shù)據采集)需要RT-Thread的微秒級響應,但上層應用(如UI、AI算法、網絡服務)又離不開Linux的豐富
    的頭像 發(fā)表于 01-23 11:06 ?330次閱讀
    直播預告 | 睿擎平臺AMP混合部署實戰(zhàn):如何<b class='flag-5'>讓</b><b class='flag-5'>Linux</b>和RT-Thread高效協(xié)同工作

    米爾RK3506核心板SDK重磅升級,解鎖三核A7實時控制新架構

    出來,獨立運行實時操作系統(tǒng)RT-Thread。此架構實現(xiàn)了完美的任務隔離:兩顆A7核運行通用Linux,處理網絡、存儲等復雜業(yè)務;被隔離的A7核則專司硬實時任務,確保微秒級響應。這為傳
    發(fā)表于 12-19 20:35

    Linux-RT特點及簡單應用

    以及使用適當?shù)腁PI來創(chuàng)建和管理任務。以下是在Linux-RT上創(chuàng)建和管理實時任務般步驟: 選擇合適的調度策略:Linux-RT內核支持
    發(fā)表于 12-05 07:37

    技術分享 | RK3588增加Xenomai3實時補丁

    Xenomai是套為嵌入式系統(tǒng)設計的實時開發(fā)框架,通過“雙內核”架構,Linux既能處理復雜的通用任務,又能可靠地完成那些對響應時間有極
    的頭像 發(fā)表于 11-27 17:29 ?1505次閱讀
    技術分享 | RK3588增加Xenomai3<b class='flag-5'>實時</b>補丁

    【飛凌OK-T153 開發(fā)板試用】實時性測試

    中斷發(fā)生到進入中斷處理程序ISR的延時 調度延時(scheduling latency),即當任務被喚醒到任務真正獲得CPU使用權中間的延時 cyclictest創(chuàng)建的任務均是
    發(fā)表于 11-22 05:29

    嵌入式實時操作系統(tǒng)的特點

    任務的系統(tǒng)。 實時嵌入式操作系統(tǒng)與傳統(tǒng)的桌面操作系統(tǒng)相比,更注重對實時任務的響應和精確控制。它們在資源利用、可靠性、可預測性、任務調度和中斷處理等方面提供了更加嚴格的要求和機制。
    發(fā)表于 11-13 06:30

    從微秒級響應到確定性延遲:深入解析米爾全志T536核心板的實時性技術突破

    ,通過CPU隔離技術將特定核心專用于實時任務,減少系統(tǒng)干擾。 優(yōu)勢:無需修改內核,配置相對簡單。 挑戰(zhàn):隔離不徹底,Linux內核活動仍可能影響實時任務,最壞情況延遲改善有限。 2.3
    發(fā)表于 10-22 17:25

    深入解析米爾全志T536核心板的實時性技術突破

    CPU隔離技術將特定核心專用于實時任務,減少系統(tǒng)干擾。優(yōu)勢:無需修改內核,配置相對簡單。挑戰(zhàn):隔離不徹底,Linux內核活動仍可能影響實時任務,最壞情況延遲改善有限。2.3 RT-PR
    發(fā)表于 10-17 17:41

    請問rt_kprintf會影響RT-Threat系統(tǒng)的實時性嗎?

    有人說頻繁調用rt_kprintf可能阻塞實時任務,影響系統(tǒng)響應,是這樣嗎?
    發(fā)表于 09-23 07:06

    Crontab定時任務完全指南

    在凌晨3點,當大多數(shù)人還在熟睡時,位運維工程師的手機突然響起——線上數(shù)據庫備份失敗了。他匆忙起床,打開電腦,手動執(zhí)行備份腳本,整個過程耗時2小時。這樣的場景,在我剛入行時經常遇到。直到我真正掌握了crontab定時任務,才徹底擺脫了"人肉運維"的窘境。
    的頭像 發(fā)表于 09-05 10:03 ?777次閱讀

    文讀懂:嵌入式Linux實時性進階

    能夠在限定的時間內對外部時間做出相應的特性。 Linux可以通過任務調度與相應時間,中斷延遲與搶占延遲,內核可搶占性與實時補丁,實時調度策略,硬件支持來提高其
    發(fā)表于 07-10 15:26

    linux服務器挖礦病毒處理方案

    情況說明:挖礦進程被隱藏(CPU占用50%,htop/top卻看不到異常進程),結束挖礦進程后馬上又會運行起來(crontab -l查看發(fā)現(xiàn)沒有定時任務)。
    的頭像 發(fā)表于 04-09 10:33 ?1106次閱讀
    <b class='flag-5'>linux</b>服務器挖礦病毒處理方案

    【第四章 定時任務】手把手教你玩轉新版正點原子云

    【第四章 定時任務】手把手教你玩轉新版正點原子云 承接上篇,除了報警聯(lián)動這個功能,原子云還有個特色功能也是各開發(fā)者喜歡用的,定時任務功能。 【正點原子】云平臺:原子云(點擊登錄原子云) 前言
    發(fā)表于 03-13 10:19

    鴻道Intewell操作系統(tǒng)為半導體行業(yè)打造高可靠實時控制系統(tǒng)

    。在半導體制造中,Windows/Linux系統(tǒng)可用于運行人機界面(HMI)、數(shù)據處理和可視化等非實時任務,而鴻道Intewell實時系統(tǒng)則專注于設備的精確控制、運動控制和實時數(shù)據采集
    的頭像 發(fā)表于 02-08 16:13 ?897次閱讀
    鴻道Intewell操作系統(tǒng)為半導體行業(yè)打造高可靠<b class='flag-5'>實時</b>控制系統(tǒng)

    Linux計劃任務cron詳解

    cron是linux下用來周期性的執(zhí)行某種任務或等待處理某些事件的個守護進程,與windows下的計劃任務類似,當安裝完成操作系統(tǒng)后,默認會安裝此服務 工具,并且會自動啟動crond
    的頭像 發(fā)表于 02-07 15:31 ?1690次閱讀
    <b class='flag-5'>Linux</b>計劃<b class='flag-5'>任務</b>cron詳解