資源控制功能的使用者介面 (resctrl)

版權所有:

© 2016 英特爾公司

作者:

英特爾將此功能稱為英特爾資源導向技術(Intel(R) RDT)。 AMD 將此功能稱為 AMD 平臺服務質量(AMD QoS)。

此功能透過 CONFIG_X86_CPU_RESCTRL 和 x86 /proc/cpuinfo 標誌位啟用

RDT(資源導向技術)分配

“rdt_a”

CAT(快取分配技術)

“cat_l3”、“cat_l2”

CDP(程式碼和資料優先順序)

“cdp_l3”、“cdp_l2”

CQM(快取 QoS 監控)

“cqm_llc”、“cqm_occup_llc”

MBM(記憶體頻寬監控)

“cqm_mbm_total”、“cqm_mbm_local”

MBA(記憶體頻寬分配)

“mba”

SMBA(慢速記憶體頻寬分配)

“”

BMEC(頻寬監控事件配置)

“”

從歷史上看,新功能預設在 /proc/cpuinfo 中可見。 這導致功能標誌變得難以讓人類解析。 如果使用者空間可以從 resctrl 的 info 目錄獲取有關該功能的資訊,則應避免向 /proc/cpuinfo 新增新標誌。

要使用此功能,請掛載檔案系統

# mount -t resctrl resctrl [-o cdp[,cdpl2][,mba_MBps][,debug]] /sys/fs/resctrl

掛載選項有

“cdp”

在 L3 快取分配中啟用程式碼/資料優先順序。

“cdpl2”

在 L2 快取分配中啟用程式碼/資料優先順序。

“mba_MBps”

啟用 MBA 軟體控制器 (mba_sc) 以 MiBps 為單位指定 MBA 頻寬

“debug”

使除錯檔案可訪問。 可用的除錯檔案標有“僅在除錯選項可用時”。

L2 和 L3 CDP 是單獨控制的。

RDT 功能是正交的。 特定系統可能僅支援監控、僅支援控制,或者同時支援監控和控制。 快取偽鎖定是一種使用快取控制來“固定”或“鎖定”快取中的資料的獨特方法。 詳細資訊可以在“快取偽鎖定”中找到。

如果存在分配或監控,則掛載成功,但只會建立系統支援的檔案和目錄。 有關監控和分配期間介面行為的更多詳細資訊,請參閱“資源分配和監控組”部分。

資訊目錄

“info”目錄包含有關已啟用資源的資訊。 每個資源都有自己的子目錄。 子目錄名稱反映了資源名稱。

每個子目錄都包含以下與分配相關的檔案

快取資源(L3/L2)子目錄包含以下與分配相關的檔案

“num_closids”

對此資源有效的 CLOSID 的數量。 核心使用所有已啟用資源中最小的 CLOSID 數量作為限制。

“cbm_mask”

對此資源有效的位掩碼。 此掩碼等效於 100%。

“min_cbm_bits”

寫入掩碼時必須設定的連續位的最小數量。

“shareable_bits”

與其他執行實體(例如 I/O)共享資源的可共享位掩碼。 使用者可以在設定獨佔快取分割槽時使用此掩碼。 請注意,某些平臺支援具有自己的快取使用設定的裝置,這些設定可能會覆蓋這些位。

“bit_usage”

帶註釋的容量位掩碼,顯示了資源的所有例項如何使用。 圖例是

“0”

相應的區域未使用。 當系統的資源已分配,並且在“bit_usage”中找到“0”時,這表明資源被浪費了。

“H”

相應的區域僅由硬體使用,但可供軟體使用。 如果資源在“shareable_bits”中設定了位,但並非所有這些位都出現在資源組的模式中,則出現在“shareable_bits”中但沒有資源組的位將被標記為“H”。

“X”

相應的區域可用於共享,並由硬體和軟體使用。 這些位出現在“shareable_bits”中以及資源組的分配中。

“S”

相應的區域由軟體使用,並且可用於共享。

“E”

相應的區域由一個資源組獨佔使用。 不允許共享。

“P”

相應的區域是偽鎖定的。 不允許共享。

“sparse_masks”

指示是否支援 CBM 中不連續的 1s 值。

“0”

僅支援 CBM 中連續的 1s 值。

“1”

支援 CBM 中不連續的 1s 值。

記憶體頻寬 (MB) 子目錄包含以下與分配相關的檔案

“min_bandwidth”

使用者可以請求的最小記憶體頻寬百分比。

“bandwidth_gran”

分配記憶體頻寬百分比的粒度。 分配的頻寬百分比四捨五入到硬體上可用的下一個控制步長。 可用的頻寬控制步長為:min_bandwidth + N * bandwidth_gran。

“delay_linear”

指示延遲比例是線性的還是非線性的。 此欄位僅供參考。

“thread_throttle_mode”

在 Intel 系統上,指示在物理核心的執行緒上執行的任務請求不同的記憶體頻寬百分比時,如何限制這些任務

“max”

最小的百分比應用於所有執行緒

“per-thread”

頻寬百分比直接應用於核心上執行的執行緒

如果 RDT 監控可用,則將有一個“L3_MON”目錄,其中包含以下檔案

“num_rmids”

可用的 RMID 的數量。 這是可以建立的“CTRL_MON”+“MON”組數量的上限。

“mon_features”

如果為資源啟用了監控,則列出監控事件。 例子

# cat /sys/fs/resctrl/info/L3_MON/mon_features
llc_occupancy
mbm_total_bytes
mbm_local_bytes

如果系統支援頻寬監控事件配置 (BMEC),則頻寬事件將是可配置的。 輸出將是

# cat /sys/fs/resctrl/info/L3_MON/mon_features
llc_occupancy
mbm_total_bytes
mbm_total_bytes_config
mbm_local_bytes
mbm_local_bytes_config
“mbm_total_bytes_config”、“mbm_local_bytes_config”

讀/寫檔案,分別包含在支援頻寬監控事件配置 (BMEC) 功能時,mbm_total_bytes 和 mbm_local_bytes 事件的配置。 事件配置設定是特定於域的,並且會影響域中的所有 CPU。 當任何一個事件配置更改時,該域的所有事件(mbm_total_bytes 以及 mbm_local_bytes)的所有 RMID 的頻寬計數器都會被清除。 每個 RMID 的下一次讀取將報告“Unavailable”,隨後的讀取將報告有效值。

以下是支援的事件型別

描述

6

從 QOS 域到所有型別記憶體的髒受害者

5

讀取到非本地 NUMA 域中的慢速記憶體

4

讀取到本地 NUMA 域中的慢速記憶體

3

非臨時寫入到非本地 NUMA 域

2

非臨時寫入到本地 NUMA 域

1

讀取到非本地 NUMA 域中的記憶體

0

讀取到本地 NUMA 域中的記憶體

預設情況下,mbm_total_bytes 配置設定為 0x7f 以計數所有事件型別,mbm_local_bytes 配置設定為 0x15 以計數所有本地記憶體事件。

例子

  • 要檢視當前配置:

    # cat /sys/fs/resctrl/info/L3_MON/mbm_total_bytes_config
    0=0x7f;1=0x7f;2=0x7f;3=0x7f
    
    # cat /sys/fs/resctrl/info/L3_MON/mbm_local_bytes_config
    0=0x15;1=0x15;3=0x15;4=0x15
    
  • 要更改 mbm_total_bytes 以僅計數域 0 上的讀取,需要設定位 0、1、4 和 5,二進位制為 110011b(十六進位制為 0x33)

    # echo  "0=0x33" > /sys/fs/resctrl/info/L3_MON/mbm_total_bytes_config
    
    # cat /sys/fs/resctrl/info/L3_MON/mbm_total_bytes_config
    0=0x33;1=0x7f;2=0x7f;3=0x7f
    
  • 要更改 mbm_local_bytes 以計數域 0 和 1 上的所有慢速記憶體讀取,需要設定位 4 和 5,二進位制為 110000b(十六進位制為 0x30)

    # echo  "0=0x30;1=0x30" > /sys/fs/resctrl/info/L3_MON/mbm_local_bytes_config
    
    # cat /sys/fs/resctrl/info/L3_MON/mbm_local_bytes_config
    0=0x30;1=0x30;3=0x15;4=0x15
    
“max_threshold_occupancy”

讀/寫檔案提供先前使用的 LLC_occupancy 計數器可以被認為可重用的最大值(以位元組為單位)。

最後,在“info”目錄的頂層,有一個名為“last_cmd_status”的檔案。 每次透過檔案系統發出“command”時,都會重置此檔案(建立新目錄或寫入任何控制檔案)。 如果命令成功,它將顯示為“ok”。 如果命令失敗,它將提供檔案操作的錯誤返回中可以傳達的更多資訊。 例如:

# echo L3:0=f7 > schemata
bash: echo: write error: Invalid argument
# cat info/last_cmd_status
mask f7 has non-consecutive 1-bits

資源分配和監控組

資源組在 resctrl 檔案系統中表示為目錄。 預設組是根目錄,在掛載後立即擁有系統中的所有任務和 CPU,並且可以充分利用所有資源。

在具有 RDT 控制功能的系統上,可以在根目錄中建立額外的目錄,這些目錄指定每個資源的不同數量(請參閱下面的“schemata”)。 根目錄和這些額外的頂級目錄在下面稱為“CTRL_MON”組。

在具有 RDT 監控的系統上,根目錄和其他頂級目錄包含一個名為“mon_groups”的目錄,可以在其中建立額外的目錄,以監控其祖先 CTRL_MON 組中的任務子集。 在本文件的其餘部分中,這些目錄稱為“MON”組。

刪除目錄會將該組擁有的所有任務和 CPU 移動到父目錄。 刪除建立的 CTRL_MON 組之一將自動刪除其下的所有 MON 組。

支援將 MON 組目錄移動到新的父 CTRL_MON 組,以便更改 MON 組的資源分配,而不會影響其監控資料或分配的任務。 對於監控 CPU 的 MON 組,不允許此操作。 目前不允許任何其他移動操作,只能簡單地重新命名 CTRL_MON 或 MON 組。

所有組都包含以下檔案

“tasks”

讀取此檔案會顯示屬於此組的所有任務的列表。 將任務 ID 寫入檔案會將任務新增到組中。 可以透過用逗號分隔任務 ID 來新增多個任務。 任務將按順序分配。 不支援多個失敗。 嘗試分配任務時遇到的單個失敗將導致操作中止,並且失敗之前已新增的任務將保留在該組中。 失敗將記錄到 /sys/fs/resctrl/info/last_cmd_status。

如果該組是 CTRL_MON 組,則任務將從擁有該任務的任何先前 CTRL_MON 組以及擁有該任務的任何 MON 組中刪除。 如果該組是 MON 組,則任務必須已屬於此組的 CTRL_MON 父級。 任務將從任何先前的 MON 組中刪除。

“cpus”

讀取此檔案會顯示此組擁有的邏輯 CPU 的位掩碼。 將掩碼寫入此檔案會將 CPU 新增到此組或從此組中刪除 CPU。 與任務檔案一樣,維護一個層次結構,其中 MON 組只能包含父 CTRL_MON 組擁有的 CPU。 當資源組處於偽鎖定模式時,此檔案將只能讀取,反映與偽鎖定區域關聯的 CPU。

“cpus_list”

與“cpus”類似,只是使用 CPU 範圍而不是位掩碼。

啟用控制後,所有 CTRL_MON 組也將包含

“schemata”

此組可用的所有資源的列表。 每個資源都有自己的行和格式 - 有關詳細資訊,請參見下文。

“size”

映象“schemata”檔案的顯示,以顯示每個分配的大小(以位元組為單位),而不是表示分配的位。

“mode”

資源組的“mode”決定了其分配的共享。 “shareable”資源組允許共享其分配,而“exclusive”資源組則不允許。 快取偽鎖定區域是透過首先將“pseudo-locksetup”寫入“mode”檔案,然後再將快取偽鎖定區域的模式寫入資源組的“schemata”檔案來建立的。 成功建立偽鎖定區域後,模式將自動更改為“pseudo-locked”。

“ctrl_hw_id”

僅在除錯選項可用時。 硬體用於控制組的識別符號。 在 x86 上,這是 CLOSID。

啟用監控後,所有 MON 組也將包含

“mon_data”

這包含一組按 L3 域和 RDT 事件組織的檔案。 例如,在具有兩個 L3 域的系統上,將有子目錄“mon_L3_00”和“mon_L3_01”。 這些目錄中的每個目錄都有一個檔案,每個事件(例如“llc_occupancy”、“mbm_total_bytes”和“mbm_local_bytes”)。 在 MON 組中,這些檔案提供組中所有任務的事件的當前值的讀出。 在 CTRL_MON 組中,這些檔案提供 CTRL_MON 組中所有任務和 MON 組中所有任務的總和。 有關使用方法的更多詳細資訊,請參見示例部分。 在啟用了 Sub-NUMA Cluster (SNC) 的系統上,每個節點都有額外的目錄(位於它們佔用的 L3 快取的“mon_L3_XX”目錄中)。 這些目錄名為“mon_sub_L3_YY”,其中“YY”是節點號。

“mon_hw_id”

僅在除錯選項可用時。 硬體用於監控組的識別符號。 在 x86 上,這是 RMID。

當使用“mba_MBps”掛載選項時,所有 CTRL_MON 組也將包含

“mba_MBps_event”

讀取此檔案會顯示哪個記憶體頻寬事件用作軟體反饋迴路的輸入,該回路使記憶體頻寬低於 schemata 檔案中指定的值。 寫入 /sys/fs/resctrl/info/L3_MON/mon_features 中找到的支援的記憶體頻寬事件之一的名稱會更改輸入事件。

資源分配規則

當任務執行時,以下規則定義了哪些資源可供使用

  1. 如果任務是非預設組的成員,則使用該組的 schemata。

  2. 否則,如果任務屬於預設組,但正在分配給某個特定組的 CPU 上執行,則使用 CPU 組的 schemata。

  3. 否則,使用預設組的 schemata。

資源監控規則

  1. 如果任務是 MON 組或非預設 CTRL_MON 組的成員,則該任務的 RDT 事件將在該組中報告。

  2. 如果任務是預設 CTRL_MON 組的成員,但正在分配給某個特定組的 CPU 上執行,則該任務的 RDT 事件將在該組中報告。

  3. 否則,該任務的 RDT 事件將在根級別的“mon_data”組中報告。

有關快取佔用監控和控制的注意事項

將任務從一個組移動到另一個組時,您應該記住,這隻會影響任務的快取分配。 例如,您的一個監控組中的任務顯示 3 MB 的快取佔用。 如果您移動到新組並立即檢查舊組和新組的佔用情況,您可能會看到舊組仍然顯示 3 MB,而新組顯示零。 當任務訪問移動之前仍在快取中的位置時,h/w 不會更新任何計數器。 在繁忙的系統上,您可能會看到舊組中的佔用情況下降,因為快取行被逐出並重新使用,而新組中的佔用情況上升,因為任務訪問記憶體並且載入到快取中是基於新組中的成員資格進行計數的。

同樣適用於快取分配控制。 將任務移動到具有較小快取分割槽的組不會逐出任何快取行。 該程序可能會繼續使用舊分割槽中的快取行。

硬體使用 CLOSid(服務類別 ID)和 RMID(資源監控 ID)來分別標識控制組和監控組。 每個資源組都基於組的型別對映到這些 ID。 CLOSid 和 RMID 的數量受到硬體的限制,因此,如果我們用完 CLOSID 或 RMID,則建立“CTRL_MON”目錄可能會失敗,如果我們用完 RMID,則建立“MON”組可能會失敗。

max_threshold_occupancy - 通用概念

請注意,一旦釋放 RMID,可能不會立即使用,因為 RMID 仍然標記了 RMID 先前使用者的快取行。 因此,此類 RMID 會被放置在 limbo 列表中,並在快取佔用率下降時重新檢查。 如果系統在某個時候有很多 limbo RMID 但尚未準備好使用,則使用者可能會在 mkdir 期間看到 -EBUSY。

max_threshold_occupancy 是使用者可配置的值,用於確定可以釋放 RMID 的佔用率。

mon_llc_occupancy_limbo 跟蹤點提供了子集 RMID 的精確佔用率(以位元組為單位),這些 RMID 無法立即用於分配。 這不能保證每秒都產生輸出,可能需要嘗試建立一個空監控組才能強制更新。 僅當控制組或監控組的建立失敗時才會生成輸出。

Schemata 檔案 - 通用概念

檔案中的每一行都描述一個資源。 該行以資源的名稱開頭,後跟要在系統上該資源的每個例項中應用的特定值。

快取 ID

在當前一代系統中,每個插槽有一個 L3 快取,並且 L2 快取通常只是由核心上的超執行緒共享,但這不是一個架構要求。 我們可以在一個插槽上有多個單獨的 L3 快取,多個核心可以共享一個 L2 快取。 因此,我們不使用“插槽”或“核心”來定義共享資源的邏輯 CPU 集,而是使用“快取 ID”。 在給定的快取級別,這將是整個系統中的唯一編號(但不保證是一個連續的序列,可能存在間隔)。 要查詢每個邏輯 CPU 的 ID,請檢視 /sys/devices/system/cpu/cpu*/cache/index*/id

快取位掩碼 (CBM)

對於快取資源,我們使用位掩碼描述可用於分配的快取部分。 掩碼的最大值由每個 CPU 模型定義(並且對於不同的快取級別可能不同)。 它是使用 CPUID 找到的,但也以“info/{resource}/cbm_mask”的形式在 resctrl 檔案系統的“info”目錄中提供。 一些英特爾硬體要求這些掩碼的所有“1”位都在一個連續的塊中。 因此,0x3、0x6 和 0xC 是具有兩位設定的合法 4 位掩碼,但 0x5、0x9 和 0xA 不是。 檢查 /sys/fs/resctrl/info/{resource}/sparse_masks 是否支援非連續的 1s 值。 在具有 20 位掩碼的系統上,每一位代表快取容量的 5%。 您可以使用以下掩碼將快取分成四個相等的部分:0x1f、0x3e0、0x7c00、0xf8000。

有關 Sub-NUMA Cluster 模式的注意事項

啟用 SNC 模式後,Linux 可能會比在常規 NUMA 節點之間更容易地在 Sub-NUMA 節點之間進行任務負載平衡,因為 Sub-NUMA 節點上的 CPU 共享相同的 L3 快取,並且系統可能會報告 Sub-NUMA 節點之間的 NUMA 距離,其值低於用於常規 NUMA 節點的值。

每個“mon_L3_XX”目錄中的頂級監控檔案提供跨所有共享 L3 快取例項的 SNC 節點的資料總和。 將任務繫結到特定 Sub-NUMA 節點的 CPU 的使用者可以讀取“mon_sub_L3_YY”目錄中的“llc_occupancy”、“mbm_total_bytes”和“mbm_local_bytes”以獲取節點本地資料。

記憶體頻寬分配仍然在 L3 快取級別執行。 即,限制控制應用於所有 SNC 節點。

L3 快取分配點陣圖也適用於所有 SNC 節點。 但請注意,每一位代表的 L3 快取量除以每個 L3 快取的 SNC 節點數。 例如,在具有 100MB 快取的系統上,具有 10 位分配掩碼,通常每一位代表 10MB。 在啟用了 SNC 模式且每個 L3 快取有兩個 SNC 節點的情況下,每一位僅代表 5MB。

記憶體頻寬分配和監控

對於記憶體頻寬資源,預設情況下,使用者透過指示總記憶體頻寬的百分比來控制資源。

每個 CPU 模型的最小頻寬百分比值是預定義的,可以透過“info/MB/min_bandwidth”查詢。 分配的頻寬粒度也取決於 CPU 模型,並且可以在“info/MB/bandwidth_gran”中查詢。 可用的頻寬控制步長為:min_bw + N * bw_gran。 中間值四捨五入到硬體上可用的下一個控制步長。

在某些 Intel SKU 上,頻寬限制是一種特定於核心的機制。 在共享核心的兩個執行緒上使用高頻寬和低頻寬設定可能會導致兩個執行緒都被限制為使用低頻寬(請參閱“thread_throttle_mode”)。

記憶體頻寬分配 (MBA) 可能是核心特定的機制,而記憶體頻寬監控 (MBM) 是在包級別完成的,這一事實可能會導致使用者在嘗試透過 MBA 應用控制,然後監控頻寬以檢視控制是否有效時產生困惑。 以下是此類情況

  1. 當增加百分比值時,使用者可能看不到實際頻寬的增加

當聚合 L2 外部頻寬大於 L3 外部頻寬時,可能會發生這種情況。 考慮一個在包上有 24 個核心的 SKL SKU,其中 L2 外部頻寬為 10GBps(因此聚合 L2 外部頻寬為 240GBps),L3 外部頻寬為 100GBps。 現在,一個具有“20 個執行緒,每個執行緒消耗 5GBps,具有 50% 頻寬”的工作負載消耗了 100GBps 的最大 L3 頻寬,儘管指定的百分比值僅為 50% << 100%。 因此,增加頻寬百分比不會產生更多的頻寬。 這是因為儘管 L2 外部頻寬仍然具有容量,但 L3 外部頻寬已完全使用。 另請注意,這取決於基準測試執行的核心數量。

  1. 相同的頻寬百分比可能意味著不同的實際頻寬,具體取決於執行緒數

對於 #1 中的相同 SKU,“單個執行緒,具有 10% 頻寬”和“4 個執行緒,具有 10% 頻寬”可以消耗高達 10GBps 和 40GBps,儘管它們的頻寬百分比相同,為 10%。 這僅僅是因為當執行緒開始在 rdtgroup 中使用更多核心時,實際頻寬可能會增加或變化,儘管使用者指定的頻寬百分比相同。

為了緩解這種情況並使介面更加使用者友好,resctrl 添加了以 MiBps 為單位指定頻寬的支援。 核心將在底層使用軟體反饋機制或“軟體控制器 (mba_sc)”,該機制使用 MBM 計數器讀取實際頻寬並調整記憶體頻寬百分比以確保

"actual bandwidth < user specified bandwidth".

預設情況下,schemata 將採用頻寬百分比值,而使用者可以使用掛載選項“mba_MBps”切換到“MBA 軟體控制器”模式。 schemata 格式在以下部分中指定。

L3 schemata 檔案詳細資訊(停用程式碼和資料優先順序)

停用 CDP 後,L3 schemata 格式為

L3:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...

L3 schemata 檔案詳細資訊(透過掛載選項啟用 CDP 到 resctrl)

啟用 CDP 後,L3 控制將分為兩個單獨的資源,因此您可以像這樣為程式碼和資料指定獨立的掩碼

L3DATA:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...
L3CODE:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...

L2 schemata 檔案詳細資訊

使用“cdpl2”掛載選項在 L2 上支援 CDP。 schemata 格式為

L2:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...

L2DATA:<cache_id0>=<cbm>;<cache_id1>=<cbm>;... L2CODE:<cache_id0>=<cbm>;<cache_id1>=<cbm>;...

記憶體頻寬分配 (預設模式)

記憶體頻寬域為L3快取。

MB:<cache_id0>=bandwidth0;<cache_id1>=bandwidth1;...

以MiBps為單位指定的記憶體頻寬分配

記憶體頻寬域為L3快取。

MB:<cache_id0>=bw_MiBps0;<cache_id1>=bw_MiBps1;...

慢速記憶體頻寬分配 (SMBA)

AMD硬體支援慢速記憶體頻寬分配 (SMBA)。 CXL.memory 是唯一支援的“慢速”記憶體裝置。 透過支援 SMBA,硬體可以在慢速記憶體裝置上啟用頻寬分配。 如果系統中有多個此類裝置,則限制邏輯會將所有慢速源組合在一起,並對它們整體應用限制。

SMBA (帶有 CXL.memory) 的存在與慢速記憶體裝置的存在無關。 如果系統上沒有此類裝置,則配置 SMBA 不會對系統性能產生任何影響。

慢速記憶體的頻寬域為L3快取。 其模式檔案格式如下:

SMBA:<cache_id0>=bandwidth0;<cache_id1>=bandwidth1;...

讀取/寫入模式檔案

讀取模式檔案將顯示所有域上所有資源的狀態。 寫入時,您只需要指定您希望更改的那些值。 例如:

# cat schemata
L3DATA:0=fffff;1=fffff;2=fffff;3=fffff
L3CODE:0=fffff;1=fffff;2=fffff;3=fffff
# echo "L3DATA:2=3c0;" > schemata
# cat schemata
L3DATA:0=fffff;1=fffff;2=3c0;3=fffff
L3CODE:0=fffff;1=fffff;2=fffff;3=fffff

讀取/寫入模式檔案 (在 AMD 系統上)

讀取模式檔案將顯示所有域上的當前頻寬限制。 分配的資源以八分之一 GB/s 的倍數表示。 寫入檔案時,您需要指定要配置頻寬限制的快取 ID。

例如,要在第一個快取 ID 上分配 2GB/s 的限制

# cat schemata
  MB:0=2048;1=2048;2=2048;3=2048
  L3:0=ffff;1=ffff;2=ffff;3=ffff

# echo "MB:1=16" > schemata
# cat schemata
  MB:0=2048;1=  16;2=2048;3=2048
  L3:0=ffff;1=ffff;2=ffff;3=ffff

讀取/寫入具有 SMBA 功能的模式檔案 (在 AMD 系統上)

讀取和寫入模式檔案與上面沒有 SMBA 的部分相同。

例如,要在第一個快取 ID 上分配 8GB/s 的限制

# cat schemata
  SMBA:0=2048;1=2048;2=2048;3=2048
    MB:0=2048;1=2048;2=2048;3=2048
    L3:0=ffff;1=ffff;2=ffff;3=ffff

# echo "SMBA:1=64" > schemata
# cat schemata
  SMBA:0=2048;1=  64;2=2048;3=2048
    MB:0=2048;1=2048;2=2048;3=2048
    L3:0=ffff;1=ffff;2=ffff;3=ffff

快取偽鎖定

CAT 允許使用者指定應用程式可以填充的快取空間量。 快取偽鎖定建立在這樣一個事實之上:CPU 仍然可以讀取和寫入預先分配在其當前分配區域之外的資料,但必須在快取命中時才行。 透過快取偽鎖定,可以將資料預載入到應用程式無法填充的快取保留部分中,並且從那時起,它將僅提供快取命中。 快取偽鎖定記憶體可以被使用者空間訪問,應用程式可以將其對映到其虛擬地址空間中,從而擁有一個具有降低的平均讀取延遲的記憶體區域。

快取偽鎖定區域的建立由來自使用者的請求觸發,該請求附帶要偽鎖定的區域的模式。

  • 建立一個 CAT 分配 CLOSNEW,其 CBM 與來自使用者的快取區域的模式匹配,該快取區域將包含偽鎖定記憶體。 此區域不得與系統上的任何當前 CAT 分配/CLOS 重疊,並且在偽鎖定區域存在時,不允許將來與此快取區域重疊。

  • 建立一個與快取區域大小相同的連續記憶體區域。

  • 重新整理快取,停用硬體預取器,停用搶佔。

  • 使 CLOSNEW 成為活動的 CLOS,並觸控分配的記憶體以將其載入到快取中。

  • 將先前的 CLOS 設定為活動狀態。

  • 此時,可以釋放 closid CLOSNEW - 只要其 CBM 不出現在任何 CAT 分配中,快取偽鎖定區域就會受到保護。 即使快取偽鎖定區域從此時起不會出現在任何 CLOS 的任何 CBM 中,執行任何 CLOS 的應用程式都將能夠訪問偽鎖定區域中的記憶體,因為該區域會繼續提供快取命中。

  • 載入到快取中的連續記憶體區域作為字元裝置暴露給使用者空間。

快取偽鎖定透過仔細配置 CAT 功能和控制應用程式行為來提高資料保留在快取中的可能性。 不能保證資料被放置在快取中。 諸如 INVD、WBINVD、CLFLUSH 等指令仍然可以從快取中逐出“鎖定”的資料。 電源管理 C 狀態可能會縮小或關閉快取。 在建立偽鎖定區域時,將自動限制更深的 C 狀態。

使用偽鎖定區域的應用程式必須與與偽鎖定區域所在的快取關聯的核心(或核心的子集)具有親和性。 程式碼中的健全性檢查將不允許應用程式對映偽鎖定記憶體,除非它與與偽鎖定區域所在的快取關聯的核心具有親和性。 健全性檢查僅在初始 mmap() 處理期間完成,之後沒有強制執行,應用程式自身需要確保它仍然與正確的核心保持仿射性。

偽鎖定分兩個階段完成

  1. 在第一階段,系統管理員分配應該專用於偽鎖定的快取部分。 此時,分配等效的記憶體部分,將其載入到分配的快取部分中,並將其作為字元裝置公開。

  2. 在第二階段,使用者空間應用程式將偽鎖定記憶體對映 (mmap()) 到其地址空間中。

快取偽鎖定介面

使用 resctrl 介面建立偽鎖定區域,如下所示

  1. 透過在 /sys/fs/resctrl 中建立一個新目錄來建立一個新的資源組。

  2. 透過將“pseudo-locksetup”寫入“mode”檔案,將新資源組的模式更改為“pseudo-locksetup”。

  3. 將偽鎖定區域的模式寫入“schemata”檔案。 根據“bit_usage”檔案,模式中的所有位都應為“未使用”。

成功建立偽鎖定區域後,“mode”檔案將包含“pseudo-locked”,並且在 /dev/pseudo_lock 中將存在一個與資源組名稱相同的新字元裝置。 使用者空間可以 mmap() 此字元裝置以獲得對偽鎖定記憶體區域的訪問許可權。

可以在下面找到快取偽鎖定區域的建立和使用的示例。

快取偽鎖定除錯介面

預設情況下啟用偽鎖定除錯介面(如果啟用了 CONFIG_DEBUG_FS),並且可以在 /sys/kernel/debug/resctrl 中找到。

核心沒有明確的方法來測試提供的記憶體位置是否存在於快取中。 偽鎖定除錯介面使用跟蹤基礎設施來提供兩種測量偽鎖定區域的快取駐留的方法

  1. 使用 pseudo_lock_mem_latency 跟蹤點測量記憶體訪問延遲。 使用 hist 觸發器可以最好地視覺化來自這些測量的資料(請參見下面的示例)。 在此測試中,偽鎖定區域以 32 位元組的步幅遍歷,同時停用硬體預取器和搶佔。 這也提供了快取命中和未命中的替代視覺化。

  2. 如果可用,使用特定於模型的精確計數器測量快取命中和未命中。 根據系統上的快取級別,可以使用 pseudo_lock_l2 和 pseudo_lock_l3 跟蹤點。

建立偽鎖定區域時,將在 debugfs 中為其建立一個新的 debugfs 目錄,作為 /sys/kernel/debug/resctrl/<newdir>。 此目錄中存在一個單獨的只寫檔案 pseudo_lock_measure。 偽鎖定區域的測量取決於寫入此 debugfs 檔案的數字

1:

將“1”寫入 pseudo_lock_measure 檔案將觸發在 pseudo_lock_mem_latency 跟蹤點中捕獲的延遲測量。 請參見下面的示例。

2:

將“2”寫入 pseudo_lock_measure 檔案將觸發在 pseudo_lock_l2 跟蹤點中捕獲的 L2 快取駐留(快取命中和未命中)測量。 請參見下面的示例。

3:

將“3”寫入 pseudo_lock_measure 檔案將觸發在 pseudo_lock_l3 跟蹤點中捕獲的 L3 快取駐留(快取命中和未命中)測量。

所有測量都使用跟蹤基礎設施記錄。 這需要在觸發測量之前啟用相關的跟蹤點。

延遲除錯介面的示例

在此示例中,建立了一個名為“newlock”的偽鎖定區域。 這是我們如何測量從此區域讀取的週期延遲並使用直方圖視覺化此資料(如果設定了 CONFIG_HIST_TRIGGERS)

# :> /sys/kernel/tracing/trace
# echo 'hist:keys=latency' > /sys/kernel/tracing/events/resctrl/pseudo_lock_mem_latency/trigger
# echo 1 > /sys/kernel/tracing/events/resctrl/pseudo_lock_mem_latency/enable
# echo 1 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
# echo 0 > /sys/kernel/tracing/events/resctrl/pseudo_lock_mem_latency/enable
# cat /sys/kernel/tracing/events/resctrl/pseudo_lock_mem_latency/hist

# event histogram
#
# trigger info: hist:keys=latency:vals=hitcount:sort=hitcount:size=2048 [active]
#

{ latency:        456 } hitcount:          1
{ latency:         50 } hitcount:         83
{ latency:         36 } hitcount:         96
{ latency:         44 } hitcount:        174
{ latency:         48 } hitcount:        195
{ latency:         46 } hitcount:        262
{ latency:         42 } hitcount:        693
{ latency:         40 } hitcount:       3204
{ latency:         38 } hitcount:       3484

Totals:
    Hits: 8192
    Entries: 9
  Dropped: 0

快取命中/未命中除錯的示例

在此示例中,在平臺的 L2 快取上建立了一個名為“newlock”的偽鎖定區域。 這是我們如何使用平臺的精確計數器獲取快取命中和未命中的詳細資訊。

# :> /sys/kernel/tracing/trace
# echo 1 > /sys/kernel/tracing/events/resctrl/pseudo_lock_l2/enable
# echo 2 > /sys/kernel/debug/resctrl/newlock/pseudo_lock_measure
# echo 0 > /sys/kernel/tracing/events/resctrl/pseudo_lock_l2/enable
# cat /sys/kernel/tracing/trace

# tracer: nop
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
pseudo_lock_mea-1672  [002] ....  3132.860500: pseudo_lock_l2: hits=4097 miss=0

RDT 分配用法的示例

  1. 示例 1

在一臺雙插槽機器(每個插槽一個 L3 快取)上,快取位掩碼只有四個位,最小頻寬為 10%,記憶體頻寬粒度為 10%。

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl
# mkdir p0 p1
# echo "L3:0=3;1=c\nMB:0=50;1=50" > /sys/fs/resctrl/p0/schemata
# echo "L3:0=3;1=3\nMB:0=50;1=50" > /sys/fs/resctrl/p1/schemata

預設資源組未修改,因此我們可以訪問所有快取的所有部分(其模式檔案讀取“L3:0=f;1=f”)。

在組“p0”控制下的任務只能從快取 ID 0 上的“較低”50% 和快取 ID 1 上的“較高”50% 進行分配。組“p1”中的任務使用兩個插槽上快取的“較低”50%。

類似地,在組“p0”控制下的任務可以在插槽 0 上使用最大記憶體頻寬的 50%,在插槽 1 上使用 50%。組“p1”也可以在兩個插槽上使用 50% 的記憶體頻寬。 請注意,與快取掩碼不同,記憶體頻寬無法指定這些分配是否可以重疊。 分配指定組可能能夠使用的最大頻寬,系統管理員可以相應地配置頻寬。

如果 resctrl 使用軟體控制器 (mba_sc),則使用者可以輸入 MB 中的最大頻寬,而不是百分比值。

# echo "L3:0=3;1=c\nMB:0=1024;1=500" > /sys/fs/resctrl/p0/schemata
# echo "L3:0=3;1=3\nMB:0=1024;1=500" > /sys/fs/resctrl/p1/schemata

在上面的示例中,插槽 0 上的“p1”和“p0”中的任務將使用 1024MB 的最大頻寬,而插槽 1 上的任務將使用 500MB。

  1. 示例 2

同樣是兩個插槽,但這次具有更真實的 20 位掩碼。

兩個即時任務 pid=1234 在處理器 0 上執行,pid=5678 在處理器 1 上執行,在 2 插槽雙核機器上的插槽 0 上。為了避免嘈雜的鄰居,兩個即時任務中的每一個都獨佔插槽 0 上 L3 快取的四分之一。

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl

首先,我們重置預設組的模式,以便普通任務無法使用插槽 0 上 L3 快取的“較高”50% 和記憶體頻寬的 50%

# echo "L3:0=3ff;1=fffff\nMB:0=50;1=100" > schemata

接下來,我們為我們的第一個即時任務建立一個資源組,並允許它訪問插槽 0 上快取的“頂部”25%。

# mkdir p0
# echo "L3:0=f8000;1=fffff" > p0/schemata

最後,我們將我們的第一個即時任務移動到此資源組中。 我們還使用 taskset(1) 來確保任務始終在插槽 0 上的專用 CPU 上執行。資源組的大多數用途也會限制任務執行的處理器。

# echo 1234 > p0/tasks
# taskset -cp 1 1234

同樣適用於第二個即時任務(具有剩餘的 25% 快取)

# mkdir p1
# echo "L3:0=7c00;1=fffff" > p1/schemata
# echo 5678 > p1/tasks
# taskset -cp 2 5678

對於具有記憶體頻寬資源和 CAT L3 的相同 2 插槽系統,模式如下所示(假設 min_bandwidth 為 10,bandwidth_gran 為 10)

對於我們的第一個即時任務,這將請求在插槽 0 上分配 20% 的記憶體頻寬。

# echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata

對於我們的第二個即時任務,這將請求在插槽 0 上分配另外 20% 的記憶體頻寬。

# echo -e "L3:0=f8000;1=fffff\nMB:0=20;1=100" > p0/schemata
  1. 示例 3

一個單插槽系統,即時任務在核心 4-7 上執行,非即時工作負載分配給核心 0-3。 即時任務共享文字和資料,因此不需要每個任務關聯,並且由於與核心的互動,希望核心在這些核心上與任務共享 L3。

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl

首先,我們重置預設組的模式,以便普通任務無法使用插槽 0 上 L3 快取的“較高”50% 和插槽 0 上記憶體頻寬的 50%

# echo "L3:0=3ff\nMB:0=50" > schemata

接下來,我們為我們的即時核心建立一個資源組,並允許它訪問插槽 0 上快取的“頂部”50% 和插槽 0 上記憶體頻寬的 50%。

# mkdir p0
# echo "L3:0=ffc00\nMB:0=50" > p0/schemata

最後,我們將核心 4-7 移動到新組,並確保核心和在那裡執行的任務獲得 50% 的快取。 假設核心 4-7 是 SMT 兄弟,並且只有即時執行緒在核心 4-7 上排程,它們還應該獲得 50% 的記憶體頻寬。

# echo F0 > p0/cpus
  1. 示例 4

先前示例中的資源組都處於預設的“可共享”模式,允許共享它們的快取分配。 如果一個資源組配置了快取分配,那麼沒有什麼可以阻止另一個資源組與該分配重疊。

在此示例中,將在具有兩個 L2 快取例項的 L2 CAT 系統上建立一個新的獨佔資源組,可以使用 8 位容量位掩碼配置這些例項。 新的獨佔資源組將被配置為使用每個快取例項的 25%。

# mount -t resctrl resctrl /sys/fs/resctrl/
# cd /sys/fs/resctrl

首先,我們觀察到預設組被配置為分配給所有 L2 快取

# cat schemata
L2:0=ff;1=ff

我們可以在此時嘗試建立新的資源組,但由於與預設組的模式重疊,它將失敗

# mkdir p0
# echo 'L2:0=0x3;1=0x3' > p0/schemata
# cat p0/mode
shareable
# echo exclusive > p0/mode
-sh: echo: write error: Invalid argument
# cat info/last_cmd_status
schemata overlaps

為了確保沒有與另一個資源組重疊,必須更改預設資源組的模式,使新的資源組成為獨佔資源組成為可能。

# echo 'L2:0=0xfc;1=0xfc' > schemata
# echo exclusive > p0/mode
# grep . p0/*
p0/cpus:0
p0/mode:exclusive
p0/schemata:L2:0=03;1=03
p0/size:L2:0=262144;1=262144

新資源組在建立時不會與獨佔資源組重疊

# mkdir p1
# grep . p1/*
p1/cpus:0
p1/mode:shareable
p1/schemata:L2:0=fc;1=fc
p1/size:L2:0=786432;1=786432

bit_usage 將反映快取的使用方式

# cat info/L2/bit_usage
0=SSSSSSEE;1=SSSSSSEE

不能強制資源組與獨佔資源組重疊

# echo 'L2:0=0x1;1=0x1' > p1/schemata
-sh: echo: write error: Invalid argument
# cat info/last_cmd_status
overlaps with exclusive group

快取偽鎖定的示例

使用 CBM 0x3 從快取 ID 1 鎖定 L2 快取的一部分。偽鎖定區域在 /dev/pseudo_lock/newlock 處公開,可以提供給應用程式作為 mmap() 的引數。

# mount -t resctrl resctrl /sys/fs/resctrl/
# cd /sys/fs/resctrl

確保有可用於偽鎖定的位,因為只有未使用的位才能被偽鎖定,因此需要從預設資源組的模式中刪除要偽鎖定的位

# cat info/L2/bit_usage
0=SSSSSSSS;1=SSSSSSSS
# echo 'L2:1=0xfc' > schemata
# cat info/L2/bit_usage
0=SSSSSSSS;1=SSSSSS00

建立一個新的資源組,該組將與偽鎖定區域關聯,指示它將用於偽鎖定區域,並配置請求的偽鎖定區域容量位掩碼

# mkdir newlock
# echo pseudo-locksetup > newlock/mode
# echo 'L2:1=0x3' > newlock/schemata

成功後,資源組的模式將更改為偽鎖定,bit_usage 將反映偽鎖定區域,並且將存在公開偽鎖定區域的字元裝置

# cat newlock/mode
pseudo-locked
# cat info/L2/bit_usage
0=SSSSSSSS;1=SSSSSSPP
# ls -l /dev/pseudo_lock/newlock
crw------- 1 root root 243, 0 Apr  3 05:01 /dev/pseudo_lock/newlock
/*
* Example code to access one page of pseudo-locked cache region
* from user space.
*/
#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>

/*
* It is required that the application runs with affinity to only
* cores associated with the pseudo-locked region. Here the cpu
* is hardcoded for convenience of example.
*/
static int cpuid = 2;

int main(int argc, char *argv[])
{
  cpu_set_t cpuset;
  long page_size;
  void *mapping;
  int dev_fd;
  int ret;

  page_size = sysconf(_SC_PAGESIZE);

  CPU_ZERO(&cpuset);
  CPU_SET(cpuid, &cpuset);
  ret = sched_setaffinity(0, sizeof(cpuset), &cpuset);
  if (ret < 0) {
    perror("sched_setaffinity");
    exit(EXIT_FAILURE);
  }

  dev_fd = open("/dev/pseudo_lock/newlock", O_RDWR);
  if (dev_fd < 0) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  mapping = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED,
          dev_fd, 0);
  if (mapping == MAP_FAILED) {
    perror("mmap");
    close(dev_fd);
    exit(EXIT_FAILURE);
  }

  /* Application interacts with pseudo-locked memory @mapping */

  ret = munmap(mapping, page_size);
  if (ret < 0) {
    perror("munmap");
    close(dev_fd);
    exit(EXIT_FAILURE);
  }

  close(dev_fd);
  exit(EXIT_SUCCESS);
}

應用程式之間的鎖定

由對多個檔案的讀/寫組成的 resctrl 檔案系統上的某些操作必須是原子的。

例如,L3 快取的獨佔預留的分配涉及

  1. 從每個目錄或每個資源的“bit_usage”讀取 cbmmasks

  2. 在全域性 CBM 位掩碼中找到一組連續的位,這些位在任何目錄 cbmmasks 中都是清除的

  3. 建立一個新目錄

  4. 將步驟 2 中找到的位設定為新的目錄“schemata”檔案

如果兩個應用程式嘗試同時分配空間,那麼它們最終可能會分配相同的位,因此預留是共享的而不是獨佔的。

為了協調 resctrlfs 上的原子操作並避免上述問題,建議使用以下鎖定過程

鎖定基於 flock,它在 libc 中可用,並且也可以作為 shell 指令碼命令使用

寫鎖定

  1. 在 /sys/fs/resctrl 上執行 flock(LOCK_EX)

  2. 讀取/寫入目錄結構。

  3. 取消鎖定

讀鎖定

  1. 在 /sys/fs/resctrl 上執行 flock(LOCK_SH)

  2. 如果成功,則讀取目錄結構。

  3. 取消鎖定

使用 bash 的示例

# Atomically read directory structure
$ flock -s /sys/fs/resctrl/ find /sys/fs/resctrl

# Read directory contents and create new subdirectory

$ cat create-dir.sh
find /sys/fs/resctrl/ > output.txt
mask = function-of(output.txt)
mkdir /sys/fs/resctrl/newres/
echo mask > /sys/fs/resctrl/newres/schemata

$ flock /sys/fs/resctrl/ ./create-dir.sh

使用 C 的示例

/*
* Example code do take advisory locks
* before accessing resctrl filesystem
*/
#include <sys/file.h>
#include <stdlib.h>

void resctrl_take_shared_lock(int fd)
{
  int ret;

  /* take shared lock on resctrl filesystem */
  ret = flock(fd, LOCK_SH);
  if (ret) {
    perror("flock");
    exit(-1);
  }
}

void resctrl_take_exclusive_lock(int fd)
{
  int ret;

  /* release lock on resctrl filesystem */
  ret = flock(fd, LOCK_EX);
  if (ret) {
    perror("flock");
    exit(-1);
  }
}

void resctrl_release_lock(int fd)
{
  int ret;

  /* take shared lock on resctrl filesystem */
  ret = flock(fd, LOCK_UN);
  if (ret) {
    perror("flock");
    exit(-1);
  }
}

void main(void)
{
  int fd, ret;

  fd = open("/sys/fs/resctrl", O_DIRECTORY);
  if (fd == -1) {
    perror("open");
    exit(-1);
  }
  resctrl_take_shared_lock(fd);
  /* code to read directory contents */
  resctrl_release_lock(fd);

  resctrl_take_exclusive_lock(fd);
  /* code to read and write directory contents */
  resctrl_release_lock(fd);
}

RDT 監控以及分配用法的示例

讀取監控的資料

讀取事件檔案(例如:mon_data/mon_L3_00/llc_occupancy)將顯示相應 MON 組或 CTRL_MON 組的 LLC 佔用率的當前快照。

示例 1(監控 CTRL_MON 組和 CTRL_MON 組中的任務子集)

在一臺雙插槽機器(每個插槽一個 L3 快取)上,快取位掩碼只有四個位

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl
# mkdir p0 p1
# echo "L3:0=3;1=c" > /sys/fs/resctrl/p0/schemata
# echo "L3:0=3;1=3" > /sys/fs/resctrl/p1/schemata
# echo 5678 > p1/tasks
# echo 5679 > p1/tasks

預設資源組未修改,因此我們可以訪問所有快取的所有部分(其模式檔案讀取“L3:0=f;1=f”)。

在組“p0”控制下的任務只能從快取 ID 0 上的“較低”50% 和快取 ID 1 上的“較高”50% 進行分配。組“p1”中的任務使用兩個插槽上快取的“較低”50%。

建立監控組並將任務子集分配給每個監控組。

# cd /sys/fs/resctrl/p1/mon_groups
# mkdir m11 m12
# echo 5678 > m11/tasks
# echo 5679 > m12/tasks

獲取資料(資料顯示為位元組)

# cat m11/mon_data/mon_L3_00/llc_occupancy
16234000
# cat m11/mon_data/mon_L3_01/llc_occupancy
14789000
# cat m12/mon_data/mon_L3_00/llc_occupancy
16789000

父 ctrl_mon 組顯示聚合的資料。

# cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
31234000

示例 2(從任務建立時對其進行監控)

在一臺雙插槽機器(每個插槽一個 L3 快取)上

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl
# mkdir p0 p1

RMID 在組建立後分配給該組,因此從 <cmd> 的建立開始對其進行監控。

# echo $$ > /sys/fs/resctrl/p1/tasks
# <cmd>

獲取資料

# cat /sys/fs/resctrl/p1/mon_data/mon_l3_00/llc_occupancy
31789000

示例 3(在沒有 CAT 支援或建立 CAT 組之前進行監控)

假設一個像 HSW 這樣的系統只有 CQM 而沒有 CAT 支援。 在這種情況下,resctrl 仍然會掛載,但無法建立 CTRL_MON 目錄。 但是,使用者可以在根組中建立不同的 MON 組,從而能夠監控包括核心執行緒在內的所有任務。

這也可以用於在能夠將作業分配給不同的分配組之前,分析作業的快取大小佔用空間。

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl
# mkdir mon_groups/m01
# mkdir mon_groups/m02

# echo 3478 > /sys/fs/resctrl/mon_groups/m01/tasks
# echo 2467 > /sys/fs/resctrl/mon_groups/m02/tasks

分別監控各個組,並獲取每個域的資料。 從下面的資料中可以看出,任務主要在域(插槽)0 上執行工作。

# cat /sys/fs/resctrl/mon_groups/m01/mon_L3_00/llc_occupancy
31234000
# cat /sys/fs/resctrl/mon_groups/m01/mon_L3_01/llc_occupancy
34555
# cat /sys/fs/resctrl/mon_groups/m02/mon_L3_00/llc_occupancy
31234000
# cat /sys/fs/resctrl/mon_groups/m02/mon_L3_01/llc_occupancy
32789

示例 4(監控即時任務)

一個單插槽系統,即時任務在核心 4-7 上執行,非即時任務在其他 cpu 上執行。 我們想要監控這些核心上即時執行緒的快取佔用率。

# mount -t resctrl resctrl /sys/fs/resctrl
# cd /sys/fs/resctrl
# mkdir p1

將 cpus 4-7 移動到 p1

# echo f0 > p1/cpus

檢視 llc 佔用率快照

# cat /sys/fs/resctrl/p1/mon_data/mon_L3_00/llc_occupancy
11234000

Intel RDT 勘誤表

Intel MBM 計數器可能會錯誤地報告系統記憶體頻寬

Skylake 伺服器的勘誤表 SKX99 和 Broadwell 伺服器的 BDF102。

問題:Intel 記憶體頻寬監控 (MBM) 計數器根據為該邏輯核心分配的資源監控 ID (RMID) 跟蹤指標。 IA32_QM_CTR 暫存器 (MSR 0xC8E) 用於報告這些指標,但對於某些 RMID 值,可能會報告不正確的系統頻寬。

影響:由於此勘誤表,系統記憶體頻寬可能與報告的不符。

解決方法:MBM 總讀數和本地讀數根據以下校正因子表進行校正

核心計數

rmid 計數

rmid 閾值

校正因子

1

8

0

1.000000

2

16

0

1.000000

3

24

15

0.969650

4

32

0

1.000000

6

48

31

0.969650

7

56

47

1.142857

8

64

0

1.000000

9

72

63

1.185115

10

80

63

1.066553

11

88

79

1.454545

12

96

0

1.000000

13

104

95

1.230769

14

112

95

1.142857

15

120

95

1.066667

16

128

0

1.000000

17

136

127

1.254863

18

144

127

1.185255

19

152

0

1.000000

20

160

127

1.066667

21

168

0

1.000000

22

176

159

1.454334

23

184

0

1.000000

24

192

127

0.969744

25

200

191

1.280246

26

208

191

1.230921

27

216

0

1.000000

28

224

191

1.143118

如果 rmid > rmid 閾值,則 MBM 總值和本地值應乘以校正因子。

請參閱

1. Intel Xeon 處理器可擴充套件系列規範更新中的勘誤表 SKX99:http://web.archive.org/web/20200716124958/https://www.intel.com/content/www/us/en/processors/xeon/scalable/xeon-scalable-spec-update.html

2. Intel Xeon E5-2600 v4 處理器產品系列規範更新中的勘誤表 BDF102:http://web.archive.org/web/20191125200531/https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/xeon-e5-v4-spec-update.pdf

3. 第 2 代 Intel Xeon 可擴充套件處理器參考手冊中 Intel 資源導向技術 (Intel RDT) 中的勘誤表:https://software.intel.com/content/www/us/en/develop/articles/intel-resource-director-technology-rdt-reference-manual.html

以獲取更多資訊。