Použijte TCP_QUICKACK, nikoli TCP_NODELAY
Zapnutí TCP_NODELAY má podobné účinky, ale může zhoršit propustnost pro malé zápisy. Pokud zapíšete smyčku, která odešle pouze několik bajtů (v nejhorším případě jeden bajt) do soketu pomocí "write()" a algoritmus Nagle je deaktivován pomocí TCP_NODELAY, každý zápis se stane jedním IP paketem. To zvyšuje provoz o faktor 40, s IP a TCPheaders pro každé užitečné zatížení. Prevence Tinygram vám nedovolí odeslat druhý paket, pokud máte jeden za letu, pokud nemáte dostatek dat k naplnění paketu maximální velikosti. Shromažďuje bajty po dobu jedné zpáteční cesty a poté odešle vše ve frontě. To je téměř vždy to, co chcete. Pokud máte nastaven TCP_NODELAY, musíte si být mnohem více vědomi problémů s ukládáním do vyrovnávací paměti a vyprázdněním. Na ničem z toho nezáleží u hromadných jednosměrných přenosů, což je dnes většina HTTP. (Nikdy jsem nezkoumal dopad tohoto na SSL handshake, kde by to mohlo záležet.) Zkrácená verze:nastavte TCP_QUICKACK. Pokud najdete případ, kdy to dělá věci horší, dejte mi vědět. John Nagle
https://news.ycombinator.com/item?id=10608356
Mezi těmito dvěma možnostmi není žádný přímý vztah, jsou pouze pro různé účely.
TCP_NODELAY je určen k zakázání/povolení ukládání do vyrovnávací paměti segmentů, aby mohla být data odeslána do peeru co nejrychleji, takže se to obvykle používá ke zlepšení využití sítě. TCP_QUICKACK se používá k odesílání potvrzení co nejdříve, než je zpožděno při výměně na úrovni protokolu a není stabilní/trvalé, následné transakce TCP (které se mohou stát pod kapotou) mohou tuto možnost ignorovat v závislosti na skutečném zpracování na úrovni protokolu nebo jakýchkoli skutečných neshodách mezi uživatelským nastavením a chováním zásobníku.
POZNÁMKA TCP_NODELAY
je přenosný v době TCP_QUICKACK
není (funguje pouze pod Linuxem 2.4.4+).
TCP_QUICKACK
a TCP_NODELAY
ovlivnit různé operace v TCP. tcp(7)
manuálová stránka popisuje, které volby soketu pro TCP se vzájemně ruší, např. TCP_CORK
a TCP_NODELAY
.
Krátká odpověď
- Chcete-li deaktivovat Nagleův algoritmus ukládání do vyrovnávací paměti, použijte volbu soketu TCP_NODELAY.
- Chcete-li deaktivovat zpožděná ACK, použijte možnost soketu TCP_QUICKACK.
Podrobnosti
-
Nagleův algoritmus
- Algoritmus Nagle, pojmenovaný po svém tvůrci Johnu Nagleovi, je jedním z mechanismů pro zlepšení účinnosti TCP snížením počtu malých paketů odeslaných přes síť.
- Cílem bylo zabránit uzlu v přenosu mnoha malých paketů, pokud aplikace doručuje data do soketu poměrně pomalu.
- Pokud proces způsobuje přenos mnoha malých paketů, může to způsobit nepřiměřené zahlcení sítě. To platí zejména v případě, že je užitečné zatížení paketu menší než data hlavičky TCP.
-
Zpožděné ACK
- Zpožděné potvrzení TCP nebo zpožděné ACK je další technika používaná některými implementacemi TCP ve snaze zlepšit výkon sítě a snížit přetížení.
- Zpožděné ACK bylo vynalezeno, aby se snížil počet ACK potřebných k potvrzení segmentů a snížila se režie protokolu.
- Zpožděné ACK znamená, že protokol TCP okamžitě nepotvrdí každý jednotlivý přijatý segment TCP. Několik odpovědí ACK lze kombinovat do jediné odpovědi, což snižuje režii protokolu.
-
Nagleův algoritmus a zpožděné ACK spolu nehrají dobře v síti TCP/IP
- Zpožděné ACK se pokusí odeslat více dat na segment, pokud je to možné. Ale část Nagleova algoritmu závisí na ACK pro odesílání dat.
- Nagleův algoritmus a zpožděná ACK společně vytvářejí problém, protože zpožděná ACK čekají na odeslání ACK, zatímco Nagle's čeká na přijetí ACK
-
Jak mohu vyřešit problémy způsobené Nagleovým algoritmem a zpožděnými ACK
- Povolením TCP_NODELAY zakážete Nagleův algoritmus prostřednictvím možností globálního soketu na serverech
- Vylepšení profilu na proxy serverech a nástrojích pro vyrovnávání zatížení:Toto je zvláště důležité, pokud spouštíte aplikace nebo prostředí, která mají pouze někdy vysoce interaktivní provoz a chatovací protokoly. Dynamickým zapínáním a vypínáním Nagle's Algorithm a TCP_NODELAY na úrovni nástroje pro vyrovnávání zatížení můžete udržovat optimální provoz i vysoce heterogenních mixů provozu.
- Snižte časovač zpožděného ACK na serverech a nástrojích pro vyrovnávání zatížení. Někdy je tento druh optimalizace řešen softwarově na aplikační úrovni, ale pokud tomu tak není, stále můžete být schopni dynamicky spravovat časovač ACK na úrovni serveru nebo load balanceru.
- Během provádění těchto změn pečlivě sledujte provoz v síti a sledujte, jak každé vyladění ovlivňuje přetížení.
Další podrobnosti naleznete zde