Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
- küldési és fogadási útvonal hosszának minimalizálása
- adatok és kódok particionálása a processzorok közötti megosztás minimalizálása érdekében
- Hamis megosztás elkerülése
- A zárolási mechanizmusok megfelelő használata
- 64 bites DMA használata
- A puffer megfelelő igazításának biztosítása
- Scatter-Gather DMA- használata
- Fogadási Oldal Szabályozásának Támogatása
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:
Az erőforráskészletek kezeléséhez használjon NDIS-hez kapcsolódó listafüggvényeket, például az alábbiakat:
Ha pörgetési zárolásokat kell használnia, használja őket csak az adatok védelmére, nem a kódra. Ne használjon egyetlen zárolást a közös útvonalakon használt összes adat védelméhez. A küldési és fogadási útvonalakban használt adatokat például két adatstruktúrába kell elválasztani, hogy amikor a küldési útvonalnak zárolnia kell az adatait, a fogadási útvonal ne legyen hatással.
Ha pörgetési zárakat használ, és az elérési út már DPC szinten van, használja a NdisDprAcquireSpinLock és NdisDprReleaseSpinLock függvényeket, hogy elkerülje a további kódokat a zárolások beszerzésekor és felszabadításakor.
A pörgetési zárolások és -kiadások számának minimalizálásához használja az alábbi NDIS RWLock-függvényeket:
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