다음을 통해 공유


수신측 크기 조정 버전 2(RSSv2)

수신측 크기 조정은 다중 프로세서 시스템의 네트워크 데이터 처리와 관련된 시스템 성능을 향상시킵니다. NDIS 6.80 이상은 RSS 버전 2(RSSv2)를 지원하며, 이는 동적 VPort당 큐 분산을 제공하여 RSS를 확장합니다.

개요

RSSv1에 비해 RSSv2는 CPU 로드 측정과 간접 참조 테이블 업데이트 사이의 시간을 단축하여 트래픽이 많은 상황에서 속도가 느려지는 것을 방지합니다. 이를 위해 RSSv2는 요청을 처리하는 프로세서 컨텍스트에서 IRQL = DISPATCH_LEVEL 해당 작업을 수행하고 현재 프로세서를 가리키는 간접 참조 테이블 항목의 하위 집합에서만 작동합니다. 즉, RSSv2는 RSSv1보다 응답성이 훨씬 뛰어난 여러 프로세서에 수신 큐를 동적으로 분산할 수 있습니다.

미니포트 드라이버가 적절한 RSS 기능을 설정하고 간접 참조 테이블을 제어하기 위해 RSSv2에 OID_GEN_RECEIVE_SCALE_PARAMETERS_V2OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES두 개의 OID가 도입되었습니다. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2는 일반 OID이지만, OID_GEN_RSS_SET_INDIRECTION_ENTRIES는 NDIS_STATUS_PENDING을 반환할 수 없는 동기 OID입니다. 이러한 OID에 대한 자세한 내용은 개별 참조 페이지를 참조하세요. 동기 OID에 대한 자세한 내용은 NDIS 6.80 동기 OID 요청 인터페이스를 참조하세요.

RSSv2 용어

이 문서에서는 다음 용어를 사용합니다.

학기 정의
RSSv1 1세대 수신 측 크기 조정 메커니즘입니다. OID_GEN_RECEIVE_SCALE_PARAMETERS를 사용합니다.
RSSv2 이 문서에 설명된 Windows 10 버전 1803 이상에서 지원되는 2세대 수신 쪽 크기 조정 메커니즘입니다.
엔터티 크기 조정 네이티브 RSS 모드의 미니포트 어댑터 자체 또는 RSSv2 모드의 VPort입니다.
ITE 지정된 스케일링 엔티티의 간접 참조 테이블 항목(ITE)입니다. VPort당 총 ITE 수는 VMQ 모드에서 NumberOfIndirectionTableEntriesPerNonDefaultPFVPort, NumberOfIndirectionTableEntriesForDefaultVPort, 또는 Native RSS 사례에서 128을 초과할 수 없습니다. NumberOfIndirectionTableEntriesPerNonDefaultPFVPortNumberOfIndirectionTableEntriesForDefaultVPortNDIS_NIC_SWITCH_CAPABILITIES 구조체의 멤버입니다.
크기 조정 모드 런타임에 ITE가 처리되는 방식을 제어하는 VPort별 vmswitch 정책입니다. 정적(부하 변경으로 인해 ITE 이동 없음) 또는 동적(현재 트래픽 부하에 따라 확장 및 병합)일 수 있습니다.
ITE를 백업하는 기본 하드웨어 개체(큐)입니다. 하드웨어 및 간접 참조 테이블에 따라 구성 큐는 여러 IT를 백업할 수 있습니다. 기본 큐에서 사용되는 큐를 포함하여 총 큐 수는 관리자가 일반적으로 설정한 미리 구성된 제한을 초과할 수 없습니다.
기본 프로세서 해시를 계산할 수 없는 패킷을 수신하는 프로세서입니다. 각 VPort에는 기본 프로세서가 있습니다.
기본 프로세서 VPort를 생성할 때 NDIS_NIC_SWITCH_VPORT_PARAMETERS 구조체의 ProcessorAffinity 멤버로 지정된 프로세서입니다. 이 프로세서는 런타임에 업데이트할 수 있으며 VMQ 트래픽이 전달되는 위치를 지정합니다.
원본 CPU ITE가 현재 매핑되어 있는 프로세서.
목표 CPU ITE가 다시 매핑되는 프로세서입니다(RSSv2 사용).
행위자 CPU RSSv2 요청이 이루어지는 프로세서입니다.

미니포트 드라이버에서 RSSv2 기능 광고

미니포트 드라이버는 RSSv2 지원을 알리기 위해 NDIS_RECEIVE_SCALE_CAPABILITIES 구조체의 CapabilitiesFlags 멤버를 NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE 플래그로 설정합니다. 이 기능은 RSSv2의 CPU 부하 분산 기능을 사용하도록 설정하는 데 필요하며, 기본이 아닌 VPort(VMQ)에 대해 RSSv1 동적 분산을 가능하게 하는 NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED 플래그와 함께 사용됩니다.

메모

상위 계층 프로토콜에서는 RSSv2 미니포트 드라이버에 대해 기본 VPort의 기본 프로세서를 이동할 수 있다고 가정합니다.

미니포트 어댑터가 RSSv2 기능을 보급하지 않는 경우 이러한 VPort가 동적 분산을 수행하도록 요청된 경우에도 모든 VMQ 지원 VPort는 정적 분산 모드로 유지됩니다. 정적 분산 모드에 있는 이러한 VPort에 사용되는 RSS 매개변수 구성을 위한 RSSv1 OID는 OID_GEN_RECEIVE_SCALE_PARAMETERS입니다.

미니포트 드라이버는 RSSv1 또는 RSSv2 중 하나의 RSS 제어 메커니즘만 구현하면 됩니다. 드라이버가 RSSv2 지원을 보급하는 경우 NDIS는 VPort별 확산을 구성하기 위해 필요한 경우 RSSv1 OD를 RSSv2 OD로 변환합니다. 미니포트 드라이버는 다음과 같이 두 개의 새 OID를 지원하고 RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID의 동작을 수정해야 합니다.

RSSv2 OID 처리

OID_GEN_RECEIVE_SCALE_PARAMETERS 지정된 크기 조정 엔터티의 현재 RSS 매개 변수를 쿼리하는 데만 사용됩니다. RSSv1에서 이 OID는 매개 변수를 설정하는 데 사용됩니다. RSSv2 지원 미니포트 드라이버의 경우 NDIS는 드라이버에 대해 이 역할 변환을 자동으로 수행하고 대신 매개 변수를 설정하기 위해 다음 두 개의 OID를 실행합니다.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 일반 OID이며 RSSv1에서 처리된 OID_GEN_RECEIVE_SCALE_PARAMETERS OID와 동일하게 처리됩니다. 이 OID는 NDIS 6.80 이전에는 NDIS LWF(경량 필터 드라이버)에 표시되지 않습니다.

그러나 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES은 NDIS_STATUS_PENDING을 반환할 수 없는 동기화된 OID입니다. 이 OID는 OID를 시작한 프로세서 컨텍스트에서 실행되고 완료되어야 합니다. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2와 마찬가지로, NDIS 6.80 이전에는 NDIS LWF에 표시되지 않습니다. NDIS 6.80 이상의 LWF는 이 OID를 지연하거나 다른 프로세서로 이동할 수 없습니다. 해당 페이로드에는 크기 조정 엔터티에 대한 단일 ITE를 다른 대상 CPU로 이동하는 명령이 포함된 간단한 "ITE 이동" 작업 배열이 포함되어 있습니다. 배열의 요소는 다른 크기 조정 엔터티(VPorts)를 참조할 수 있습니다.

각 유형의 NDIS 드라이버, 미니포트, 필터 및 프로토콜에는 동기 OID 요청 인터페이스를 지원하는 진입점이 있습니다.

NDIS 드라이버 유형 동기 OID 처리기 동기 OID를 시작하는 함수
미니포트(Miniport) MiniportSynchronousOidRequest 해당 없음
필터 NdisFSynchronousOidRequest
프로토콜 해당 없음(N/A) NdisSynchronousOidRequest

RSS 상태 전환, ITE 업데이트 및 기본/기본 프로세서

조향 매개 변수

RSSv2에서는 RSS 상태(사용 또는 사용 안 함)에 따라 트래픽을 올바른 CPU로 조정하는 데 다른 매개 변수가 사용됩니다. RSS를 사용하지 않도록 설정하면 기본 프로세서만 트래픽을 지시하는 데 사용됩니다. RSS를 사용하도록 설정하면 기본 프로세서와 모든 IT가 모두 트래픽을 지시하는 데 사용됩니다. 이러한 조향 매개 변수 다음 표에 요약된 "활성" 또는 "비활성"으로 레이블이 지정됩니다.

스티어링 매개 변수 RSS 사용 안 함 RSS 사용
기본 프로세서 활동적인 비활성
기본 프로세서 비활성 활동적인
ITE[0..N] 비활성 활동적인

조정 매개 변수가 활성 상태일 때, 트래픽을 조정합니다. 매개 변수를 비활성 RSS 상태 전환의 순간부터 미니포트 드라이버는 역방향 전환이 다시 활성화될 때까지 매개 변수의 변경 내용을 추적해야 합니다. 즉, 미니포트 드라이버는 해당 크기 조정 엔터티에 대해 RSS를 사용하지 않도록 설정된 동안 기본 프로세서 및 간접 참조 테이블 항목에 대한 모든 업데이트를 추적해야 합니다. RSS를 사용하도록 설정하면 기본 프로세서 및 간접 참조 테이블에 대해 현재 추적된 상태가 적용됩니다.

예를 들어 소프트웨어 vRSS가 이미 사용하도록 설정된 시나리오를 고려해 보세요. 이 경우 간접 참조 테이블은 이미 상층 프로토콜에 존재하며 상위 계층의 소프트웨어 확산 코드에서 적극적으로 사용됩니다. 하드웨어 RSS를 사용하도록 설정하는 동안, 모든 항목이 로의 업데이트가를 이동시키기 전에 주 프로세서를 가리키기 시작하면 간접 참조 테이블 항목이 하드웨어에서 실행되고, 이로 인해 주 프로세서가 잠시 지연될 수 있습니다. 미니포트 드라이버가 기본 프로세서 및 ITE 정보를 추적한 경우 트래픽을 상위 계층에서 이미 예상한 위치로 보낼 수 있습니다.

미니포트 드라이버는 비활성 조향 매개 변수에 대한 모든 업데이트를 추적해야 하지만, 이러한 매개 변수가 활성상태가 되도록 RSS 상태 변경을 시도할 때까지 해당 매개 변수의 유효성 검사를 연기해야 합니다. 예를 들어 하드웨어 RSS를 사용하지 않도록 설정하는 동안 소프트웨어 확산의 경우 상층 프로토콜은 어댑터의 RSS 집합 외부를 포함하여 확산을 위해 모든 프로세서를 사용할 수 있습니다. 상위 계층은 RSS 상태 전환 시 모든 비활성 매개 변수가 새 RSS 상태에 대해 유효한지 확인합니다. 그러나 추적된 비활성 조향 매개 변수가 유효하지 않은 것으로 확인되면 미니포트 드라이버는 여전히 매개 변수의 유효성을 검사하고 RSS 상태 전환에 실패해야 합니다.

조향 매개 변수에 대한 초기 상태 및 업데이트

다음 표에서는 생성 후(예: VPort 생성 후) 크기 조정 엔터티의 초기 상태와 매개 변수를 업데이트하는 방법에 대해 설명합니다.

매개 변수 묘사
기본 프로세서
  • VPort를 만드는 동안 지정된 선호도 프로세서를 사용하여 초기화됩니다.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를 NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR 플래그가 설정된 상태로 업데이트할 수 있습니다.
  • NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED 플래그가 설정된 OID_NIC_SWITCH_VPORT_PARAMETERS OID를 사용하여 업데이트할 수 있습니다(기존 cmdlet의 호환성 경로).
  • OID_NIC_SWITCH_VPORT_PARAMETERS OID를 사용하여 읽을 수 있으며, NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED 플래그와 함께 사용하면 기존 cmdlet의 호환을 위한 경로로 사용됩니다.
  • 기본 프로세서의 초기화 후 이동은 기본 프로세서 또는 간접 참조 테이블의 내용에 영향을 주지 않습니다.
기본 프로세서
  • VPort를 만드는 동안 지정된 선호도 프로세서를 사용하여 초기화됩니다.
  • 설정된 NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR 플래그를 사용하여 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID로 업데이트할 수 있습니다.
간접 참조 테이블
  • NumberOfIndirectionTableEntries1으로 설정됩니다.
  • 유일한 항목은 VPort 생성 시 지정된 어피니티 프로세서로 초기화됩니다.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를 사용하여 업데이트할 수 있습니다.

ITE 및 주요/기본 프로세서(OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES 사용)에 대한 업데이트는 해당 항목이 현재 가리키는 프로세서에서 수행됩니다. 지정된 VPort의 경우 상위 계층은 다음 상황에서 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를 통해 ITE를 이동하거나 주/기본 프로세서를 설정하지 않도록 보장합니다.

  1. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 진행 중입니다.
  2. VPort 삭제 시퀀스가 시작된 후 예를 들어, 상위 계층은 ITE를 이동하기 위한 마지막 OID가 완료된 후에만 필터 설정 OID를 발급합니다.

RSS 사용 안 함

RSS를 사용하지 않도록 설정하는 동안 상층 프로토콜은 모든 IT를 기본 프로세서로 가리키도록 선택한 다음 OID를 실행하여 RSS를 사용하지 않도록 설정하거나 간접 참조 테이블을 as-is 그대로 두고 RSS를 사용하지 않도록 선택할 수 있습니다. 두 경우 모두 수신 트래픽은 기본 프로세서를 대상으로 해야 합니다.

RSSv2는 RSSv1에서 가져온 요구 사항을 유지하여 상위 계층 프로토콜이 먼저 RSS를 비활성화하지 않고 VPort를 삭제할 수 있도록 합니다. 상층 계층은 VPort의 수신 필터를 0으로 설정하여 수신 트래픽이 VPort를 통해 흐르지 않도록 한 다음 RSS를 사용하지 않도록 설정하지 않고 VPort 삭제를 진행할 수 있습니다. 상층 계층은 VPort 삭제 중 또는 이후에 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID가 발급되지 않음을 보장합니다.

RSS 비활성화 및 VPort 삭제 중에 미니포트 드라이버는 이전 큐 이동으로 인해 존재할 수 있는 보류 중인 내부 작업을 처리해야 합니다.

RSSv2 불변성

상위 계층 프로토콜은 관리 함수 혹은 ITE 이동을 수행하기 전에 중요한 불변성을 위반하지 않도록 보장합니다. 예를 들어:

  1. 큐 수를 줄이기 전에 상위 계층은 간접 참조 테이블이 VPort에 대한 새 큐 수보다 더 많은 프로세서를 참조하지 않도록 합니다.
  2. 상위 계층은 VPort에 대해 현재 구성된 큐 수를 위반하는 간접 참조 테이블 업데이트를 요청해서는 안 됩니다. 미니포트 드라이버는 이 규칙을 적용하고 오류를 반환해야 합니다.
  3. VMMQ-RESTRICTED 어댑터에 대한 간접 참조 테이블 항목 수를 변경하기 전에 상층 계층은 간접 참조 테이블의 내용이 2의 전원으로 정규화되도록 합니다.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

NDIS 6.80에서의 OID 요청의 동기 인터페이스