我想在一個帶有嵌入式Linux系統的單獨核心上運行一個低延遲任務(對於音頻,ALSA/JACK
)。刪除調度程序和其他中斷可能是這裏的關鍵。嵌入式Linux在單核上的低延遲處理
到目前爲止,我發現了幾種方法,例如, cpusets
和2009年的離線調度程序(很不幸不支持用戶空間任務)。
有沒有更新/更方便的方法來實現這一目標?
我想在一個帶有嵌入式Linux系統的單獨核心上運行一個低延遲任務(對於音頻,ALSA/JACK
)。刪除調度程序和其他中斷可能是這裏的關鍵。嵌入式Linux在單核上的低延遲處理
到目前爲止,我發現了幾種方法,例如, cpusets
和2009年的離線調度程序(很不幸不支持用戶空間任務)。
有沒有更新/更方便的方法來實現這一目標?
你正在尋找的題目就叫"CPU affinity"。 CPU關聯有兩個主要方面:進程的關聯性和中斷的關聯性。
在我(誠然限於)知識:
中的處理,使用taskset
命令分配給處理器。 (親和性由子進程繼承。)
可以使用/proc/irq/<n>/smp_affinity
來控制Linux上CPU分配的中斷。要驗證分配的有效性,請檢查/proc/interrupts
以查看哪些CPU用於哪些中斷。 See here.
你的具體情況,要保留一個CPU(又名核)爲您的關鍵應用,例如CPU0。這意味着所有的進程和中斷應該被分配給除CPU0之外的所有進程和中斷,使用清除了比特0(== CPU0)的親和掩碼,例如, 0xfffffffe。而您的關鍵應用程序將具有0x1的親和性掩碼,這意味着它只能在CPU0上運行。
此外,您可能需要在應用程序中使用sched_setscheduler
系統調用來將調度設置爲其中一個實時策略。這可能會改善您的應用程序的延遲(但也可能會變得更糟)。
請注意,調整CPU親和力不是一項簡單的努力,而且明確的解決方案很少見。您需要測試和試驗以確保配置能夠維持您所需的性能。例如,您的應用程序很可能會與其他進程進行通信。如果通信是同步的,而其他進程響應緩慢(因爲它們的CPU資源有限),這反過來會對關鍵應用程序的性能產生負面影響。這同樣適用於聲卡的中斷。
希望有所幫助。
我不知道你可以很容易地處理中斷,太好了!是否仍然有可能異步使用函數鉤來實現其他內核上的音頻過濾器? – RootRaven
親和性由OS調度程序實現,因此它需要一些OS對象,通常是一個進程。 Linux顯然也允許以編程方式改變線程的親和力 - 請參閱「man pthread_setaffinity_np」(儘管軟件開發人員通過交易,我必須在系統管理員能力中處理親和力)。 – Dummy00001
看看'renice'&'ionice'命令 –