Hlavní navigace

Trickle: rozdělte své připojení

Petr Krčmář

Určitě se vám stalo, že jste potřebovali spustit nějakou aplikaci, která ale příliš vytěžovala vaše internetové připojení. Vy jste ale ještě potřebovali dělat s internetem něco jiného a program neměl správnou volbu, která by jej zpomalila. Trickle vám pomůže rozdělit připojení mezi jednotlivé aplikace.

Co je Trickle?

Jistě se vám to někdy stalo: potřebovali jste spustit nějakou aplikaci, která komunikuje po internetu, ale zároveň jste nechtěli, aby „zkonzumovala“ veškerou šířku pásma vašeho připojení.

U některých programů je možno nastavit, jak moc mohou linku využívat, existuje ale i mnoho takových, které tuto volbu nemají a běžně tak neexistuje způsob, jak je omezit.

Program s jednoduchým názvem Trickle. Ten dokáže téměř jakékoliv konkrétní aplikaci omezit rychlost komunikace se zbytkem světa. Původně byla aplikace vyvinuta pro OpenBSD, běží ale i na dalších unixových systémech: Solaris, NetBSD, FreeBSD a Linux.

Typicky se takový postup může hodit ve chvíli, kdy chcete stahovat větší množství dat skrze BitTorrent, ale nechcete omezovat zbytek sítě či svou vlastní linku, kterou potřebujete používat pro další práci. Pokud neexistuje jiná možnost, můžete použít výhod Trickle.

Jak to funguje?

Trickle využívá výhod dynamického linkování knihoven a především „preloadingu“ funkcí. Pomocí této techniky je aplikace schopná vnutit se mezi aplikaci a systémové knihovny a implementovat vlastní funkce pro komunikační API.

Pokud se to stane, prochází veškerý následující datový tok právě přes Trickle, který dokáže tekoucí data sledovat a především ovlivňovat. Dokáže plynule „zaškrcovat“ TCP komunikaci s aplikací a tím ovlivňovat maximální rychlost, jakou program komunikuje a zatěžuje linku.

Výhody a nevýhody

Z výše zmíněného plynou zároveň výhody i nevýhoda programu Trickle.

Výhody:

  • je naprosto univerzální,
  • nevyžaduje práva administrátora,
  • velmi jednoduché použití.

Nevýhoda:

  • nefunguje u staticky linkovaných aplikací.

Jdeme se omezit

Program pravděpodobně naleznete ve své distribuci, pokud ne, budete jej muset přeložit. Zdrojové kódy jsou ke stažení na domovské stránce.

Použití je poměrně jednoduché. Trickle umí běžet samostatně nebo pod dohledem společného démona (trickled). Zatím si popíšeme první, jednodušší variantu. Zajímat nás bude především parametr -d jako download, za který přidáme ještě číslo udávající maximální rychlost downloadu (v KiB/s), kterou může aplikace využít. Dále uvedeme samotný program (i s parametry), který má Trickle obhospodařit. Příklad:

$ trickle -d 50 ftp stroj.sit.cz

Program se normálně spustí a začne pracovat, pokud začne komunikovat s okolím, bude jeho rychlost shora omezena 50 KiB/s. Bohužel tuto hodnotu už nemůžeme během používání aplikace nijak měnit.

Pokud si chcete Trickle jen tak vyzkoušet, můžete použít například wget, který, ačkoliv má sám parametr pro omezení rychlosti, se nechá zpomalit a navíc vám v reálném čase ukáže, jak rychle stahuje.

Kromě této nejjednodušší možnosti můžeme stejně omezit také upload (parametr -u) a nastavit některé další detaily jako intervaly sledování přenosu (pro plynulost běhu) a další.

Démon trickled

Už jsem zmínil možnost centrální správy jednotlivých trickle sezení pomocí centrálního démona. Ten může běžet na stejném stroji jako klienti, kteří jej využívají, může být ale také provozován po vnitřní síti a obsluhovat tak software na mnoha počítačích naráz.

Další příklad: budeme chtít spustit několik různých aplikací pro stahování najednou, ale celkově chceme akci přidělit maximálně 70 KiB/s. Nechceme ale sledovat, kdy které aplikace končí a přerozdělovat složitě zbývající pásmo ostatním. Pustíme tak démona:

$ trickled -d 70

a následně pustíme stahování

$ trickle wget jeden_soubor
$ trickle wget druhy_soubor
$ trickle wget treti_soubor
...

Vše bude fungovat dle očekávání: klienti se dotáží démona, kolik pásma jim přidělí a podle toho se omezí. Dotazování probíhá dynamicky, takže můžeme libovolně jednotlivé úlohy přidávat či odebírat a démon bude stále hlídat celkový strop, který nebude překročen.

Složitější dělení

Výše uvedený příklad ale předpokládá, že všem omezovaným procesům přidělíme stejnou část pásma. Můžeme ale chtít některým aplikacím dát více a některým méně. Proto existuje konfigurační soubor trickled.conf, který je poměrně jednoduchý a dělí procesy podle aplikací. Může vypadat například takto:

[ssh]
 Priority = 1
 Time-Smoothing = 0.1
 Length-Smoothing = 2
[ftp]
 Priority = 8
 Time-Smoothing = 5
 Length-Smoothing = 20

Cestu k tomuto souboru předáváme démonovi pomocí parametru -c. Vidíte, že ssh dostává vyšší prioritu a kratší čas sledování toku, což je nastavení vhodnější pro interaktivní aplikace. Naopak u ftp je plynulost a rychlost přenosu méně podstatná, takže dostává méně pozornosti a nižší prioritu.

Závěrem

Trickle nabízí velmi jednoduchou cestu omezování rychlostí jednotlivých aplikací, i celých skupin programů, které by neměly využívat vaše připojení k internetu naplno. Velkou výhodou je, že jej může obsluhovat i běžný uživatel bez práv roota a jeho použití je navíc velmi snadné.

Našli jste v článku chybu?
4. 8. 2008 20:30
Ještě jsem chtěl navrhnout, jak by se daná věc dala vyřešit ideálně. Vyžaduje to ovšem roota. Myšlenka je v podstatě taková, že počítač se chová jako omezjící NAT pro virtuální síťová rozhraní na tomtéž stroji, přičemž každé aplikaci je přiřazeno vlastní rozhraní. Implementaci bych si představoval tak, že běží démon s právy měnit konfiguraci sítě. Ve chvíli, kdy se spustí zaškrcená aplikace, nějaký wrapper tomuto démonu předá příslušný PID. Démon vytvoří nové rozhraní, nastaví mu požadované pa…
4. 8. 2008 20:09

Hlavní problém je, že se to děje na příliš vysoké úrovni. :|

Je sice pravda, že průměrnou přenosovou rychlost lze takhle omezit, ale fakticky se např. při stahování stane tohle:

klient naváže spojení a pošle požadavek (to asi zpomalené nebude, protože je málo) server začne posílat data klient začne plnit TCP buffery; protože každý přijatý paket v tuto chvíli potvrzuje, velikost TCP okna se poměrně rychle zvětšuje; v tuto chvíli je stahující proces schopen zcela zahltit linku kvůli pom…