Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
- zminimalizowanie długości ścieżki wysyłania i odbierania
- partycjonowanie danych i kodu w celu zminimalizowania udostępniania między procesorami
- Unikanie fałszywego udostępniania
- Właściwe używanie mechanizmów blokowania
- korzystanie z 64-bitowej DMA
- Zapewnienie prawidłowego wyrównania buforu
- używanie Scatter-Gather DMA
- obsługa ograniczania po stronie odbiorczej
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:
Użyj funkcji jednokierunkowej listy NDIS, takich jak te do zarządzania pulami zasobów.
Jeśli musisz użyć blokad spin, użyj ich tylko do ochrony danych, a nie kodu. Nie używaj jednej blokady do ochrony wszystkich danych wykorzystywanych w często używanych ścieżkach. Na przykład rozdziel dane używane w ścieżkach wysyłania i odbierania do dwóch struktur danych, aby gdy ścieżka wysyłania musi zablokować swoje dane, ścieżka odbierania nie jest dotknięta.
Jeśli używasz blokad spin i ścieżka jest już na poziomie DPC, użyj funkcji NdisDprAcquireSpinLock i NdisDprReleaseSpinLock, aby uniknąć dodatkowego kodu podczas uzyskiwania i zwalniania blokad.
Aby zminimalizować liczbę pozyskanych i zwolnień blokad spinlock, użyj tych funkcji NDIS RWLock:
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