Každé síťové rozhraní Linuxu má takzvaný qdisc (disciplína ve frontě) k němu připojená. A odpověď na vaše otázky závisí na používaném disku qdisc. Některé disciplíny řazení do fronty jako pfifo a bfifo nemají žádnou koncepci priority. Pokud se tedy použijí, odpověď je jednoduchá – nebude žádná prioritizace
Nicméně s upřednostňováním qdiscu, jako je pfifo_fast (což je typicky výchozí qdisc v Linuxu), může mít priorita soketu vliv.
Tento obrázek popisuje, co se děje na pfifo_fast qdisc:
Vidíme, že pakety jsou umístěny ve frontách v závislosti na jejich prioritě. Až přijde čas, aby rozhraní odeslalo další paket (rámec ve skutečnosti, ale nezabíhejme do toho), vždy zvolí odeslání paketu s nejvyšší prioritou. To znamená, že pokud čeká více paketů, budou nejprve odeslány ty s nejvyšší prioritou . Všimněte si, že to vyžaduje zahlcení rozhraní – pokud rozhraní není zahlcené a pakety se odesílají, jakmile dorazí z operačního systému, pak nedochází k frontě a tedy ani k prioritizaci.
Jiné qdisky mají různé struktury a zásady. Například SFQ qdisc:
S ohledem na to se vraťme k vašim otázkám:
-
V závislosti na qdisc ano, pakety z
socket_11
mohou být odeslány před pakety z jiných soketů. Pokudpfifo_fast
a pokudsocket_11
odešle dostatek provozu k nasycení odchozího síťového rozhraní, pakety z ostatních soketů dokonce nemusí být odeslány vůbec. To je v praxi nepravděpodobné, protože je obvykle obtížné nasytit síťové rozhraní před nasycením jiného zdroje, pokud se nejedná o bezdrátové rozhraní. -
Cesta, kterou pakety procházejí ze síťového rozhraní stroje do soketu, je mnohem rychlejší než samotná síť. A jak si vzpomínáte, aby mělo stanovení priorit nějaký účinek, musí dojít k přetížení. V typickém scénáři pakety, které dosáhly až k vašemu síťovému rozhraní, již prošly úzkým hrdlem své cesty po síti, takže přetížení je nepravděpodobné.
Můžete samozřejmě použít vstupní qdisc nebo jiné mechanismy k umělému vytvoření úzkého hrdla a upřednostnění příchozího provozu. Ale proč bys? To dává smysl pouze v případě, že budujete tvarovač provozu nebo podobné síťové zařízení. Navíc, protože tyto qdisky jsou nízkoúrovňový mechanismus, který se odehrává hluboko pod sokety vyšší úrovně (dokonce před přemostěním nebo směrováním), pochybuji, že by priorita soketu mohla mít nějaký vliv na in.
-
Ne že bych si toho byl vědom, ale rád se poučím. Tento modul jádra se blíží, ale nezdá se, že by byl schopen zobrazit příznaky priority, pouze běžné volby soketu.
Odpovědi na vaše otázky:
- Ano, ve výchozím nastavení je vysvětlení níže
- Žádné priority nefungují pouze při odesílání, vysvětlení je také uvedeno níže
- Nemyslím si to, protože tato možnost není vidět ani přes rozhraní /proc
Podrobnosti o 1
Několik slov o prioritách, síťových frontách a disciplínách zařízení. Všechny tyto věci souvisí s kvalitou služeb a zejména s diferencovanými službami (DiffServ).
Když je paket odeslán, zařadí se do "fronty" rozhraní, které zpracuje síťové zařízení. Ve výchozím nastavení fronta není skutečná fronta, ale tři skutečné fifo, které mají silnou prioritu. Pokud je paket ve fifo0, pak pakety ve fifo1 čekají. Priorita soketu je na toto fifo mapována následujícím mapováním:
- 0 (nejlepší úsilí) je fifo1
- 1-3 (Filler, Bulk, ...) je fifo2
- 4 je fifo1
- 5 je fifo2
- 6-7 (Interactive, Control) je fifo0
- 8-15 je fifo1
Takže priorita 1 bude odeslána po prioritě 0.
Pro změnu výchozího chování se používá utilita "traffic control" (tc). S ním můžete konfigurovat prioritní fronty na síťovém rozhraní. Toto je takzvaná "disciplína řazení zařízení". Můžete definovat, jak jsou priority obsluhovány konkrétním síťovým zařízením (odpověď Malta to dobře vysvětluje).
Podrobnosti o 2
Socket má stavy "připraveno pro čtení"/"nepřipraveno pro čtení" a toto je bool. Pokud nějaká data dorazí do nepřipraveného soketu, změní se stav z „nepřipraveno“ na „připraveno“ a to se projeví funkcemi jako select/polll nebo návratem z blokovaného recv volání. Jaké vlákno bude probuzeno, nezávisí na prioritě soketu, ale na prioritě vlákna.
Pokud tedy chcete upřednostnit zásuvky, potřebujete
- buď je umístěte do prioritních vláken
- nebo upřednostnit podle kódu po výběru/dotazování