Ağ Sürücülerinde Performans

Gönderme ve alma yolu uzunluğunu en aza indirme

Gönderme ve alma yolları sürücüden sürücüye farklılık gösterse de performans iyileştirmeleri için bazı genel kurallar vardır:

  • Ortak yolları optimize edin. Kernprof.exe aracı, gerekli bilgileri ayıklayan ve geliştirici ile IDW sürümleriyle birlikte sağlanan bir Windows aracı olarak sunulmaktadır. Geliştirici en çok CPU döngülerini kullanan yordamlara bakmalı ve çağrılan bu yordamların sıklığını veya bu yordamlarda harcanan süreyi azaltmaya çalışmalıdır.

  • Ağ bağdaştırıcısı sürücüsünün aşırı sistem kaynağı kullanmaması için DPC'de harcanan süreyi azaltın ve bu da genel sistem performansının düşmesine neden olur.

  • Hata ayıklama kodunun sürücünün son yayımlanan sürümünde derlenmediğinden emin olun; bu, fazla kodun yürütülmesini önler.

İşlemciler arasında paylaşımı en aza indirmek için verileri ve kodu bölümleme

İşlemciler arasında paylaşılan verileri ve kodu en aza indirmek için bölümleme gereklidir. Bölümleme, sistem veri yolu kullanımını azaltmaya yardımcı olur ve işlemci önbelleğinin verimliliğini artırır. Paylaşımı en aza indirmek için sürücü yazarları aşağıdakileri göz önünde bulundurmalıdır:

  • Deserilize edilmiş bir miniport olarak sürücüyü Deserialized NDIS Miniport Sürücüleri bölümünde açıklandığı şekilde uygulayın.

  • Genel ve paylaşılan veri erişimini azaltmak için işlemci başına veri yapılarını kullanın. Bu, istatistik sayaçlarını eşitleme olmadan tutmanızı sağlar ve bu da kod yolu uzunluğunu azaltır ve performansı artırır. Önemli istatistikler için sorgu zamanında bir araya eklenen işlemci başına sayaçlara sahip olun. Genel bir sayacınız olması gerekiyorsa, sayacı işlemek için döndürme kilitleri yerine birbirine bağlı işlemleri kullanın. Döndürme kilitlerini kullanmaktan kaçınma hakkında bilgi için aşağıdaki Kilitleme Mekanizmalarını Düzgün Kullanma bölümüne bakın.

    Bunu kolaylaştırmak için KeGetCurrentProcessorNumberEx geçerli işlemciyi belirlemek için kullanılabilir. İşlemci başına veri yapıları ayrılırken işlemci sayısını belirlemek için KeQueryGroupAffinity kullanılabilir.

    Benzeme maskesinde ayarlanan toplam bit sayısı, sistemdeki etkin işlemci sayısını gösterir. İşlemciler işletim sisteminin gelecek sürümlerinde art arda numaralandırılmayabileceği için sürücüler maskedeki tüm küme bitlerinin bitişik olacağını varsaymamalıdır. SMP makinesindeki işlemci sayısı sıfır tabanlı bir değerdir.

    Sürücünüz işlemci başına verileri koruyorsa, önbellek satırı çekişmesini azaltmak için KeQueryGroupAffinity işlevini kullanabilirsiniz.

Yanlış paylaşımdan kaçınma

İşlemciler birbirinden bağımsız paylaşılan değişkenler istediğinde hatalı paylaşım gerçekleşir. Ancak, değişkenler aynı önbellek satırında olduğundan, bunlar işlemciler arasında paylaşılır. Bu gibi durumlarda önbellek satırı, içindeki değişkenlerin her birine her erişim için işlemciler arasında ileri geri hareket eder ve bu da önbellek boşaltma ve yeniden yüklemelerde artışa neden olur. Bu, sistem veri yolu kullanımını artırır ve genel sistem performansını azaltır.

Yanlış paylaşımı önlemek için, NdisGetSharedDataAlignment kullanarak önemli veri yapılarını (döndürme kilitleri, arabellek kuyruğu üst bilgileri, tek bağlantılı listeler gibi) önbellek satırı sınırlarıyla hizalayın.

Kilitleme mekanizmalarını düzgün kullanma

Döndürme kilitleri düzgün kullanılmazsa performansı düşürebilir. Sürücüler mümkün olan her yerde birbirine bağlı işlemleri kullanarak spin kilitleri kullanımını en aza indirmelidir. Bazı durumlarda, bazı amaçlar için en iyi seçim bir spin lock olabilir. Örneğin, sürücüye geri bildirilmemiş paketlerin sayısı için başvuru sayısını işlerken bir spin kilidi alırsa, kilitli/bağlantılı bir işlem kullanılması gerekmez. Daha fazla bilgi için bkz. Ağ Sürücülerinde Eşitleme ve Bildirim.

Kilitleme mekanizmalarını etkili bir şekilde kullanmaya yönelik bazı ipuçları şunlardır:

64 bit DMA kullanma

64 Bit DMA Ağ bağdaştırıcısı 64 bit DMA'yı destekliyorsa, 4 GB aralığının üzerindeki adresler için ek kopyalardan kaçınmak için adımlar atılmalıdır. Sürücü NdisMRegisterScatterGatherDma'yı çağırdığında, NDIS_SG_DMA_64_BIT_ADDRESS bayrağı Flags parametresinde ayarlanmalıdır.

Uygun arabellek hizalamasını sağlama

Önbellek satırı sınırındaki arabellek hizalaması, verileri bir arabellekten diğerine kopyalarken performansı artırır. Çoğu ağ bağdaştırıcısı alma arabellekleri ilk tahsis edildiğinde düzgün hizalanır, ancak sonunda uygulama arabelleğine kopyalanması gereken kullanıcı verileri, başlık alanının tüketilmesi nedeniyle yanlış hizalanır. TCP verileri söz konusu olduğunda (en yaygın senaryo), TCP, IP ve Ethernet üst bilgilerinden kaynaklanan kaydırma, 0x36 bayt kaymasına neden olur. Bu sorunu çözmek için sürücülerin biraz daha büyük bir arabellek ayırmalarını ve paket verilerini 0xA bayt uzaklığında eklemelerini öneririz. Bu, arabellekler başlık için 0x36 bayt kaydırıldıktan sonra kullanıcı verilerinin doğru şekilde hizalanmasını sağlar. Önbellek satırı sınırları hakkında daha fazla bilgi için NdisMAllocateSharedMemory için Açıklamalar bölümüne bakın.

Scatter-Gather DMA kullanımı

NDIS Dağılım/Toplama DMA, donanıma bitişik olmayan fiziksel bellek aralıklarına veri aktarma desteği sağlar. Scatter-Gather DMA, SCATTER_GATHER_ELEMENT yapı dizisini ve dizideki öğe sayısını içeren bir SCATTER_GATHER_LIST yapısı kullanır. Bu yapı, sürücünün gönderme işlevine geçirilen paket tanımlayıcısından alınır. Dizinin her öğesi, fiziksel olarak bitişik bir Scatter-Gather bölgesinin uzunluğunu ve başlatma fiziksel adresini sağlar. Sürücü, verileri aktarmak için uzunluk ve adres bilgilerini kullanır.

DMA işlemleri için Scatter-Gather yordamlarının kullanılması, eşleme yazmaçları kullanıldığında olduğu gibi bu kaynakları statik olarak kilitlemeyerek sistem kaynaklarının kullanımını iyileştirebilir. Daha fazla bilgi için bkz. NDIS Scatter/Gather DMA.

Ağ bağdaştırıcısı TCP Segmentasyon Boşaltmayı destekliyorsa (Büyük Gönderme Boşaltma), sürücünün TCP/IP'den alabildiği maksimum arabellek boyutunu NdisMRegisterScatterGatherDma işlevindeki MaximumPhysicalMapping parametresine geçirmesi gerekir. Bu, sürücünün Scatter-Gather listesini oluşturmak ve olası tampon ayırmalarını ve kopyalama işlemlerini ortadan kaldırmak için yeterli haritalama yazmaçlarına sahip olmasını garanti eder. Daha fazla bilgi için şu konulara bakın:

Alma Tarafında Hız Sınırlamayı Destekleme

Multimedya uygulamalarında medya kayıttan yürütme sırasında kesintileri en aza indirmek için, NDIS 6.20 ve üzeri sürücülerin alma kesintilerini işlemede Alma Tarafı Kısıtlamasını (RST) desteklemesi gerekir. Daha fazla bilgi için bakınız:

NDIS 6.20'de Alma Tarafı KısıtlamasıBir Miniport Sürücüsünü NDIS 6.20'ye Taşımada Gereken Değişikliklerin Özeti bölümünde "Gönderme ve Alma Kod Yolları"