GNU/Linux >> Znalost Linux >  >> Linux

Kdy mám použít TCP_NODELAY a kdy TCP_CORK?

Je to optimalizace, takže jako každá optimalizace:

  1. Nepoužívejte jej
  2. Počkejte, až se výkon stane problémem, a poté určíte, že latence soketu je určitě příčinou, a testování prokáže, že to určitě vyřeší A toto je nejjednodušší způsob, jak to opravit, udělejte to.

V zásadě je cílem vyhnout se nutnosti posílat několik snímků, kde lze použít jeden snímek, pomocí sendfile() a jejích přátel.

Takže například na webovém serveru odešlete hlavičky následované obsahem souboru, hlavičky se sestaví v paměti a soubor pak odešle přímo jádro. TCP_CORK umožňuje posílat záhlaví a začátek souboru v jediném rámci, a to i s TCP_NODELAY, což by jinak způsobilo okamžité odeslání prvního bloku.


TCP_NODELAY

Používá se k deaktivaci Nagleova algoritmu ke zlepšení sítí TCP/IP a snížení počtu paketů čekáním na potvrzení dříve odeslaných dat pro odeslání nashromážděných paketů.

//Z příručky tcp(7):

TCP_CORK (nebo TCP_NOPUSH ve FreeBSD)

Pokud je nastaveno, neposílejte částečné snímky. Všechny dílčí rámce zařazené do fronty jsou odeslány, když je volba opět zrušena. To je užitečné pro předřazení záhlaví před voláním sendfile(2) nebo pro optimalizaci propustnosti. V současné době existuje strop 200 milisekund na dobu, po kterou je výstup zazátkován TCP_CORK . Pokud je dosaženo tohoto limitu, automaticky se přenesou data ve frontě . Tuto možnost lze kombinovat s TCP_NODELAY pouze od Linuxu 2.5.71. Tato možnost by se neměla používat v kódu, který má být přenosný.


Za prvé, ne oba deaktivují Nagleův algoritmus.

Algoritmus Nagle je pro snížení většího počtu malých síťových paketů v drátu. Algoritmus je:pokud jsou data menší než limit (obvykle MSS), počkejte na přijetí ACK pro dříve odeslané pakety a mezitím shromažďujte data od uživatele. Poté odešlete nashromážděná data.

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

To pomůže v aplikacích, jako je telnet. Čekání na potvrzení ACK však může zvýšit latenci při odesílání datových proudů. Pokud navíc přijímač implementuje „politiku zpožděného ACK“, způsobí to dočasné zablokování. V takových případech je lepší volbou deaktivovat Nagleův algoritmus.

Proto se TCP_NODELAY používá pro deaktivaci Nagleova algoritmu.

TCP_CORK agresivně shromažďuje data. Pokud je TCP_CORK povoleno v soketu, nebude odesílat data, dokud se vyrovnávací paměť nenaplní na pevný limit. Podobně jako Nagleův algoritmus také shromažďuje data od uživatele, ale dokud se vyrovnávací paměť nenaplní na pevný limit, až po obdržení ACK. To bude užitečné při odesílání více bloků dat. Při používání TCP_CORK však musíte být opatrnější.

Až do jádra 2.6 se obě tyto možnosti vzájemně vylučují. Ale v pozdějším jádře mohou oba existovat společně. V takovém případě bude mít větší přednost TCP_CORK.

Ref:

  • http://baus.net/on-tcp_cork/
  • http://ccr.sigcomm.org/archive/2001/jan01/ccr-200101-mogul.pdf

Linux
  1. Kdy bych měl použít koncové lomítko v adresáři?

  2. Kdy použít Nohup?

  3. Kdy byste měli kompilovat a instalovat ze zdroje?

  1. Distribuovaná databáze NoSQL Elasticsearch – co to je a měli byste ji používat?

  2. Kdy použít dedikovaný server

  3. Kdy použít pthread_exit() a kdy pthread_join() v Linuxu?

  1. Antivirus na Linuxu:Měl bych jej skutečně používat a pokud ano, kdy jej potřebuji?

  2. Kdy je Dd vhodné pro kopírování dat? (neboli, kdy jsou čtení() a zápis() částečné)?

  3. Kdy použít Bash a kdy Perl/Python/Ruby?