![](/img/trans.png)
[英]Why does printing a constant change the results of a single core / process application?
[英]Whole one core dedicated to single process
Linux中是否有任何方法可以將一個CPU內核分配給特定的給定進程,並且不應在此內核上調度任何其他進程或中斷處理程序?
我已經閱讀了有關使用Taskset實用程序將 Linux 綁定到CPU的進程與進程之間的進程親和性的信息,但這並不能解決我的問題,因為它只是試圖將給定進程與該核心關聯,但是有可能在該核心上安排其他進程,並且我想避免的。
我們是否應該更改內核代碼以進行調度?
就在這里。 實際上,有兩種單獨的方法可以做到這一點:-)
現在,完成所需目標的最佳方法是執行以下操作:
在引導過程中,從引導加載程序將參數isolcpus = [cpu_number]添加到Linux內核命令行。 這將指示Linux調度程序不要在該CPU上運行任何常規任務,除非使用cpu親和力明確要求。
使用IRQ關聯性將其他CPU設置為處理所有中斷,以便隔離的CPU將不會接收任何中斷。
使用CPU親和力將您的特定任務固定到隔離的CPU。
在沒有樹外和開發中補丁的情況下,這將為您提供Linux可以提供的CPU隔離方面的最佳功能。
您的任務仍然會不時地被Linux代碼中斷,包括其他任務-例如計時器滴答中斷和調度程序代碼,來自其他CPU的IPI以及諸如工作隊列內核線程之類的東西,盡管中斷應該很小。
有關中斷源的(幾乎)完整列表,請訪問https://github.com/gby/linux/wiki查看我的頁面
另一種方法是使用cpusets,它雖然更優雅,更動態,但在此時間點上存在一些弱點(例如,不遷移計時器),這使我推薦了舊的,粗糙但有效的isolcpus參數。
請注意,Linux社區目前正在着手解決所有這些問題,還有更多工作要做,以提供更好的隔離。
將整個CPU內核專用於特定程序
雖然tasket允許將特定程序分配給某些CPU,但這並不意味着將不會在這些CPU上調度其他程序或進程。 如果要防止這種情況並將整個CPU內核專用於特定程序,則可以使用“ isolcpus”內核參數,該參數允許您在引導期間保留CPU內核。
在引導或GRUB配置文件期間,將內核參數“ isolcpus =”添加到引導加載程序。 這樣,除非任務集特別要求,否則Linux調度程序將不會在保留的CPU內核上調度任何常規進程。 例如,要保留CPU內核0和1,請添加“ isolcpus = 0,1”內核參數。 在啟動時,然后使用任務集將保留的CPU內核安全地分配給程序。
來源
即使您遵循gby的答案中的步驟,內核任務也將在隔離的CPU內核上執行。 linux RT_PREEMPT實時項目正在進行改進工作。 因此,如果您不使用RP_PREEMPT的最新實時內核,則可能無法完全隔離CPU內核。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.