Menerima Penskalakan Sisi Versi 2 (RSSv2)
Penskalaan Sisi Penerimaan meningkatkan performa sistem yang terkait dengan penanganan data jaringan pada sistem multiprosem. 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:
Term | Definisi |
---|---|
RSSv1 | Generasi pertama menerima mekanisme penskalakan sisi. Menggunakan OID_GEN_RECEIVE_SCALE_PARAMETERS. |
RSSv2 | Generasi kedua menerima mekanisme penskalakan sisi yang didukung di 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 dapat 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 dinamis (ekspansi dan coalescing 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 yang digunakan oleh antrean default, tidak dapat 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 sedang dipetakan ulang (menggunakan RSSv2). |
Aktor 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 didukung 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:
- OID_GEN_RECEIVE_SCALE_PARAMETERS hanya digunakan untuk permintaan Kueri di RSSv2 dan bukan untuk mengatur parameter RSS.
- OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 adalah Kueri dan Set OID yang digunakan untuk mengonfigurasi parameter entitas penskalaan seperti jumlah antrean, jumlah ITEs, pengaktifan/penonaktifan RSS, dan pembaruan kunci hash.
- OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES adalah Metode OID yang digunakan untuk melakukan modifikasi entri tabel tidak langsung.
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). Saat 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 prosesor default dan tabel tidak langsung 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 saat 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 untuk parameter kemudi yang tidak aktif, mereka harus menunda validasi parameter tersebut hingga upaya perubahan status RSS untuk 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, driver 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 |
|
Prosesor default |
|
Tabel tidak langsung |
|
Pembaruan pada ITEs 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:
- Saat OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 sedang berlangsung.
- Setelah urutan penghapusan VPort dimulai. Misalnya, lapisan atas mengeluarkan OID filter yang ditetapkan hanya setelah OID terakhir untuk memindahkan ITEs 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 penerima 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:
- Sebelum mengurangi jumlah antrean, lapisan atas memastikan bahwa tabel tidak langsung tidak mereferensikan lebih banyak prosesor daripada jumlah antrean baru untuk VPort.
- 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.
- Sebelum mengubah jumlah entri tabel tidak langsung untuk adaptor VMMQ-RESTRICTED, lapisan atas memastikan bahwa konten tabel tidak langsung dinormalisasi ke daya 2.
Tautan terkait
OID_GEN_RECEIVE_SCALE_PARAMETERS_V2