Dochází ke snížení výkonu při kopírování dat na TCP server pomocí aplikace Windows Sockets API

Překlady článku Překlady článku
ID článku: 823764 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při spuštění programu, který používá rozhraní Windows Sockets API, může dojít ke snížení výkonu při kopírování dat na TCP server.

Pokud provádíte trasování v síti pomocí síťového toku, jako je například nástroj Sledování sítě společnosti Microsoft, odešle TCP server segmentaci TCP ACK, poslední segment TCP v datovém proudu protokolu TCP v časovač opožděné potvrzení (také známé jako opožděné časovač ACK). Ve výchozím nastavení operačních systémů Windows pro tento časovač hodnotu 200 milisekund (ms). Tok dat typické pro odesílání 64 kilobajtů (KB) dat vypadá podobně jako následující sekvence:
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK
....
Client->Server 1460 bytes
Client->Server 1460 bytes
Server->Client ACK-PUSH
Client->Server 1296 bytes
-> delayed ACK 200 ms


Příčina

K tomuto problému dochází z důvodu chování rozhraní Windows Sockets API a souboru Afd.sys architektury. K tomuto problému dochází, pokud jsou splněny všechny následující podmínky:
  • Program Windows Sockets používá neblokujícím soketů.
  • Jediný Odeslat volání nebo WSASend volání vyplní celou základní vyrovnávací paměti odesílání soketu.

    Například program používá rozhraní Windows Sockets Setsockopt funkce změnit výchozí soketu odeslat vyrovnávací paměti na 32 KB během jeho soketu inicializační rutiny:
    setsockopt( sock, SOL_SOCKET, 32768, (char *) &val, sizeof( int ) );
    Později, když program odešle data, vydává Odeslat volání nebo WSASend volání a pošle 64 KB dat při každém odeslání:
    send(socket, pWrBuffer, 65536, 0);
    V této situaci se při každém programu problémy Odeslat hovor 64 kB dat, vrátí program SOCKET_ERROR Kód chyby, pokud se zcela naplní vyrovnávací paměť základní soket 32 KB. Za ním volá WSAGetLastError funkce, program obdrží WSAEWOULDBLOCK Kód chyby. Většina programů používá rozhraní Windows Sockets Vybrat Funkce zkontrolovat stav soketu. V tomto scénáři Vybrat Funkce nehlásí soketu jako s možností zápisu, dokud klient obdrží vynikající segment TCP ACK. Ve výchozím nastavení prostředí systému Windows to může trvat až 200 ms z důvodu opožděné potvrzení algoritmus.
  • Vzdálený server TCP uznává všechny segmenty TCP před klient odešle poslední segment TCP s nastaveným bitem push.

Jak potíže obejít

Chcete-li tento problém vyřešit, použijte některou z následujících metod.

Metoda 1: Použití blokování Sockets

K tomuto problému dochází pouze neblokujícím soketů. Použijete-li blokování soket, tento problém nedochází protože souboru Afd.sys zpracovává jinak soketu vyrovnávací paměti. Další informace o blokování a neblokujícím soketu, programování naleznete v dokumentaci k sadě Microsoft Platform SDK.

Metoda 2: Zkontrolujte velikost vyrovnávací paměti pro odesílání soketu větší než velikost vyrovnávací paměti pro odesílání Program

Chcete-li změnit vyrovnávací paměť pro odesílání soketu, použijte rozhraní Windows Sockets getsockopt funkce zjistit aktuální velikost vyrovnávací paměti odesílání soketu (SO_SNDBUF) a potom Setsockopt Funkce nastavení soketů odeslat velikost vyrovnávací paměti. Po dokončení SO_SNDBUF hodnota musí být větší než velikost vyrovnávací paměti odesílání program 1 bajt.

Změnit Odeslat volání nebo WSASend volání Určuje velikost vyrovnávací paměti menší než hodnota SO_SNDBUF 1 bajt. V předchozím příkladu v části "Příčina" tohoto článku nelze změnit Setsockopt volání na následující hodnotu
setsockopt( sock, SOL_SOCKET, 65537, (char *) &val, sizeof( int ) );
nebo můžete upravit Odeslat volání na následující hodnotu:
send(socket, pWrBuffer, 32767, 0);
Můžete také použít libovolnou kombinaci těchto hodnot.

Metoda 3: Změna nastavení protokolu TCP/IP na serveru TCP

Důležité Tento oddíl, metoda nebo úkol obsahuje kroky, které informace o úpravě registru. Však mohou nastat závažné problémy při nesprávných úpravách registru. Proto se ujistěte, opatrně postupujte takto. Pro zvýšení ochrany před úpravami je nutné zálohujte registr. Můžete pak obnovení registru v případě, že dojde k potížím. Další informace o zálohování a obnovení registru získáte článku znalostní báze Microsoft Knowledge Base:
322756 Postup při zálohování a obnovení registru v systému Windows


Upravte nastavení protokolu TCP/IP na serveru TCP okamžitě potvrdit příchozí segmentů protokolu TCP. Toto řešení funguje nejlépe v prostředí, který má základní velké klientské instalace, kde nelze změnit chování programu. U scénářů, kde vzdálený server TCP spuštěn na serveru se systémem Windows je třeba upravit registr vzdáleného serveru. Pro jiné operační systémy dokumentaci operačního systému informace o změně časovač opožděné potvrzení.

Na serveru se systémem Windows 2000 postupujte takto:
  1. Spusťte Editor registru (Regedit.exe).
  2. Vyhledejte a klepněte na následující podklíč registru:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<interface guid=""></interface>
  3. V Upravit nabídky, klepněte na tlačítko Přidat hodnotua pak vytvořte následující hodnotu registru:

    Název hodnoty: TcpDelAckTicks
    Typ dat: REG_DWORD
    Hodnota dat: 0
  4. Ukončete Editor registru.
  5. Windows, tato změna se projeví až po restartování.
Na serveru se systémem Windows XP nebo Windows Server 2003 postupujte takto:
  1. Spusťte Editor registru.
  2. Vyhledejte a klepněte na následující podklíč registru:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<interface guid=""></interface>
  3. V Upravit příkaz Novýa klepněte na tlačítko Hodnota DWORD.
  4. Pojmenujte novou hodnotu TcpAckFrequencya přiřaďte jí hodnotu 1.
  5. Ukončete Editor registru.
  6. Windows, tato změna se projeví až po restartování.

Metoda 4: Změňte chování vyrovnávací paměti v souboru Afd.sys sockets non-blocking.

Důležité Tento oddíl, metoda nebo úkol obsahuje kroky, které informace o úpravě registru. Však mohou nastat závažné problémy při nesprávných úpravách registru. Proto se ujistěte, opatrně postupujte takto. Pro zvýšení ochrany před úpravami je nutné zálohujte registr. Můžete pak obnovení registru v případě, že dojde k potížím. Další informace o zálohování a obnovení registru získáte článku znalostní báze Microsoft Knowledge Base:
322756 Postup při zálohování a obnovení registru v systému Windows


Poznámka: Tento klíč registru je dostupná pouze pro systém Windows Server 2003 s aktualizací Service Pack 1 a dalších aktualizací service Pack.
  1. Klepněte na tlačítko Spustit, typ Regedit.exea klepněte na tlačítko OK.
  2. Vyhledejte a klepněte na následující podklíč registru:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters
  3. V Upravit příkaz Novýa klepněte na tlačítko Hodnota DWORD.
  4. Pojmenujte novou hodnotu NonBlockingSendSpecialBufferinga přiřaďte jí hodnotu 1.
  5. Ukončete Editor registru.
  6. Windows, tato změna se projeví až po restartování.

Prohlášení

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části "Platí pro".

Odkazy

328890 Nové položky registru pro řízení chování TCP potvrzení (ACK) v systému Windows XP a Windows Server 2003

Vlastnosti

ID článku: 823764 - Poslední aktualizace: 20. května 2011 - Revize: 7.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
  • Microsoft Windows Server 2003, Web Edition
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Professional
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows 2000 Server
  • Windows Server 2008 Datacenter without Hyper-V
  • Windows Server 2008 Enterprise without Hyper-V
  • Windows Server 2008 for Itanium-Based Systems
  • Windows Server 2008 Standard without Hyper-V
  • Windows Server 2008 Datacenter
  • Windows Server 2008 Enterprise
  • Windows Server 2008 Standard
  • Windows Web Server 2008
Klíčová slova: 
kbprb kbmt KB823764 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:823764

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com