Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
- minimalizace délky cesty odesílání a příjmu
- dělení dat a kódu, abyste minimalizovali sdílení mezi procesory
- vyhnout se nepravdivému sdílení
- správné použití mechanismů uzamčení
- Používání 64bitového DMA
- zajištění správného zarovnání vyrovnávací paměti
- Pomocí Scatter-Gather DMA
- Podpora škrcení na straně příjmu
Minimalizace délky cesty odesílání a příjmu
I když se cesty pro odesílání a příjem liší od ovladače po ovladač, existují některá obecná pravidla pro optimalizaci výkonu:
Optimalizujte běžné postupy. Nástroj Kernprof.exe je dostupný spolu s buildy Windows pro vývojáře a IDW, které extrahují potřebné informace. Vývojář by se měl podívat na rutiny, které spotřebovávají nejvíce cyklů procesoru, a pokusit se snížit frekvenci volání těchto rutin nebo čas strávený v těchto rutinách.
Zkraťte čas strávený v DPC, aby ovladač síťového adaptéru nevyužíl nadměrné systémové prostředky, což by způsobilo snížení celkového výkonu systému.
Ujistěte se, že kód ladění není zkompilován do konečné vydané verze ovladače; tím se zabrání provádění nadbytečného kódu.
Dělení dat a kódu za účelem minimalizace sdílení mezi procesory
Dělení je potřeba k minimalizaci sdílených dat a kódu napříč procesory. Dělení pomáhá snížit využití systémové sběrnice a zlepšit efektivitu mezipaměti procesoru. Aby se minimalizovalo sdílení, měli by autoři ovladačů zvážit následující:
Implementujte ovladač jako deserializovaný miniport, jak je popsáno v Deserialized NDIS Miniport Drivers.
Pomocí datových struktur pro zpracovatele můžete omezit globální a sdílený přístup k datům. To vám umožní zachovat čítače statistik bez synchronizace, což snižuje délku cesty kódu a zvyšuje výkon. Pro důležité statistiky mají čítače na procesor, které se při dotazu sečtou dohromady. Pokud potřebujete globální čítač, k jeho manipulaci místo spin zámků použijte operace typu interlocked. Informace o tom, jak se vyhnout použití spinlocků, najdete v části uvedené níže Použití mechanismů uzamykání.
Pro usnadnění tohoto keGetCurrentProcessorNumberEx lze použít k určení aktuálního procesoru. K určení počtu procesorů při přidělování datových struktur pro procesor je možné použít KeQueryGroupAffinity.
Celkový počet bitů nastavených v masce spřažení označuje počet aktivních procesorů v systému. Ovladače by neměly předpokládat, že všechny sady bitů v masce budou souvislé, protože procesory nemusí být po sobě očíslovány v budoucích verzích operačního systému. Počet procesorů v počítači SMP je nulová hodnota.
Pokud ovladač udržuje data pro jednotlivé procesory, můžete pomocí funkce KeQueryGroupAffinity snížit kolize mezipamětí.
Vyhnout se falešnému sdílení
K falešnému sdílení dochází, když procesory požadují sdílené proměnné, které jsou na sobě nezávislé. Vzhledem k tomu, že jsou proměnné na stejném řádku mezipaměti, jsou sdíleny mezi procesory. V takových situacích se bude řádek mezipaměti pohybovat mezi procesory při každém přístupu k některé z proměnných v řádku mezipaměti, což způsobí zvýšení flushe cache a její nové načítání. Tím se zvýší využití systémové sběrnice a sníží se celkový výkon systému.
Abyste se vyhnuli nesprávnému sdílení, zarovnejte důležité datové struktury (například spinové zámky, hlavičky fronty vyrovnávací paměti, jednosměrně propojené seznamy) k hranicím řádků mezipaměti pomocí NdisGetSharedDataAlignment.
Správné použití mechanismů uzamykání
Zámky otáčení můžou snížit výkon, pokud se nepoužívají správně. Ovladače by měly minimalizovat používání zámků otáčení pomocí vzájemně uzamčených operací, kdykoli je to možné. V některých případech ale zámek otáčení může být nejlepší volbou pro některé účely. Pokud například ovladač získá zámek číselníku při zpracování referenčního počtu paketů, které nebyly označeny zpět k ovladači, není nutné použít vzájemně uzamčenou operaci. Další informace naleznete v tématu Synchronizace a oznámení v síťových ovladačích.
Tady je několik tipů pro efektivní používání mechanismů uzamčení:
Pro správu fondů zdrojů použijte jednosměrně propojené funkce seznamu NDIS, jako jsou například následující:
Pokud potřebujete použít spinlocky, používejte je pouze k ochraně dat, nikoli ke kódu. Nepoužívejte jeden zámek k ochraně všech dat používaných v běžných operacích. Například oddělte data použitá v cestě pro odesílání a příjem do dvou datových struktur, aby když cesta odeslání potřebuje uzamknout svá data, cesta příjmu není ovlivněna.
Pokud používáte spin locky a cesta je již na úrovni DPC, použijte funkce NdisDprAcquireSpinLock a NdisDprReleaseSpinLock, abyste se vyhnuli nadbytečnému kódu při jejich získávání a uvolňování.
Pokud chcete minimalizovat počet získání a uvolnění spin lock, použijte tyto funkce NDIS RWLock:
Použití 64bitového DMA
64bitový DMA Pokud síťový adaptér podporuje 64bitový DMA, je třeba provést kroky, aby se zabránilo nadbytečným kopiím adres nad rozsahem 4 GB. Když ovladač volá NdisMRegisterScatterGatherDma, musí být příznak NDIS_SG_DMA_64_BIT_ADDRESS nastaven v parametru Flags.
Zajištění správného nastavení vyrovnávací paměti
Zarovnání vyrovnávací paměti na hranici cache line zlepšuje výkon při kopírování dat z jedné vyrovnávací paměti do druhé. Většina vyrovnávacích pamětí pro příjem síťových adaptérů je při prvním přidělení správně zarovnaná, ale uživatelská data, která se musí nakonec zkopírovat do vyrovnávací paměti aplikace, se kvůli spotřebě místa záhlaví nesprávně zarovnají. Pokud jde o data TCP (nejběžnější scénář), posun způsobený hlavičkami TCP, IP a Ethernet vede k posunu o 0x36 bajtů. Pokud chcete tento problém vyřešit, doporučujeme, aby softwarové ovladače přidělily o něco větší buffer a vložily data paketů na posun 0xA bajtů. Tím zajistíte, že po posunu vyrovnávacích pamětí o 0x36 bajtů pro záhlaví budou uživatelská data správně zarovnaná. Další informace o hranicích řádku mezipaměti naleznete v části Poznámky pro NdisMAllocateSharedMemory.
Použití Scatter-Gather DMA
NDIS Scatter/Gather DMA poskytuje hardwaru podporu pro přenos dat do a z nesouvislých oblastí fyzické paměti. Scatter-Gather DMA používá SCATTER_GATHER_LIST strukturu, která zahrnuje pole SCATTER_GATHER_ELEMENT struktur a počet prvků v poli. Tato struktura se načte z popisovače paketů předaného funkci ovladače pro odeslání. Každý prvek pole poskytuje délku a počáteční fyzickou adresu fyzicky souvislé Scatter-Gather oblasti. Ovladač používá informace o délce a adrese pro přenos dat.
Použití Scatter-Gather rutin pro operace DMA může zlepšit využití systémových prostředků tím, že tyto prostředky nezamykáte staticky, stejně jako při použití registrů map. Další informace najdete v tématu NDIS Scatter/Gather DMA.
Pokud síťový adaptér podporuje TCP segmentační odkládání (velké odesílání), ovladač bude muset předat maximální velikost vyrovnávací paměti, kterou může získat z TCP/IP do parametru MaximumPhysicalMapping v rámci funkce NdisMRegisterScatterGatherDma. Tím bude zajištěno, že ovladač má dostatek mapových registrů k sestavení seznamu Scatter-Gather a odstranění jakýchkoli možných přidělení vyrovnávací paměti a kopírování. Další informace najdete v těchto tématech:
Podpora omezování na straně příjmu
Aby se minimalizovaly výpadky při přehrávání médií v multimediálních aplikacích, musí ovladače NDIS 6.20 a novější podporovat řízení příjmu (RST) při zpracování přerušení. Další informace najdete tady:
Přijímací škrcení v NDIS 6.20 "Cesty kódu pro odesílání a příjem" v souhrn změn potřebných pro převedení ovladače miniportu na NDIS 6.20