GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è l'effetto dell'impostazione di un socket linux - alta priorità?

Ogni interfaccia di rete Linux ha un cosiddetto qdisc (disciplina di accodamento) ad essa annessa. E la risposta alle tue domande dipende dal qdisc in uso. Alcune discipline di accodamento come pfifo e bfifo non hanno il concetto di priorità. Quindi, se vengono utilizzati, la risposta è semplice:non ci sarà alcuna priorità

Tuttavia, con un qdisc di priorità come pfifo_fast (che in genere è il qdisc predefinito su Linux), la priorità del socket può avere effetto.

Questa immagine descrive cosa sta succedendo in un qdisc pfifo_fast:

Vediamo che i pacchetti vengono messi in coda a seconda della loro priorità. Quando arriva il momento in cui l'interfaccia invia il pacchetto successivo (frame in realtà, ma non entriamo in questo), sceglierà sempre di inviare il pacchetto con la massima priorità. Ciò significa che se più pacchetti sono in attesa, quelli con la priorità più alta verranno inviati per primi . Nota che ciò richiede che l'interfaccia sia congestionata:se l'interfaccia non è congestionata e i pacchetti vengono inviati non appena arrivano dal sistema operativo, allora non c'è accodamento e quindi nessuna priorità.

Altri qdisc hanno strutture e politiche diverse. Ad esempio un SFQ qdisc:

Con questo in mente, torniamo alle tue domande:

  1. A seconda del qdisc, sì, pacchetti da socket_11 può essere inviato prima dei pacchetti da altri socket. Se pfifo_fast viene utilizzato e se socket_11 invia abbastanza traffico per saturare l'interfaccia di rete in uscita, quindi i pacchetti dagli altri socket potrebbero anche non essere inviati affatto. Ciò è improbabile nella pratica poiché di solito è difficile saturare un'interfaccia di rete prima di saturare qualche altra risorsa, a meno che non si tratti di un'interfaccia wireless.

  2. Il percorso che i pacchetti prendono dall'interfaccia di rete della macchina al socket è molto più veloce della rete stessa. E, come ricorderete, affinché la definizione delle priorità abbia effetto, deve esserci congestione. In uno scenario tipico, i pacchetti che hanno raggiunto la tua interfaccia di rete hanno già superato il collo di bottiglia del loro viaggio attraverso la rete, quindi la congestione è improbabile.

    Ovviamente puoi utilizzare un qdisc in ingresso o altri meccanismi per creare artificialmente un collo di bottiglia e dare la priorità al traffico in entrata. Ma perché dovresti? Ciò ha senso solo se stai costruendo un traffic shaper o un dispositivo di rete simile. Inoltre, poiché questi qdisc sono un meccanismo di basso livello che si verifica ben al di sotto dei socket di livello superiore (anche prima del bridging o del routing), dubito che la priorità del socket possa avere alcun effetto su in.

  3. Non che io sappia, ma sarei felice di imparare. Questo modulo del kernel si avvicina, ma non sembra essere in grado di mostrare i flag di priorità, solo le normali opzioni del socket.


Risposte alle tue domande:

  1. Sì per impostazione predefinita, la spiegazione è sotto
  2. Nessuna priorità funziona solo in invio, anche la spiegazione è sotto
  3. Non credo perché questa opzione non è visibile nemmeno tramite l'interfaccia /proc

Dettagli su 1

Alcune parole su priorità, code di rete e discipline dei dispositivi. Tutto questo è legato alla qualità del servizio e in particolare ai Servizi Differenziati (DiffServ).

Quando il pacchetto viene inviato, viene inserito nell'interfaccia "coda" elaborata dal dispositivo di rete. Per impostazione predefinita, la coda non è una coda reale ma tre fifo reali con una forte priorità. Se c'è un pacchetto in fifo0 rispetto ai pacchetti in fifo1 in attesa. La priorità del socket è mappata a questo fifo mediante la seguente mappatura:

  • 0 (Best Effort) è fifo1
  • 1-3 (Filler, Bulk, ...) è fifo2
  • 4 è fifo1
  • 5 è fifo2
  • 6-7 (Interattivo, Controllo) è fifo0
  • 8-15 è fifo1

Quindi la priorità 1 verrà inviata dopo la priorità 0.

Per modificare il comportamento predefinito viene utilizzata l'utilità "controllo del traffico" (tc). Con esso è possibile configurare le code prioritarie sull'interfaccia di rete. Questa è la cosiddetta "disciplina di accodamento dei dispositivi". Puoi definire come vengono servite le priorità dal particolare dispositivo di rete (la risposta di Malt ha una buona spiegazione di questo).

Dettagli su 2

Socket ha stati "pronto per la lettura"/"non pronto per la lettura" e questo è bool. Se qualche dato arriva al socket non pronto, cambia stato da "non pronto" a "pronto" e questo viene visto da funzioni come select/poll o dal ritorno da una chiamata recv bloccata. Quale thread verrà svegliato non dipende dalla priorità del socket ma dalla priorità del thread.

Quindi, se vuoi dare la priorità ai socket, hai bisogno di

  • inserirli in thread con priorità
  • o assegna priorità per codice dopo selezione/sondaggio

Linux
  1. Qual è lo scopo del file .bashrc in Linux

  2. Qual è la posizione corretta del file mysql.sock su Linux

  3. Qual è la definizione di una sessione in Linux?

  4. Che cos'è un comando per trovare la priorità del processo in Linux?

  5. Qual è l'ordine predefinito dell'ordinamento di Linux?

Cos'è il comando Linux Watch + Esempi

Che cos'è la shell in Linux?

Qual è la differenza tra Linux e Unix?

Visualizza le informazioni di rete in Linux utilizzando quale strumento IP

Come modificare la priorità di un processo in Linux

Qual è il comando kill in Linux?