簡體   English   中英

整個一核致力於單一流程

[英]Whole one core dedicated to single process

Linux中是否有任何方法可以將一個CPU內核分配給特定的給定進程,並且不應在此內核上調度任何其他進程或中斷處理程序?

我已經閱讀了有關使用Taskset實用程序將 Linux 綁定到CPU的進程與進程之間的進程親和性的信息,但這並不能解決我的問題,因為它只是試圖將給定進程與該核心關聯,但是有可能在該核心上安排其他進程,並且我想避免的。

我們是否應該更改內核代碼以進行調度?

就在這里。 實際上,有兩種單獨的方法可以做到這一點:-)

現在,完成所需目標的最佳方法是執行以下操作:

  1. 在引導過程中,從引導加載程序將參數isolcpus = [cpu_number]添加到Linux內核命令行。 這將指示Linux調度程序不要在該CPU上運行任何常規任務,除非使用cpu親和力明確要求。

  2. 使用IRQ關聯性將其他CPU設置為處理所有中斷,以便隔離的CPU將不會接收任何中斷。

  3. 使用CPU親和力將您的特定任務固定到隔離的CPU。

在沒有樹外和開發中補丁的情況下,這將為您提供Linux可以提供的CPU隔離方面的最佳功能。

您的任務仍然會不時地被Linux代碼中斷,包括其他任務-例如計時器滴答中斷和調度程序代碼,來自其他CPU的IPI以及諸如工作隊列內核線程之類的東西,盡管中斷應該很小。

有關中斷源的(幾乎)完整列表,請訪問https://github.com/gby/linux/wiki查看我的頁面

另一種方法是使用cpusets,它雖然更優雅,更動態,但在此時間點上存在一些弱點(例如,不遷移計時器),這使我推薦了舊的,粗糙但有效的isolcpus參數。

請注意,Linux社區目前正在着手解決所有這些問題,還有更多工作要做,以提供更好的隔離。

Redhat文章在談論它。 它修改了引導參數isolcpus

還有羅伯特·洛夫(Robert Love)寫的一篇舊文章 那篇文章有解決方案。

進程的所有子級都與父級擁有相同的CPU親和力掩碼。

然后,我們需要做的就是將init自身綁定到一個處理器。 然后,所有其他進程(本質上是init是進程樹的根,因此是所有進程的父級)也都綁定到一個處理器。

將整個CPU內核專用於特定程序

雖然tasket允許將特定程序分配給某些CPU,但這並不意味着將不會在這些CPU上調度其他程序或進程。 如果要防止這種情況並將整個CPU內核專用於特定程序,則可以使用“ isolcpus”內核參數,該參數允許您在引導期間保留CPU內核。

在引導或GRUB配置文件期間,將內核參數“ isolcpus =”添加到引導加載程序。 這樣,除非任務集特別要求,否則Linux調度程序將不會在保留的CPU內核上調度任何常規進程。 例如,要保留CPU內核0和1,請添加“ isolcpus = 0,1”內核參數。 在啟動時,然后使用任務集將保留的CPU內核安全地分配給程序。

來源

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

即使您遵循gby的答案中的步驟,內核任務也將在隔離的CPU內核上執行。 linux RT_PREEMPT實時項目正在進行改進工作。 因此,如果您不使用RP_PREEMPT的最新實時內核,則可能無法完全隔離CPU內核。

根據文檔

Linux調度程序將遵守給定的CPU關聯性,並且該進程將不會在任何其他CPU上運行。

沒有提及特定處理器將被專門處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM