Udostępnij przez


Wydajność w sterownikach sieciowych

Minimalizacja długości ścieżki wysyłania i odbierania

Mimo że ścieżki wysyłania i odbierania różnią się od sterownika do sterownika, istnieją pewne ogólne reguły optymalizacji wydajności:

  • Optymalizuj pod kątem typowych ścieżek. Narzędzie Kernprof.exe jest dostarczane z wersjami deweloperskimi i IDW systemu Windows, które wyodrębnia potrzebne informacje. Deweloper powinien przyjrzeć się procedurom, które zużywają najwięcej cykli procesora CPU, i próbować zmniejszyć częstotliwość wywoływanych procedur lub czasu spędzonego w tych rutynach.

  • Zredukuj czas spędzony w DPC, aby sterownik karty sieciowej nie wykorzystywał nadmiernych zasobów systemowych, co mogłoby obniżyć ogólną wydajność systemu.

  • Upewnij się, że kod debugowania nie został skompilowany w ostatecznej wersji sterownika; Pozwala to uniknąć wykonywania nadmiarowego kodu.

Partycjonowanie danych i kodu w celu zminimalizowania udostępniania między procesorami

Partycjonowanie jest potrzebne do zminimalizowania udostępnionych danych i kodu między procesorami. Partycjonowanie pomaga zmniejszyć wykorzystanie magistrali systemu i zwiększyć efektywność pamięci podręcznej procesora. Aby zminimalizować udostępnianie, autorzy sterowników powinni rozważyć następujące kwestie:

  • Zaimplementuj sterownik jako zdezserializowany miniport, zgodnie z opisem w sekcji Deserialized NDIS Miniport Drivers.

  • Aby zmniejszyć dostęp do danych globalnych i udostępnionych, używaj struktur danych na procesor. Dzięki temu można zachować liczniki statystyk bez synchronizacji, co zmniejsza długość ścieżki kodu i zwiększa wydajność. W przypadku istotnych statystyk należy użyć liczników przypisanych do każdego procesora, które są sumowane w momencie wykonywania zapytania. Jeśli musisz mieć licznik globalny, użyj operacji połączonych zamiast blokad spin, aby manipulować licznikiem. Zobacz Używanie mechanizmów blokowania poprawnie poniżej, aby uzyskać informacje na temat unikania używania blokad spin.

    Aby to ułatwić, można użyć KeGetCurrentProcessorNumberEx do określenia bieżącego procesora. Aby określić liczbę procesorów podczas przydzielania struktur danych dla procesora, można użyć KeQueryGroupAffinity.

    Całkowita liczba bitów ustawionych w masce koligacji wskazuje liczbę aktywnych procesorów w systemie. Sterowniki nie powinny zakładać, że wszystkie ustawione bity w masce będą ciągłe, ponieważ procesory mogą nie być kolejno numerowane w przyszłych wersjach systemu operacyjnego. Liczba procesorów na maszynie SMP jest wartością zerową.

    Jeśli sterownik utrzymuje dane procesora, możesz użyć funkcji KeQueryGroupAffinity, aby zmniejszyć rywalizację o wiersz pamięci podręcznej.

Unikanie fałszywego współdzielenia

False sharing występuje, gdy procesory żądają zmiennych współdzielonych, które są niezależne od siebie. Jednak ponieważ zmienne znajdują się w tym samym wierszu pamięci podręcznej, są one współużytkowane przez procesory. W takich sytuacjach linia pamięci podręcznej będzie przemieszczać się tam i z powrotem między procesorami przy każdym dostępie do dowolnej z dostępnych zmiennych, co powoduje wzrost czyszczeń pamięci podręcznej i załadowań. Zwiększa to wykorzystanie magistrali systemowej i zmniejsza ogólną wydajność systemu.

pl-PL: Aby uniknąć udostępniania fałszywych danych, wyrównaj ważne struktury danych (takie jak blokady spinlock, nagłówki kolejki buforu, listy jednokierunkowe) do granic wiersza pamięci podręcznej przy użyciu NdisGetSharedDataAlignment.

Prawidłowe używanie mechanizmów blokowania

Blokady spin mogą zmniejszyć wydajność, jeśli nie są prawidłowo używane. Sterowniki powinny zminimalizować wykorzystanie blokad spinowych, stosując operacje synchroniczne wszędzie tam, gdzie to możliwe. Jednak w niektórych przypadkach blokada obrotowa może być najlepszym wyborem dla pewnych celów. Jeśli na przykład sterownik uzyskuje blokadę spinlocka podczas obsługi licznika referencji dla pakietów, które nie zostały zgłoszone z powrotem do sterownika, nie jest konieczne użycie operacji międzywątkowej. Aby uzyskać więcej informacji, zobacz Synchronizacja i Powiadomienia w Sterownikach Sieciowych.

Poniżej przedstawiono kilka wskazówek dotyczących efektywnego używania mechanizmów blokowania:

Korzystanie z 64-bitowej usługi DMA

64-bitowa DMA Jeśli karta sieciowa obsługuje 64-bitową DMA, należy wykonać kroki, aby uniknąć dodatkowych kopii adresów powyżej zakresu 4 GB. Gdy sterownik wywołuje NdisMRegisterScatterGatherDma, flaga NDIS_SG_DMA_64_BIT_ADDRESS musi być ustawiona w parametrze Flags.

Zapewnienie prawidłowego wyrównania buforu

Wyrównanie bufora wzdłuż granicy linii pamięci podręcznej zwiększa wydajność podczas kopiowania danych z jednego bufora do drugiego. Większość buforów odbieranych przez kartę sieciową jest prawidłowo wyrównana po ich pierwszym przydzieleniu, ale dane użytkownika, które ostatecznie muszą zostać skopiowane do buforu aplikacji, są nieprawidłowo wyrównane z powodu przestrzeni zajętej przez nagłówek. W przypadku danych TCP (najbardziej typowego scenariusza) przesunięcie ze względu na nagłówki TCP, IP i Ethernet powoduje zmianę 0x36 bajtów. Aby rozwiązać ten problem, zalecamy, aby kierowcy przydzielili nieco większy bufor i wstawili dane pakietów z przesunięciem o 0xA bajtów. Zapewni to, że po przesunięciu o 0x36 bajtów nagłówka, dane użytkownika są prawidłowo wyrównane. Aby uzyskać więcej informacji na temat granic linii pamięci podręcznej, zapoznaj się z sekcją Uwagi dotyczącą NdisMAllocateSharedMemory.

Korzystanie z Scatter-Gather DMA

NDIS Scatter/Gather DMA zapewnia sprzęt z obsługą transferu danych do i z nieciągliwych zakresów pamięci fizycznej. Scatter-Gather DMA używa struktury SCATTER_GATHER_LIST, która zawiera tablicę struktur SCATTER_GATHER_ELEMENT i liczbę elementów w tablicy. Ta struktura jest pobierana z deskryptora pakietu przekazanego do funkcji wysyłania sterownika. Każdy element tablicy zawiera długość i adres początkowy fizycznie ciągłego regionu Scatter-Gather. Sterownik używa informacji o długości i adresie do przesyłania danych.

Użycie procedur Scatter-Gather dla operacji DMA może poprawić wykorzystanie zasobów systemowych, nie blokując tych zasobów statycznie, tak jak w przypadku użycia rejestrów map. Aby uzyskać więcej informacji, zobacz NDIS Scatter/Gather DMA.

Jeśli karta sieciowa obsługuje odciążanie segmentacji TCP (Duże Odciążenie Wysyłania), sterownik będzie musiał przekazać maksymalny rozmiar buforu, który może uzyskać z protokołu TCP/IP, do parametru MaximumPhysicalMapping w funkcji NdisMRegisterScatterGatherDma. Gwarantuje to, że sterownik ma wystarczającą liczbę rejestrów mapowania, aby utworzyć listę Scatter-Gather i wyeliminować wszelkie możliwe alokacje bufora i kopiowanie. Aby uzyskać więcej informacji, zobacz następujące tematy:

Wsparcie ograniczania przepustowości po stronie odbiorcy

Aby zminimalizować zakłócenia podczas odtwarzania multimediów w aplikacjach multimedialnych, sterowniki NDIS 6.20 i nowsze muszą obsługiwać ograniczanie po stronie odbierania (RST) w przetwarzaniu przerwań odbierania. Aby uzyskać więcej informacji, zobacz:

Ograniczanie po stronie odbiorczej w NDIS 6.20 "Ścieżki wysyłania i odbierania kodu" w podsumowaniu zmian wymaganych do przeniesienia sterownika miniportu do NDIS 6.20