Delen via


Prestaties van netwerkstuurprogramma's

Lengte van verzend- en ontvangstpad minimaliseren

Hoewel de paden voor verzenden en ontvangen verschillen van stuurprogramma naar stuurprogramma, zijn er enkele algemene regels voor prestatieoptimalisaties:

  • Optimaliseer voor de meest voorkomende paden. Het hulpprogramma Kernprof.exe wordt geleverd met de ontwikkelaars- en IDW-builds van Windows waarmee de benodigde informatie wordt geëxtraheerd. De ontwikkelaar moet kijken naar de routines die de meeste CPU-cycli verbruiken en proberen de frequentie te verminderen van deze routines die worden aangeroepen of de tijd die in deze routines wordt besteed.

  • Verminder de tijd die in DPC is besteed, zodat het stuurprogramma van de netwerkadapter geen gebruik maakt van overmatige systeembronnen, waardoor de algehele systeemprestaties zouden lijden.

  • Zorg ervoor dat foutopsporingscode niet is gecompileerd in de definitieve versie van het stuurprogramma; dit voorkomt dat overtollige code wordt uitgevoerd.

Gegevens en code partitioneren om het delen tussen processors te minimaliseren

Partitionering is nodig om gedeelde gegevens en code tussen processors te minimaliseren. Partitionering helpt het systeembusgebruik te verminderen en verbetert de effectiviteit van de processorcache. Om het delen te minimaliseren, moeten schrijvers van stuurprogramma's rekening houden met het volgende:

  • Implementeer het stuurprogramma als een gedeserialiseerde minipoort zoals beschreven in Gedeserialiseerde NDIS Miniport Drivers.

  • Gebruik gegevensstructuren per processor om wereldwijde en gedeelde gegevenstoegang te verminderen. Hierdoor kunt u statistiektellers zonder synchronisatie behouden, waardoor de codeweg korter is en de prestaties worden verhoogd. Voor essentiële statistieken moet u prestatiemeteritems per processor hebben die samen worden opgeteld tijdens het uitvoeren van query's. Als u een globale teller moet hebben, gebruikt u vergrendelde bewerkingen in plaats van kringvergrendelingen om de teller te manipuleren. Zie Het gebruik van vergrendelingsmechanismen correct hieronder voor informatie over het voorkomen van het gebruik van kringvergrendelingen.

    Om dit mogelijk te maken, kan KeGetCurrentProcessorNumberEx worden gebruikt om de huidige processor te bepalen. Als u het aantal processors wilt bepalen bij het toewijzen van gegevensstructuren per processor, kunt u KeQueryGroupAffinity- gebruiken.

    Het totale aantal bits dat is ingesteld in het affiniteitsmasker geeft het aantal actieve processors in het systeem aan. Stuurprogramma's mogen er niet van uitgaan dat alle ingestelde bits in het masker aaneengesloten zijn, omdat de processors mogelijk niet opeenvolgend worden genummerd in toekomstige versies van het besturingssysteem. Het aantal processors in een SMP-machine is een op nul gebaseerde waarde.

    Als uw stuurprogramma gegevens per processor onderhoudt, kunt u de functie KeQueryGroupAffinity gebruiken om conflicten tussen caches te verminderen.

Onwaar delen vermijden

Fout delen treedt op wanneer processors gedeelde variabelen aanvragen die onafhankelijk zijn van elkaar. Omdat de variabelen zich echter op dezelfde cachelijn bevinden, worden ze gedeeld tussen de processors. In dergelijke situaties gaat de cachelijn heen en weer tussen processors voor elke toegang tot een van de variabelen erin, waardoor de cache wordt leeggemaakt en opnieuw wordt geladen. Dit verhoogt het gebruik van de systeembus en vermindert de algehele systeemprestaties.

Om vals delen te voorkomen, kunt u belangrijke gegevensstructuren (zoals spinlocks, bufferqueue-koppen, enkelvoudig gekoppelde lijsten) uitlijnen op cachelijnen door gebruik te maken van NdisGetSharedDataAlignment.

Vergrendelingsmechanismen correct gebruiken

Spinvergrendelingen kunnen de prestaties verminderen als ze niet goed worden gebruikt. Stuurprogramma's moeten het gebruik van spinlocks minimaliseren door waar mogelijk gesynchroniseerde operaties te gebruiken. In sommige gevallen kan een spinvergrendeling echter de beste keuze zijn voor sommige doeleinden. Als een stuurprogramma bijvoorbeeld een spinlock verkrijgt tijdens het verwerken van de referentietelling voor het aantal pakketten dat niet aan het stuurprogramma is gerapporteerd, is het niet nodig om een geïnterlockeerde bewerking te gebruiken. Zie Synchronisatie en meldingen in netwerkstuurprogramma'svoor meer informatie.

Hier volgen enkele tips voor het effectief gebruik van vergrendelingsmechanismen:

64-bits DMA gebruiken

64-bits DMA Als de netwerkadapter 64-bits DMA ondersteunt, moeten er stappen worden ondernomen om extra kopieën te voorkomen voor adressen boven het bereik van 4 GB. Wanneer de driver NdisMRegisterScatterGatherDmaaanroept, moet de NDIS_SG_DMA_64_BIT_ADDRESS vlag worden ingesteld in de Flags parameter.

Zorgen voor een juiste bufferuitlijning

Bufferuitlijning op een cachelijngrens verbetert de prestaties bij het kopiëren van gegevens van de ene buffer naar de andere. De meeste netwerkadapters ontvangen buffers worden correct uitgelijnd wanneer ze voor het eerst worden toegewezen, maar de gebruikersgegevens die uiteindelijk in de toepassingsbuffer moeten worden gekopieerd, zijn onjuist uitgelijnd vanwege de verbruikte headerruimte. In het geval van TCP-gegevens (het meest voorkomende scenario) leidt de verschuiving als gevolg van de TCP-, IP- en Ethernet-headers tot een verschuiving van 0x36 bytes. Om dit probleem op te lossen, raden we aan dat stuurprogramma's een iets grotere buffer toewijzen en pakketgegevens invoegen op een offset van 0xA bytes. Dit zorgt ervoor dat, nadat de buffers zijn verschoven door 0x36 bytes voor de header, de gebruikersgegevens correct zijn uitgelijnd. Voor meer informatie over grenzen van cacheregels, zie de sectie Opmerkingen voor NdisMAllocateSharedMemory.

DMA van Scatter-Gather gebruiken

NDIS Scatter/Gather DMA biedt de hardware ondersteuning om gegevens naar en van niet-aaneengesloten bereiken van fysiek geheugen over te dragen. Scatter-Gather DMA maakt gebruik van een SCATTER_GATHER_LIST structuur, die een matrix van SCATTER_GATHER_ELEMENT structuren en het aantal elementen in de matrix bevat. Deze structuur wordt opgehaald uit de pakketdescriptor die wordt doorgegeven aan de verzendfunctie van het stuurprogramma. Elk element van de array geeft de lengte en het beginadres van een fysiek aaneengesloten Scatter-Gather-regio. Het stuurprogramma gebruikt de lengte en adresgegevens voor het overdragen van de gegevens.

Het gebruik van de Scatter-Gather routines voor DMA-bewerkingen kan het gebruik van systeemresources verbeteren door deze resources niet statisch te vergrendelen, zoals zou gebeuren als er kaartregisters werden gebruikt. Zie NDIS Scatter/Gather DMAvoor meer informatie.

Als de netwerkadapter TCP Segmentation Offload (Large Send Offload) ondersteunt, moet het stuurprogramma de maximale buffergrootte die het kan verkrijgen van TCP/IP overhandigen aan de MaximumPhysicalMapping parameter binnen de NdisMRegisterScatterGatherDma functie. Dit garandeert dat het stuurprogramma voldoende kaartregisters heeft om de Scatter-Gather lijst te bouwen en eventuele buffertoewijzingen en kopiëren te elimineren. Zie de volgende onderwerpen voor meer informatie:

Ondersteuning voor throttle aan ontvangstzijde

Om onderbrekingen tijdens het afspelen van media in multimediatoepassingen tot een minimum te beperken, moeten NDIS 6.20 en hogere stuurprogramma's ondersteuning bieden voor ontvangstzijdebeperking (RST) tijdens de verwerking van ontvangen interrupts. Zie voor meer informatie:

Throttle aan Ontvangstzijde in NDIS 6.20 "Verzend- en Ontvangstpaden" in Samenvatting van Vereiste Wijzigingen om een Minipoortstuurprogramma naar NDIS 6.20 te Poorten