다음을 통해 공유


수신측 크기 조정 버전 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_V2 및 OID_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당 총 IT 수는 VMQ 모드의 NumberOfIndirectionTableEntriesPerNonDefaultPFVPort 또는 NumberOfIndirectionTableEntriesForDefaultVPort 또는 Native RSS의 경우 128을 초과할 수 없습니다. NumberOfIndirectionTableEntriesPerNonDefaultPFVPortNumberOfIndirectionTableEntriesForDefaultVPort는 NDIS_NIC_SWITCH_CAPABILITIES 구조체의 멤버입니다.
크기 조정 모드 런타임에 IT가 처리되는 방식을 제어하는 VPort별 vmswitch 정책입니다. 정적(부하 변경으로 인해 ITE 이동 없음) 또는 동적(현재 트래픽 부하에 따라 확장 및 병합)일 수 있습니다.
Queue ITE를 백업하는 기본 하드웨어 개체(큐)입니다. 하드웨어 및 간접 참조 테이블에 따라 구성 큐는 여러 IT를 백업할 수 있습니다. 기본 큐에서 사용되는 큐를 포함하여 총 큐 수는 관리자가 일반적으로 설정한 미리 구성된 제한을 초과할 수 없습니다.
기본 프로세서 해시를 계산할 수 없는 패킷을 수신하는 프로세서입니다. 각 VPort에는 기본 프로세서가 있습니다.
기본 프로세서 VPort를 만드는 동안 NDIS_NIC_SWITCH_VPORT_PARAMETERS 구조체의 ProcessorAffinity 멤버로 지정된 프로세서입니다. 이 프로세서는 런타임에 업데이트할 수 있으며 VMQ 트래픽이 전달되는 위치를 지정합니다.
원본 CPU ITE가 현재 매핑된 프로세서입니다.
대상 CPU ITE가 다시 매핑되는 프로세서입니다(RSSv2 사용).
행위자 CPU RSSv2 요청이 이루어지는 프로세서입니다.

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

미니포트 드라이버는 NDIS_RECEIVE_SCALE_CAPABILITIES 구조체의 CapabilitiesFlags 멤버를 NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE 플래그로 설정하여 RSSv2 지원을 보급합니다. 이 기능은 RSSv2의 CPU 부하 분산 기능과 기본이 아닌 VPort(VMQ)에 RSSv1 동적 분산을 사용하도록 설정하는 NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED 플래그를 사용하도록 설정하는 데 필요합니다.

참고 항목

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

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

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

  • OID_GEN_RECEIVE_SCALE_PARAMETERS RSSv2의 쿼리 요청에만 사용되며 RSS 매개 변수 설정에는 사용되지 않습니다.
  • OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 큐 수, IT 수, RSS 사용/사용 안 함 및 해시 키 업데이트와 같은 크기 조정 엔터티의 매개 변수를 구성하는 데 사용되는 쿼리 및 Set OID입니다.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES 간접 참조 테이블 항목의 수정을 수행하는 데 사용되는 메서드 OID입니다.

RSSv2 OID 처리

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

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 일반 OID이며 OID_GEN_RECEIVE_SCALE_PARAMETERS OID가 RSSv1에서 처리된 것과 동일하게 처리됩니다. 이 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를 시작하는 함수
미니 MiniportSynchronousOidRequest 해당 없음
필터 NdisFSynchronousOidRequest
프로토콜 해당 없음 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를 만드는 동안 지정된 선호도 프로세서를 사용하여 초기화됩니다.
  • NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR 플래그가 설정된 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를사용하여 업데이트할 수 있습니다.
  • NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED 플래그 집합과 함께 OID_NIC_SWITCH_VPORT_PARAMETERS OID를 사용하여 업데이트할 수 있습니다(기존 cmdlet의 호환성 경로).
  • NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED 플래그와 함께 OID_NIC_SWITCH_VPORT_PARAMETERS OID를 사용하여 읽을 수 있습니다(기존 cmdlet의 호환성 경로).
  • 기본 프로세서의 초기화 후 이동은 기본 프로세서 또는 간접 참조 테이블의 내용에 영향을 미치지 않습니다.
기본 프로세서
  • VPort를 만드는 동안 지정된 선호도 프로세서를 사용하여 초기화됩니다.
  • NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR 플래그가 설정된 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를사용하여 업데이트할 수 있습니다.
간접 참조 테이블
  • NumberOfIndirectionTableEntries는 1설정됩니다.
  • 유일한 항목은 VPort를 만드는 동안 지정된 선호도 프로세서를 사용하여 초기화됩니다.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID를 사용하여 업데이트할 수 있습니다.

IT에 대한 업데이트 기본/기본 프로세서(OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES 사용)는 해당 항목이 현재 가리키는 프로세서에서 호출됩니다. 지정된 VPort의 경우 상층 계층은 이러한 상황에서 IT를 이동하거나 기본/기본 프로세서를 설정하는 OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID가 발급되지 않도록 합니다.

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

RSS 사용 안 함

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

RSSv2 기본 먼저 RSS를 사용하지 않도록 설정하지 않고 상위 계층 프로토콜이 VPort를 삭제할 수 있도록 하는 RSSv1의 요구 사항을 충족합니다. 상층 계층은 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 요청 인터페이스