Uso nel mondo reale di TCP_DEFER_ACCEPT?


15

Stavo esaminando il manuale httpd di Apache online e mi sono imbattuto in una direttiva per abilitare questo. Trovato una descrizione nella pagina man per tcp:

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

Quindi ho trovato questo articolo, ma non sono ancora chiaro per quale tipo di carichi di lavoro sarebbe utile. Suppongo che se httpdha un'opzione specifica per questo, deve avere una certa rilevanza per i server Web. Suppongo anche che sia un'opzione e non solo httpdle connessioni di rete, che ci sono casi d'uso in cui lo si desidera e altri in cui non lo si desidera.

Anche dopo aver letto l'articolo, non sono chiaro quale sarebbe il vantaggio di aspettare il completamento della stretta di mano a tre vie. Sembrerebbe vantaggioso assicurarsi che non sarà necessario scambiare l' httpdistanza pertinente facendo ciò mentre l'handshake è ancora in corso invece di causare potenzialmente quel ritardo dopo che si è formata una connessione.

Per l'articolo, mi sembra anche che, indipendentemente dallo TCP_DEFER_ACCEPTstato di un socket, avrai ancora bisogno di quattro pacchetti (stretta di mano e dati in ciascun caso). Non so come ottengano il conteggio fino a tre, né come ciò fornisca un miglioramento significativo.

Quindi la mia domanda è fondamentalmente: è solo una vecchia opzione obsoleta o esiste un caso d'uso reale per questa opzione?


Non sono chiaro su cosa intendi per "portare il conteggio a tre", il che mi fa sospettare che tu fraintenda la stretta di mano a tre vie. Questa è una transazione TCP "open connection" ed è composta da 3 pacchetti trasmessi in totale. Fino al completamento di questi 3, non ci sono dati e nessuna connessione è valida. Poiché tali dati non incidono mai sul sovraccarico dell'handshaking. L'aumento di efficienza che si otterrebbe da TCP_DEFER_ACCEPT sarebbe il divario tra il completamento dell'handshake TCP 3 way "accetta" e il primo pacchetto di dati (presumo, principalmente qui per commentare l'handshake 3 vs 4 way)
Iiain

Inoltre, non si tratta di evitare lo "scambio", non di sprecare risorse. Se lo scambio doveva diventare un fattore nell'attivazione di un lavoratore HTTP, allora stai forzando il lavoratore a scambiarsi prematuramente nel punto di accettazione prima che i dati siano pronti ... e se lo scambio sta avvenendo, ciò significa che stai forzando qualcos'altro ram ... qualcosa che forse stava facendo qualcosa e viene scambiato tra la tua parte accetta / dati ... qualunque risorsa - CPU, diskIO, pagine in-ram, se non ci sono dati, allora non ha senso causare lavoro.
Iain

Se il processo di lavoro è già in memoria, la latenza è piuttosto bassa rispetto a quella che potrebbe essere quella di andare su disco? Il "down to three" è un riferimento all'articolo in cui si afferma che in qualche modo ciò renderebbe il primo pacchetto di dati dal client al terzo pacchetto.
Bratchley,

Inoltre, lo scambio teorico avverrà comunque, questo non cambierebbe con questa opzione TCP. Non vedo come sia utile eliminare il gap dalla formazione della connessione TCP e metterlo nel trasferimento dei dati. Almeno quando lo fai durante la formazione della connessione TCP c'è la possibilità che i due avvengano in parallelo (diminuendo la quantità di tempo).
Bratchley,

Avrei dovuto semplicemente scrivere una risposta ... Riguardo al fatto che si tratta di un'opzione, beh, non è il modo in cui funzionano gli standard unix "normali" ... In particolare per quanto riguarda HTTP il punto chiave è che il client (browser) avvia la conversazione con il OTTIENI linea ... Quindi al server non interessa la connessione effettiva, solo i primi dati. Al contrario di dire SMTP che richiede al client di attendere fino a quando il server emette il suo messaggio "220 banner di benvenuto". Vale a dire che il server deve sapere sulla connessione, non sui dati.
Iain

Risposte:


14

(per riassumere i miei commenti sul PO)

L'handshake a tre vie a cui si riferiscono fa parte dell'istituzione della connessione TCP, l'opzione in questione non si riferisce specificamente a questo. Si noti inoltre che lo scambio di dati non fa parte dell'handshake a tre vie, questo crea semplicemente la connessione TCP nello stato aperto / stabilito.

Per quanto riguarda l'esistenza di questa opzione, questo non è il comportamento tradizionale di un socket, normalmente il thread del gestore socket viene svegliato quando viene accettata la connessione (che è ancora dopo il completamento dell'handshake a tre vie), e per alcuni protocolli l'attività inizia qui ( ad es. un server SMTP invia una linea di saluto 220), ma per HTTP il primo messaggio nella conversazione è il browser Web che invia la sua linea GET / POST / etc, e fino a quando ciò accade il server HTTP non ha alcun interesse per la connessione (diverso dai tempi ), quindi riattivare il processo HTTP quando il socket accetta è un'attività dispendiosa poiché il processo si riaddormenterà immediatamente in attesa dei dati necessari.

Sebbene vi sia certamente argomento secondo cui il risveglio dei processi inattivi può renderli "pronti" per ulteriori elaborazioni (ricordo in particolare di aver svegliato i terminali di accesso su macchine molto vecchie e di averli collegati da swap), ma puoi anche sostenere che qualsiasi macchina che ha scambiato detto processo sta già facendo richieste sulle sue risorse e fare ulteriori richieste non necessarie potrebbe ridurre complessivamente le prestazioni del sistema - anche se le prestazioni apparenti del singolo thread migliorano (cosa che potrebbe anche non fare, una macchina estremamente occupata avrebbe colli di bottiglia sul disco IO che rallenta altre cose se ti sei scambiato, e se è così occupato, il sonno immediato potrebbe scambiarlo immediatamente. Sembra una scommessa, e alla fine la scommessa "avida" non paga necessariamente su una macchina occupata,

Il mio consiglio generale riguardo a quel livello di ottimizzazione delle prestazioni sarebbe di non prendere decisioni programmatiche su ciò che è meglio comunque, ma di consentire all'amministratore di sistema e al sistema operativo di lavorare insieme per affrontare i problemi di gestione delle risorse - questo è il loro lavoro e sono molto più adatto a comprendere i carichi di lavoro dell'intero sistema e oltre. Fornisci opzioni e opzioni di configurazione.

Per rispondere in modo specifico alla domanda, l'opzione è vantaggiosa su tutte le configurazioni, non al livello che probabilmente noteresti, tranne che sotto un carico estremo di traffico HTTP, ma è teoricamente il modo "giusto" per farlo. È un'opzione perché non tutte le versioni Unix (nemmeno tutte Linux) hanno questa capacità, e quindi per la portabilità può essere configurata per non essere inclusa.


Grazie per l'ottimo riassunto. Mentre il caricamento del server e lo scambio / riattivazione del processo inattivo rappresentano un potenziale vantaggio (uno che è sfumato come hai detto), ci sono chiari vantaggi se si osserva un server HTTP che serve client a latenza alta e bassa. Ad esempio, quando si esegue il server Web Apache, è disponibile un numero fisso di processi / thread del server, il che significa che è possibile servire un numero fisso di client in qualsiasi momento. Quindi non "utilizzare" un processo server mentre il pacchetto "dati" da un client non è arrivato potrebbe significare che il processo server potrebbe servire un altro client nel frattempo.
Ram

-1

Non sono chiaro quale sarebbe il vantaggio di attendere il completamento della stretta di mano a tre vie.

Le strette di mano a tre vie sono un protocollo comune nella telefonia vocale:

  1. Server : "Buon pomeriggio, Epiphyte Corp."
  2. Caller : "Ciao, sono Randy."
  3. Server : "Sì, come posso aiutarti?"
  4. Chiamante : il corpo della chiamata inizia a richiedere uno scherzo

Sono importanti in TCP per garantire che il canale sia stabilito. Se il client ha iniziato a inviare il corpo della chiamata prima di ascoltare (3) è possibile che il server non ascolti o non sia pronto. L'udito (3) non garantisce che il Server non abbia subito subito la combustione spontanea dopo la trasmissione, ma aumenta la sicurezza che il Server è pronto a ricevere.

Come notato in Wikipedia sull'handshaking :

  1. Alice [Server] risponde con un messaggio di riconoscimento con il numero di riconoscimento y + 1, che Bob [Client] riceve e al quale non ha bisogno di rispondere .

Quindi, se si è disposti a rinunciare a un po 'più di certezza sul fatto che il server sia pronto, Server può saltare il passaggio (3) e il client supporrà semplicemente che il server fosse pronto. Ciò trasforma lo scambio di protocollo sopra in:

  1. Server : "Buon pomeriggio, Epiphyte Corp."
  2. Caller : "Ciao, sono Randy."
  3. Caller : "Conosci qualche battuta su Imelda Marcos?"

È più di una semplice fiducia, che invii prima che la 3way sia completa e che i tuoi dati vengano acquisiti. Il modo in cui le connessioni TCP sono impostate nei moderni stack del sistema operativo in realtà non ci sono dati di connessione registrati nelle tabelle fino alla terza parte della connessione, il requisito del terzo messaggio prima che vengano consumate tutte le risorse viene fatto tramite l'uso di "Syn Cookies" e impedisce "Syn Attacks" (che sono il pacchetto di handshake forged-ip-ip 1. il suo pacchetto 3 che mina l'ip di sorgente forgiato). Quindi chiaramente nessuna connessione o voce perché esiste prima di questo punto.
Iain

L'udito (3) non garantisce che il Server non abbia subito subito la combustione spontanea dopo la trasmissione, ma aumenta la sicurezza che il Server è pronto a ricevere.
msw,

Aumentare? Da zero? Beh sì, immagino che sia vero, ma la maggior parte delle persone implicherebbe che prima del pacchetto 3 c'era / alcune / possibilità di aumentare. E non c'è. È solo la frase "aumentare la fiducia" che non mi piace, e non credo che il factoring nello 0,001% dei "problemi principali del mondo reale" aiuti a chiarire il problema. Certo, la guerra nucleare potrebbe accadere prima che il server riceva il pacchetto, potrebbero succedere molte cose.
Iain

Inoltre ho appena ripreso l'ultimo paragrafo, in cui si implica che il passaggio 3 è facoltativo. Non lo è, assolutamente no. Rileggi il paragrafo, il passaggio 3 è "alice risponde con un riconoscimento". questo non è facoltativo. bob risponde a questo (un quarto passo teorico) è.
Iain
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.