RSS 組態
若要取得 RSS 組態資訊,過度配置驅動程式可以將 OID_GEN_RECEIVE_SCALE_CAPABILITIES 的 OID 查詢傳送至迷你埠驅動程式。 NDIS 也會在初始化期間,將 RSS 組態資訊提供給在NDIS_BIND_PARAMETERS結構中過度配置通訊協定驅動程式。
過度配置驅動程式會選擇哈希函式、類型和間接取值數據表。 若要設定這些組態選項,驅動程式會將 OID_GEN_RECEIVE_SCALE_PARAMETERS 的 OID 集合要求傳送至迷你埠驅動程式。 過度配置驅動程式也可以查詢此 OID 以取得目前的 RSS 設定。 OID_GEN_RECEIVE_SCALE_PARAMETERS OID 的信息緩衝區包含NDIS_RECEIVE_SCALE_PARAMETERS結構的指標。
過度的驅動程式可以在 NIC 上停用 RSS。 在此情況下,驅動程式會在 NDIS_RECEIVE_SCALE_PARAMETERS 結構的 Flags 成員中設定NDIS_RSS_PARAM_FLAG_DISABLE_RSS旗標。 設定此旗標時,迷你埠驅動程序應該忽略所有其他旗標和設定,並在 NIC 上停用 RSS。
NDIS 會先處理OID_GEN_RECEIVE_SCALE_PARAMETERS,然後再將它傳遞給迷你埠驅動程式,並視需要更新迷你埠配接器的 *RSS 標準化關鍵詞。 如需 *RSS 關鍵詞的詳細資訊,請參閱 RSS 的標準化 INF 關鍵詞。
在 收到已設定NDIS_RSS_PARAM_FLAG_DISABLE_RSS旗標的OID_GEN_RECEIVE_SCALE_PARAMETERS 集要求之後,迷你埠驅動程序應該在初始化之後,將 NIC 的 RSS 狀態設定為 NIC 的初始狀態。 因此,如果迷你埠驅動程式收到後續OID_GEN_RECEIVE_SCALE_PARAMETERS設定要求,且已清除NDIS_RSS_PARAM_FLAG_DISABLE_RSS旗標,則迷你埠驅動程式在初始化迷你埠配接器之後第一次收到OID_GEN_RECEIVE_SCALE_PARAMETERS設定要求之後,所有參數都應該具有相同的值。
過度配置驅動程式可以使用 OID_GEN_RECEIVE_HASH OID,在接收的畫面格上啟用和設定哈希計算,而不需要啟用 RSS。 過度配置驅動程式也可以查詢此 OID 以取得目前的接收哈希設定。
OID_GEN_RECEIVE_HASH OID 的信息緩衝區包含NDIS_RECEIVE_HASH_PARAMETERS結構的指標。 針對集合要求,OID 會指定迷你埠配接器應該使用的哈希參數。 對於查詢要求,OID 會傳回迷你埠配接器所使用的哈希參數。 此 OID 對於支援 RSS 的驅動程式而言是選擇性的。
注意 如果啟用接收哈希計算,NDIS 會在啟用 RSS 之前停用接收哈希計算。 如果啟用 RSS,NDIS 會在啟用接收哈希計算之前停用 RSS。
迷你埠驅動程序支援的所有迷你埠配接器,都必須為所有後續的通訊協議系結提供相同的哈希組態設定。 此 OID 也包含迷你埠驅動程式或 NIC 必須用於哈希計算的秘密密鑰。 索引鍵長度為 320 位(40 個字節),而且可以包含過度配置驅動程式選擇的任何數據,例如,隨機的位元組數據流。
若要重新平衡處理負載,過度配置驅動程式可以設定 RSS 參數並修改間接取值數據表。 一般而言,除了間接數據表之外,所有參數都會保持不變。 不過,在 RSS 初始化之後,過度的驅動程式可能會變更其他 RSS 初始化參數。 如有必要,迷你埠驅動程式可以重設 NIC 硬體,以變更哈希函式、哈希秘密密鑰、哈希類型、基底 CPU 編號,或用來編製間接數據表索引的位數。
注意 過度的驅動程式可以隨時設定這些參數。 這可能會造成順序不足的接收指示。 不支援 TCP 的迷你埠驅動程式不需要清除此實例中的接收佇列。
下圖提供兩個間接值數據表實例的範例內容。
上圖假設有四個處理器組態,而哈希值中使用的最小有效位數目為6位。 因此,間接數據表包含64個專案。
在圖中,數據表 A 會在初始化后立即列出間接值數據表中的值。 之後,隨著一般流量負載的變化,處理器負載會變得不平衡。 過度配置驅動程式會偵測不平衡的狀況,並嘗試藉由定義新的間接分析數據表來重新平衡負載。 表 B 會列出新的間接值數據表值。 在數據表 B 中,部分來自 CPU 2 的負載會移至 CPU 1 和 3。
注意 當間接數據表變更時,短時間內(處理目前的接收描述元佇列時),封包可以在錯誤的 CPU 上處理。 這是一般暫時性狀況。
間接數據表的大小通常是系統中處理器數目的兩到八倍。
當迷你埠驅動程式將封包散發至 CPU 時,如果 CPU 太多,則散發負載所花費的工作可能會變得令人禁止。 在此情況下,過度配置驅動程式應該選擇CPU子集,以處理網路數據。
在某些情況下,可用的硬體接收佇列數目可能小於系統上的 CPU 數目。 迷你埠驅動程序必須檢查間接數據表,以判斷要與硬體佇列相關聯的 CPU 號碼。 如果間接分配數據表中顯示的不同 CPU 數字總數大於 NIC 支援的硬體佇列數目,迷你埠驅動程式必須從間接分配數據表挑選 CPU 號碼的子集。 子集的數目等於硬體佇列的數目。 迷你埠驅動程式已從 OID_GEN_RECEIVE_SCALE_PARAMETERS 取得 IndirectionTableSize 參數。 迷你埠驅動程式指定 NumberOfReceiveQueues 值,以回應OID_GEN_RECEIVE_SCALE_CAPABILITIES。