Receive-Side Scaling (이하 RSS)는 멀티프로세서 시스템에서 여러 개의 CPU를 이용하여 네트워크 수신 처리 부담을 효율적으로 분산하는 기법입니다. 참고: 하이퍼스레드 CPU같은 경우 같은 실행 엔진을 공유하기 때문에 멀티 코어랑 같은 효과가 나지 않습니다. 이 때문에 하이퍼스레드 CPU는 지원하지 않습니다.
수신 데이터를 효율적으로 처리하기 위해서, 미니포트 드라이버는 인터럽트 서비스 함수에서 DPC를 예약합니다. RSS를 안 쓴다면 DPC가 호출될 때 해당 DPC 내에서 수신한 데이터를 모두 처리하게 됩니다. 그런고로 원래는 처음 인터럽트 받은 CPU에서 수신 처리를 전부 하게 되어있습니다.
RSS를 사용하는 경우, NIC와 미니포트 드라이버는 다른 프로세서로 수신 처리하는 DPC를 떠넘길 수 있습니다. 특정 연결에 CPU를 할당해서 처리하는 것도 가능합니다. NIC는 해시 함수를 구현하고, 이 함수의 실행 결과로 나온 해시값을 사용해서 CPU를 고르게 됩니다. 정확히 말하자면 해시값의 LSB를 뽑아서 Indirection 테이블의 엔트리를 선택하고, 엔트리 값에 따라 CPU를 선택하는 것입니다.
이렇게 되면 아래와 같은 성능 개선 효과가 있습니다:
- 단일 NIC의 수신 처리를 여러 개의 CPU로 분산하면서 처리 지연 시간을 줄입니다. 다른 CPU가 놀고 있고 한 CPU만 죽어라 노가다하는 상황을 방지할 수 있습니다.
- 가급적 공유하는 데이터는 같은 CPU에서 실행할 수 있도록 해서 스핀락 오버헤드를 줄입니다.
- 가급적 공유하는 데이터는 같은 CPU에서 실행할 수 있도록 해서 캐시나 다른 리소스의 리로딩을 줄입니다.
RSS 하드웨어 지원은 3가지로 나뉩니다.
MSI는 Message-signaled interrupt의 약자로, 비스타는 PCI V2.2 MSI와 PCI V3.0 MSI-X를 지원합니다. MSI-X를 지원하는 미니포트 드라이버라면 interrupt affinity도 지정 가능합니다.