Megosztás:


Teljesítmény az hálózati illesztőprogramokban

A küldési és fogadási útvonal hosszának minimalizálása

Bár a küldési és fogadási útvonalak illesztőprogramonként eltérőek, a teljesítményoptimalizálásra néhány általános szabály létezik:

  • Optimalizálja a gyakori útvonalakat. A Kernprof.exe eszközt a Windows fejlesztői és IDW-buildjei biztosítják, amelyek kinyerik a szükséges információkat. A fejlesztőnek meg kell vizsgálnia a legtöbb CPU-ciklust használó rutinokat, és meg kell kísérelnie csökkenteni ezeknek a rutinoknak a meghívásának gyakoriságát vagy az ezekben a rutinokban töltött időt.

  • Csökkentse a DPC-ben töltött időt, hogy a hálózati adapter illesztőprogramja ne használjon túlzott rendszererőforrásokat, ami a rendszer általános teljesítményének csökkenését okozhatja.

  • Győződjön meg arról, hogy a hibakeresési kód nincs lefordítva az illesztőprogram végleges kiadású verziójára; így elkerülhető a felesleges kód végrehajtása.

Adatok és kódok particionálása a processzorok közötti megosztás minimalizálása érdekében

Particionálásra van szükség a megosztott adatok és kódok processzorok közötti minimalizálásához. A particionálás segít csökkenteni a rendszerbusz kihasználtságát, és javítja a processzorgyorsítótár hatékonyságát. A megosztás minimalizálása érdekében az illesztőprogram-íróknak a következőket kell figyelembe venniük:

  • Valósítsa meg az illesztőprogramot deszerializált miniportként az NDIS deszerializált miniport-illesztőprogramokszerint.

  • Processzoronkénti adatstruktúrák használata a globális és a megosztott adathozzáférés csökkentéséhez. Ez lehetővé teszi a statisztikai számlálók szinkronizálás nélküli megtartását, ami csökkenti a kód elérési útját, és növeli a teljesítményt. A létfontosságú statisztikákhoz processzoronkénti számlálók vannak hozzáadva a lekérdezési időpontban. Ha globális számlálóval kell rendelkeznie, pörgetési zárolások helyett használjon összekapcsolt műveleteket a számláló módosításához. A pörgetési zárak használatának elkerüléséről alább a Zárolási mechanizmusok megfelelő használata című témakörben olvashat.

    Ennek megkönnyítése érdekében KeGetCurrentProcessorNumberEx használható az aktuális processzor meghatározásához. A processzoronkénti adatstruktúrák kiosztásakor a processzorok számának meghatározásához KeQueryGroupAffinity használható.

    Az affinitási maszkban beállított bitek teljes száma a rendszerben lévő aktív processzorok számát jelzi. Az illesztőprogramok nem feltételezhetik, hogy a maszk összes beállított bitje egybefüggő lesz, mert előfordulhat, hogy a processzorok nem lesznek egymást követő számmal az operációs rendszer későbbi kiadásaiban. Az SMP-gépek processzorainak száma nulla alapú érték.

    Ha az illesztőprogram processzoronkénti adatokat tart fenn, a KeQueryGroupAffinity függvénnyel csökkentheti a gyorsítótár-vonal versengést.

A hamis megosztás elkerülése

Hamis megosztás akkor fordul elő, ha a processzorok egymástól független megosztott változókat kérnek. Mivel azonban a változók ugyanazon a gyorsítótárvonalon vannak, a processzorok között meg vannak osztva. Ilyen esetekben a gyorsítótár vonala oda-vissza halad a processzorok között a benne lévő változókhoz való minden hozzáféréshez, ami növeli a gyorsítótár kiürítését és újratöltését. Ez növeli a rendszerbusz kihasználtságát, és csökkenti a rendszer általános teljesítményét.

A hamis megosztás elkerülése érdekében igazítsa a fontos adatstruktúrákat (például a pörgetési zárakat, a puffersor-fejléceket, az egyes csatolt listákat) a gyorsítótár sor határaihoz a NdisGetSharedDataAlignmenthasználatával.

A zárolási mechanizmusok megfelelő használata

A pörgetési zárak csökkenthetik a teljesítményt, ha nem használják megfelelően. A meghajtóknak lehetőség szerint minimálisra kell csökkenteniük a pörgetési zárak használatát kapcsolt műveletek alkalmazásával. Bizonyos esetekben azonban a pörgetési zár lehet a legjobb választás bizonyos célokra. Ha például egy illesztőprogram spin lock-ot szerez meg, miközben azoknak a csomagoknak a számát kezeli, amelyeket még nem jeleztek vissza az illesztőprogramnak, nem szükséges interlocked műveletet használni. További információ: Szinkronizálás és értesítés a hálózati illesztőprogramokban.

Íme néhány tipp a zárolási mechanizmusok hatékony használatához:

64 bites DMA használata

64 bites DMA Ha a hálózati adapter támogatja a 64 bites DMA-t, lépéseket kell tenni a 4 GB-nál nagyobb címek további példányainak elkerülése érdekében. Amikor az illesztőprogram meghívja NdisMRegisterScatterGatherDma, a NDIS_SG_DMA_64_BIT_ADDRESS jelzőt a Jelzők paraméterben kell beállítani.

A puffer megfelelő igazításának biztosítása

A gyorsítótár sor határán lévő puffer igazítása javítja a teljesítményt, amikor adatokat másolunk az egyik pufferből a másikba. A legtöbb hálózati adapter fogadó pufferei megfelelően vannak igazítva az első lefoglaláskor, de a felhasználói adatok, amelyeket végül az alkalmazáspufferbe kell másolni, a felhasznált fejlécterület miatt helytelenül lesznek elosztva. A TCP-adatok (a leggyakoribb forgatókönyv) esetében a TCP-, IP- és Ethernet-fejlécek miatti váltás 0x36 bájtok eltolódását eredményezi. A probléma megoldásához javasoljuk, hogy az illesztőprogramok foglaljanak le egy valamivel nagyobb puffert, és szúrjanak be csomagadatokat 0xA bájt eltolásával. Ez biztosítja, hogy miután a puffereket 0x36 bájttal eltolva igazítjuk a fejléc pozíciójához képest, a felhasználói adatok megfelelően kerüljenek igazításra. A gyorsítótár-vonal határairól további információt a NdisMAllocateSharedMemoryMegjegyzések szakaszában talál.

Scatter-Gather DMA használata

A NDIS szórt/gyűjtő DMA lehetővé teszi a hardver számára, hogy adatokat vigyen át a nem összefüggő fizikai memória-tartományokba és onnan. Scatter-Gather DMA egy SCATTER_GATHER_LIST struktúrát használ, amely SCATTER_GATHER_ELEMENT struktúrák tömbjét és a tömb elemeinek számát tartalmazza. Ez a struktúra az illesztőprogram küldési függvényének átadott csomagleíróból lesz lekérve. A tömb minden eleme megadja egy fizikailag összefüggő Scatter-Gather régió hosszát és kezdő fizikai címét. Az illesztőprogram a hossz- és címadatokat használja az adatok átviteléhez.

A DMA-műveletek Scatter-Gather rutinjainak használata javíthatja a rendszererőforrások kihasználtságát azáltal, hogy nem zárolja ezeket az erőforrásokat statikusan, ahogyan a térképregisztrálók használata esetén is. További információért lásd: NDIS szórás/gyűjtés DMA.

Ha a hálózati adapter támogatja a TCP Szegmentálási kiszervezést (Large Send Offload), akkor az illesztőprogramnak a TCP/IP-ről a MaximumPhysicalMapping paraméterbe való maximális pufferméretet kell átadnia a NdisMRegisterScatterGatherDma függvényen belül. Ez garantálja, hogy az illesztőprogram elegendő térképregisztrációval rendelkezik a Scatter-Gather-lista létrehozásához, és kiküszöböli a lehetséges pufferfoglalásokat és másolásokat. További információkért tekintse meg az alábbi témaköröket:

A fogadási oldal sebességszabályozásának támogatása

A multimédiás alkalmazások médialejátszása során fellépő fennakadások minimalizálása érdekében az NDIS 6.20 és újabb illesztőprogramoknak támogatniuk kell a fogadási megszakítások feldolgozásában a Receive Side Throttle (RST) elemet. További információ:

Fogadó oldali folyamatvezérlés az NDIS 6.20-ban "Küldési és fogadási kódútvonalak" Miniport-illesztőprogram NDIS 6.20-ra történő portolásához szükséges változtatások összefoglalása