如何使用任務集將程序分配給CPU內核

隨著多核處理器在服務器,筆記本電腦或台式PC甚至移動設備中變得越來越普遍,針對這種類型的系統優化了越來越多的應用程序。 但是,有時將程序或過程鏈接到一個或多個特定內核可能會很有用。 讓我們看看如何獲得它...

安裝任務集

Taskset工具是“ util-linux”軟件包的一部分。 大多數Linux發行版都默認預先安裝了軟件包。 如果任務集不可用,可以按以下方式安裝它:

En 於Debian / Ubuntu 及衍生產品:

sudo apt-get安裝util-linux

En Fedora 及衍生產品:

sudo yum安裝util-linux

查看正在運行的進程的CPU關聯性

要檢索進程的CPU相關性信息,請使用以下格式:

任務集-p PID

例如,要檢查具有PID 2915的進程的CPU的親和性:

任務集-p 2915

返回結果:

pid 2915當前的親和力掩碼:ff

Taskset以十六進制位掩碼格式返回當前的CPU關聯性。 在示例中,親和力(以十六進制位掩碼表示)對應於二進制格式的“ 11111111”,這意味著該進程可以在八個不同CPU內核(0至7)中的任何一個上運行。

十六進制位掩碼中的最低位對應於核心ID 0,從右邊到核心ID 1的第二最低位,對應於核心ID 2的第三最低位,等等。 因此,例如,CPU關聯性“ 0x11”表示核心ID 0和4。

tasket可以將CPU關聯性顯示為處理器列表而不是位掩碼,這很容易閱讀。 要使用這種格式,必須使用“ -c”選項運行任務集。 例如:

任務集-cp 2915

返回結果:

pid 2915的當前相似性列表:0-7

強制進程在特定內核上運行

使用任務集,可以將正在運行的進程分配給特定的CPU內核。 為此,您必須使用以下格式:

任務集-p COREMASK PID任務集-cp核心列表PID

例如,要將進程分配給核心0和4,您可以運行:

任務集-p 0x11 9030

結果返回什麼:

pid 9030的當前親和力掩碼:ff pid 9030的新親和力掩碼:11

同樣,您可以運行:

任務集-cp 0,4 9030

使用“ -c”選項,您可以指定一個數字內核ID列表,以逗號分隔,甚至可以包括範圍(例如0,2,5,6、10、XNUMX、XNUMX-XNUMX)。

使用特定的內核啟動程序

tasket還允許使用許多特定的內核啟動新程序。 為此,必須以以下格式使用它:

可執行COREMASK任務集

例如,要在CPU內核ID 0上啟動VLC程序,請使用以下命令:

任務集-c 0 vlc

僅將內核專用於特定程序

儘管tasket允許將程序分配給特定的內核,但這並不意味著沒有其他程序或進程可以使用它。 為避免這種情況並將整個內核專用於特定程序,必須使用內核參數“ isolcpus”,該參數允許您在啟動過程中保留內核。

為此,必須在GRUB的內核行中添加參數“ isolcpus =”。 例如,要保留ID核心0和1,請添加“ isolcpus = 0,1”。

完成此操作後,Linux調度程序將不會為保留的內核分配任何常規進程,除非專門為任務集分配了進程。

來源: xmodulo & Taskset手冊頁.


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   彼得切科 他說:

    好帖子:)。

  2.   路易斯 他說:

    好的帖子,但無意拖釣...

    將程序分配給特定內核的用途是什麼?

    我的意思是; 如果您有一台具有12核的計算機,那麼邏輯上的事情就是使用這12核來執行某個程序,而不是對其進行限制,因為這樣我們可以獲得最高的性能。

    我看到的是有用的選項,該選項允許我們不將任何進程分配給某個內核,而將其專用於某個程序。

    1.    jvk85321 他說:

      您所說的是有道理的,通過讓計劃者使用所有內核,可以更好地平衡資源,但是有時需要專用的專用內核,例如運行具有特定任務的虛擬機,則當出現以下情況時,該計算機的性能將大大提高在分配的內核中沒有更多的進程正在運行。

      ,直到
      jvk85321

      1.    讓我們使用linux 他說:

        精確! 謝謝,jvk! 🙂

      2.    lf 他說:

        但是,當您創建虛擬機時,它會要求您選擇分配的CPU數量...如果最終操作系統忽略了該值並在所有CPU上執行它,那麼選擇此值有什麼用...這個例子不是最好的...

        為了使Flash在Windows 8.1 x64,AMD和Firefox上運行,建議選擇Flash僅在CPU上運行,但是不適用於我。 如果將其添加到其他DE(至少是KDE)的任務管理器中(如果尚未添加),也將很方便。

      3.    lf 他說:

        嗯,我還不明白評論的結尾……但是,為此,必須禁止運行虛擬機的CPU上的所有進程。 或將它們分配給其他CPU。 有趣,很好的評論。

    2.    費爾南多 他說:

      用於創建天才超級計算機

  3.   路易斯 他說:

    據了解。

    感謝您的澄清。

  4.   泰克 他說:

    當為一個特定的程序保留一個內核時,執行線程會發生什麼?如果您使用帶有HT的內核來執行,它將為該程序保留2個執行線程。

  5.   夾心 他說:

    在具有多個內核的計算機上,該命令似乎不太有用,但是對於我們中具有雙核的計算機來說,這是相當實用的。 例如,我有一個遊戲,當我打開它使用所有處理器核心時,如果我還有其他需要CPU的程序(例如使用grep搜索大文件),則係統速度會降低。 該解決方案非常簡單,只需將游戲限制為僅使用其中一個內核即可。
    我也同意,如果他們真的應該將其集成到任務管理器中(我到目前為止在Gentoo上嘗試過的,我認為沒有),尤其是在Windows上,這是XP以來存在的東西(右鍵單擊進程> “設置親和力...”),但不久前,我發現以下腳本將任務集變成了更直觀的內容(最初發布 這裡 甚至在某些情況下,有必要管理內核的使用):
    #!/bin/bash
    read -p 'Ingrese el ID del proceso en cuestión: ' ID
    read -p 'Ingrese la lista de procesadores separados por comas: ' P
    echo 'Su ID es '$ID' y los procesadores son '$P
    sudo taskset -p -c $P $ID
    read -p 'Listo, presione enter para finalizar' P

    進行一些修改後,可以顯示過程的名稱,而不是PID(或者它既接受PID,又決定該參數是另一事物的時間)。

  6.   喬斯 他說:

    沒有針對新用戶的任務集的圖形界面,那就太好了