Terima Penskalan Sisi Versi 2 (RSSv2)

Penskalaan Sisi Penerimaan meningkatkan performa sistem yang terkait dengan penanganan data jaringan pada sistem multiprosektor. NDIS 6.80 dan yang lebih baru mendukung RSS Versi 2 (RSSv2), yang memperluas RSS dengan menawarkan penyebaran antrean per VPort yang dinamis.

Gambaran Umum

Dibandingkan dengan RSSv1, RSSv2 mempersingkat waktu antara pengukuran beban CPU dan memperbarui tabel tidak langsung. Ini menghindari perlambatan selama situasi lalu lintas tinggi. Untuk mencapai hal ini, RSSv2 melakukan tindakannya di IRQL = DISPATCH_LEVEL, dalam konteks prosesor penanganan permintaan, dan hanya beroperasi pada subset entri tabel tidak langsung yang menunjuk ke prosesor saat ini. Ini berarti bahwa RSSv2 dapat secara dinamis menyebar menerima antrean melalui beberapa prosesor jauh lebih responsif daripada RSSv1.

Dua OID, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 dan OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, telah diperkenalkan di RSSv2 untuk driver miniport untuk mengatur kemampuan RSS yang tepat dan mengontrol tabel tidak langsung masing-masing. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 adalah OID Reguler, sementara OID_GEN_RSS_SET_INDIRECTION_ENTRIES adalah OID Sinkron yang tidak dapat mengembalikan NDIS_STATUS_PENDING. Untuk informasi selengkapnya tentang OID ini, lihat halaman referensi individualnya. Untuk informasi selengkapnya tentang OID Sinkron, lihat Antarmuka permintaan OID sinkron di NDIS 6.80.

Terminologi RSSv2

Topik ini menggunakan istilah berikut:

Persyaratan Definisi
RSSv1 Generasi pertama menerima mekanisme penskalakan samping. Menggunakan OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Generasi kedua menerima mekanisme penskalakan sisi yang didukung dalam Windows 10, versi 1803 dan yang lebih baru, yang dijelaskan dalam topik ini.
Entitas penskalakan Adaptor miniport itu sendiri dalam mode RSS Asli, atau VPort dalam mode RSSv2.
ITE Entri tabel tidak langsung (ITE) dari entitas penskalaan tertentu. Jumlah total ITEs per VPort tidak boleh melebihi NumberOfIndirectionTableEntriesPerNonDefaultPFVPort atau NumberOfIndirectionTableEntriesForDefaultVPort dalam mode VMQ atau 128 dalam kasus RSS Asli. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort dan NumberOfIndirectionTableEntriesForDefaultVPort adalah anggota struktur NDIS_NIC_SWITCH_CAPABILITIES .
Mode penskalakan Kebijakan vmswitch per VPort yang mengontrol bagaimana ITE-nya ditangani pada runtime. Ini bisa statis (tidak ada pergerakan ITE karena perubahan beban) atau dianmik (ekspansi dan penggalian tergantung pada beban lalu lintas saat ini).
Antrean Objek perangkat keras (antrean) yang mendasar yang mendukung ITE. Bergantung pada perangkat keras dan tabel tidak langsung, antrean konfigurasi dapat mendukung beberapa ITEs. Jumlah total antrean, termasuk antrean yang digunakan oleh antrean default, tidak boleh melebihi batas yang telah dikonfigurasi sebelumnya yang biasanya ditetapkan oleh administrator.
Prosesor default Prosesor yang menerima paket yang hashnya tidak dapat dihitung. Setiap VPort memiliki prosesor default.
Prosesor utama Prosesor yang ditentukan sebagai anggota ProcessorAffinity dari struktur NDIS_NIC_SWITCH_VPORT_PARAMETERS selama pembuatan VPort. Prosesor ini dapat diperbarui pada runtime dan menentukan di mana lalu lintas VMQ diarahkan.
CPU sumber Prosesor tempat ITE saat ini dipetakan.
Target CPU Prosesor tempat ITE dipetakan ulang (menggunakan RSSv2).
Actor CPU Prosesor tempat permintaan RSSv2 dibuat.

Mengiklankan kemampuan RSSv2 dalam driver miniport

Driver miniport mengiklankan dukungan RSSv2 dengan mengatur anggota CapabilitiesFlags dari struktur NDIS_RECEIVE_SCALE_CAPABILITIES dengan bendera NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE . Kemampuan ini diperlukan untuk mengaktifkan fitur penyeimbangan beban CPU RSSv2, bersama dengan bendera NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED yang memungkinkan penyeimbangan dinamis RSSv1 untuk VPorts (VMQ) non-default.

Catatan

Protokol lapisan atas mengasumsikan bahwa prosesor utama VPort default dapat dipindahkan untuk driver miniport RSSv2.

Jika adaptor miniport tidak mengiklankan kemampuan RSSv2, semua VPort yang mendukung VMQ tetap dalam mode penyebaran statis meskipun VPort ini diminta untuk melakukan penyebaran dinamis. RSSv1 OID untuk konfigurasi parameter RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, digunakan untuk VPort ini yang masih dalam mode penyebaran statis.

Driver Miniport hanya perlu menerapkan satu mekanisme kontrol RSS - baik RSSv1 atau RSSv2. Jika driver mengiklankan dukungan RSSv2, NDIS akan mengonversi OID RSSv1 ke OID RSSv2 jika perlu untuk mengonfigurasi penyebaran per VPort. Driver miniport harus mendukung dua OID baru dan memodifikasi perilaku RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID sebagai berikut:

Menangani OID RSSv2

OID_GEN_RECEIVE_SCALE_PARAMETERS hanya digunakan untuk mengkueri parameter RSS saat ini dari entitas penskalaan tertentu. Di RSSv1, OID ini digunakan untuk mengatur parameter. Untuk driver miniport berkemampukan RSSv2, NDIS secara otomatis melakukan konversi peran ini untuk driver dan mengeluarkan dua OID berikut untuk mengatur parameter sebagai gantinya.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 adalah OID Reguler dan ditangani sama dengan OID OID_GEN_RECEIVE_SCALE_PARAMETERS ditangani di RSSv1. OID ini tidak terlihat oleh driver filter ringan (LWF) NDIS sebelum NDIS 6.80.

namun, OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES adalah OID Sinkron yang tidak dapat mengembalikan NDIS_STATUS_PENDING. OID ini harus dijalankan dan diselesaikan dalam konteks prosesor yang berasal dari OID. Seperti OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, itu juga tidak terlihat oleh LWF NDIS sebelum NDIS 6.80. LWF di NDIS 6.80 dan yang lebih baru tidak diizinkan untuk menunda OID ini atau pindah ke prosesor lain. Payload-nya berisi array tindakan "pindahkan ITE" sederhana, yang masing-masing berisi perintah untuk memindahkan satu ITE untuk entitas penskalaan ke CPU target yang berbeda. Elemen array dapat mereferensikan entitas penskalaan (VPorts) yang berbeda.

Setiap jenis driver NDIS, miniport, filter, dan protokol, memiliki titik masuk untuk mendukung antarmuka permintaan OID sinkron:

Jenis driver NDIS Handler OID sinkron Fungsi untuk memulai OID Sinkron
Miniport MiniportSynchronousOidRequest T/A
Filter NdisFSynchronousOidRequest
Protokol T/A NdisSynchronousOidRequest

Transisi status RSS, pembaruan ITE, dan prosesor primer/default

Parameter kemudi

Di RSSv2, parameter yang berbeda digunakan untuk mengarahkan lalu lintas ke CPU yang benar tergantung pada status RSS (diaktifkan atau dinonaktifkan). Ketika RSS dinonaktifkan, hanya prosesor utama yang digunakan untuk mengarahkan lalu lintas. Ketika RSS diaktifkan, prosesor default dan semua ITE digunakan untuk mengarahkan lalu lintas. Parameter kemudi ini diberi label sebagai "aktif" atau "tidak aktif", dirangkum dalam tabel berikut:

Parameter kemudi RSS dinonaktifkan RSS diaktifkan
Prosesor utama Aktif Tidak aktif
Prosesor default Tidak aktif Aktif
ITE[0..N] Tidak aktif Aktif

Ketika parameter kemudi dalam keadaan aktif , parameter tersebut mengarahkan lalu lintas. Sejak transisi status RSS yang membuat parameter tidak aktif, driver miniport harus melacak perubahan pada parameter hingga transisi terbalik mengaktifkannya lagi. Ini berarti bahwa driver miniport perlu melacak semua pembaruan ke entri tabel prosesor dan tidak langsung default saat RSS dinonaktifkan untuk entitas penskalaan tersebut. Ketika RSS diaktifkan, status terlacak saat ini untuk prosesor default dan tabel tidak langsung akan berlaku.

Misalnya, pertimbangkan skenario ketika perangkat lunak vRSS sudah diaktifkan. Dalam hal ini, tabel tidak langsung sudah ada dalam protokol lapisan atas dan secara aktif digunakan oleh kode penyebaran perangkat lunak lapisan atas. Jika, selama pengaktifan RSS perangkat keras, semua entri mulai menunjuk ke prosesor utama sebelum pembaruan untuk memindahkan entri tabel tidak langsung dikeluarkan ke dan dijalankan oleh perangkat keras, prosesor utama mungkin mengalami kemacetan singkat. Jika driver miniport telah melacak prosesor default dan informasi ITE, itu dapat mengarahkan lalu lintas ke tempat yang sudah diharapkan oleh lapisan atas.

Perhatikan bahwa sementara driver miniport harus melacak semua pembaruan ke parameter kemudi yang tidak aktif, mereka harus menunda validasi parameter tersebut sampai perubahan status RSS mencoba membuat parameter ini aktif. Misalnya, dalam kasus penyebaran perangkat lunak saat RSS perangkat keras dinonaktifkan, protokol lapisan atas dapat menggunakan prosesor apa pun untuk penyebaran (termasuk di luar set RSS adaptor). Lapisan atas memastikan bahwa, pada saat transisi status RSS, semua parameter yang tidak aktif valid untuk status RSS baru. Namun, dirver miniport masih harus memvalidasi parameter dan gagal transisi status RSS jika menemukan bahwa parameter kemudi tidak aktif yang dilacak tidak valid.

Status awal dan pembaruan untuk parameter kemudi

Tabel berikut menjelaskan status awal entitas penskalaan setelah pembuatan (misalnya, setelah pembuatan VPort), serta bagaimana parameter dapat diperbarui:

Parameter Deskripsi
Prosesor utama
  • Diinisialisasi dengan prosesor Afinitas yang ditentukan selama pembuatan VPort.
  • Dapat diperbarui menggunakan OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID dengan set bendera NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR .
  • Dapat diperbarui menggunakan OID_NIC_SWITCH_VPORT_PARAMETERS OID dengan set bendera NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (ini adalah jalur kompatibilitas untuk cmdlet yang ada).
  • Dapat dibaca menggunakan OID_NIC_SWITCH_VPORT_PARAMETERS OID dengan bendera NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (ini adalah jalur kompatibilitas untuk cmdlet yang ada).
  • Pemindahan pascainisialisasi prosesor utama tidak memengaruhi prosesor default atau konten tabel tidak langsung.
Prosesor default
  • Diinisialisasi dengan prosesor Afinitas yang ditentukan selama pembuatan VPort.
  • Dapat diperbarui menggunakan OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID dengan bendera NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR diatur.
Tabel tidak langsung
  • NumberOfIndirectionTableEntries diatur ke 1.
  • Satu-satunya entri diinisialisasi dengan prosesor Afinitas yang ditentukan selama pembuatan VPort.
  • Dapat diperbarui menggunakan OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID.

Updates ke ITE dan prosesor primer/default (menggunakan OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) dipanggil dari prosesor tempat entri yang sesuai saat ini menunjuk. Untuk VPort tertentu, lapisan atas memastikan bahwa tidak ada OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID untuk memindahkan ITEs atau mengatur prosesor primer/default yang akan dikeluarkan dalam keadaan ini:

  1. Saat OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 sedang berlangsung.
  2. Setelah urutan penghapusan VPort dimulai. Misalnya, lapisan atas mengeluarkan OID filter yang ditetapkan hanya setelah OID terakhir untuk memindahkan ITE selesai.

Penonaktifan RSS

Selama penonaktifan RSS, protokol lapisan atas mungkin memilih untuk mengarahkan semua ITE ke prosesor utama, lalu mengeluarkan OID untuk menonaktifkan RSS, atau mungkin memilih untuk membiarkan tabel tidak langsung apa adanya dan menonaktifkan RSS. Dalam kedua kasus, lalu lintas terima harus menargetkan prosesor utama.

RSSv2 mempertahankan persyaratan dari RSSv1 yang mengizinkan protokol lapisan atas untuk menghapus VPort tanpa terlebih dahulu menonaktifkan RSS. Lapisan atas dapat mengatur filter terima pada VPort ke nol, sehingga memastikan bahwa tidak ada arus lalu lintas yang diterima melalui VPort, lalu melanjutkan penghapusan VPort tanpa menonaktifkan RSS. Lapisan atas menjamin bahwa tidak ada OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES yang akan dikeluarkan selama atau setelah penghapusan VPort.

Selama penonaktifan RSS dan penghapusan VPort, driver miniport harus mengurus operasi internal yang tertunda yang mungkin ada karena pemindahan antrean sebelumnya.

Invarian RSSv2

Protokol lapisan atas memastikan bahwa invarian penting tidak dilanggar sebelum melakukan fungsi manajemen atau pemindahan ITE. Contohnya:

  1. Sebelum mengurangi jumlah antrean, lapisan atas memastikan bahwa tabel tidak langsung tidak mereferensikan lebih banyak prosesor daripada jumlah antrean baru untuk VPort.
  2. Lapisan atas tidak boleh meminta pembaruan tabel tidak langsung yang melanggar jumlah antrean yang saat ini dikonfigurasi untuk VPort. Driver miniport harus memberlakukan ini dan mengembalikan kegagalan.
  3. Sebelum mengubah jumlah entri tabel tidak langsung untuk adaptor VMMQ-RESTRICTED, lapisan atas memastikan bahwa konten tabel tidak langsung dinormalisasi ke daya 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Antarmuka permintaan OID sinkron di NDIS 6.80