Kako ograničiti propusni opseg mreže koji koriste aplikacije u Linux sistemu pomoću Tricklea


Jeste li ikada naišli na situacije u kojima je jedna aplikacija dominirala vašom cjelokupnom mrežnom širinom? Ako ste ikada bili u situaciji da vam je jedna aplikacija pojela sav promet, tada ćete cijeniti ulogu aplikacije za oblikovanje propusnog opsega.

Bilo da ste administrator sistema ili samo Korisnik Linuxa, morate naučiti kako kontrolirati brzinu prijenosa i preuzimanja za aplikacije kako biste bili sigurni da vaš mrežni propusni opseg nije spaljen jednom aplikacijom.

Šta je Trickle?

Trickle je alat za oblikovanje mrežnog propusnog opsega koji nam omogućava da upravljamo brzinama upload-a i preuzimanja aplikacija kako bismo spriječili da bilo koja od njih preuzme svu (ili većinu) dostupne propusnosti.

Ukratko, trickle vam omogućava da kontrolišete stopu mrežnog saobraćaja po aplikaciji, za razliku od kontrole po korisniku, što je klasičan primer oblikovanja propusnog opsega u klijent-server okruženju, i verovatno je podešavanje koje smo više upoznat sa.

Kako Trickle radi?

Osim toga, kaplje nam može pomoći da definiramo prioritete po aplikaciji, tako da kada su ukupna ograničenja postavljena za cijeli sistem, prioritetne aplikacije će i dalje automatski dobiti više propusnog opsega.

Da bi se postigao ovaj zadatak, trickle postavlja ograničenja saobraćaja na način na koji se podaci šalju i primaju od utičnica koje koriste TCP veze. Moramo napomenuti da, osim brzina prijenosa podataka, curenje ni na koji način ne mijenja ponašanje procesa koji oblikuje u bilo kojem trenutku.

Šta Trickle ne može učiniti?

Jedino ograničenje, da tako kažemo, je da trickle neće raditi sa statički povezanim aplikacijama ili binarnim datotekama sa postavljenim bitovima SUID ili SGID jer koristi dinamičko povezivanje i učitavanje za postavljanje između oblikovanog procesa i njegove povezane mrežne utičnice. Trickle tada djeluje kao posrednik između ove dvije softverske komponente.

Pošto trickle ne zahtijeva privilegije superkorisnika da bi se pokrenuo, korisnici mogu postaviti vlastita ograničenja prometa. Budući da to možda nije poželjno, istražit ćemo kako postaviti ukupna ograničenja koja korisnici sistema ne mogu prekoračiti. Drugim riječima, korisnici će i dalje moći upravljati svojim prometom, ali uvijek unutar granica koje postavlja administrator sistema.

Testing Environment

U ovom članku ćemo objasniti kako ograničiti propusni opseg mreže koji koriste aplikacije na Linux serveru.

Za generiranje potrebnog prometa, koristit ćemo ncftpput i ncftpget (oba alata su dostupna instaliranjem ncftp) na klijentu (CentOS server – dev1: 192.168.0.17), i vsftpd na poslužitelju (Debian – dev2: 192.168.0.15 ) u svrhu demonstracije. Ista uputstva također rade na RedHat, Fedora i Ubuntu sistemima.

Instaliranje ncftp i vsftpd u Linuxu

1. Za RHEL/CentOS 8/7, omogućite EPEL spremište. Dodatni paketi za Enterprise Linux (EPEL) je spremište visokokvalitetnog besplatnog softvera otvorenog koda koji održava Fedora projekat i 100% je kompatibilan sa njegovim spinoff-ovima, kao što je Red Hat Enterprise Linux i CentOS. I trickle i ncftp su dostupni iz ovog spremišta.

2. Instalirajte ncftp na sljedeći način:

yum update && sudo yum install ncftp		[On RedHat based systems]
aptitude update && aptitude install ncftp	[On Debian based systems]	

3. Postavite FTP server na zasebnom serveru. Imajte na umu da iako je FTP inherentno nesiguran, on se i dalje široko koristi u slučajevima kada sigurnost u učitavanju ili preuzimanju datoteka nije potrebna.

Koristimo ga u ovom članku da ilustriramo blagodati curenja i zato što pokazuje brzine prijenosa u stdout na klijentu, a ostavit ćemo raspravu o tome treba li ili ne treba koristiti za drugu datum i vrijeme.

yum update && yum install vsftpd 		[On RedHat based systems]
apt update && apt install vsftpd 	[On Debian based systems]

Sada uredite datoteku /etc/vsftpd/vsftpd.conf na FTP serveru na sljedeći način:

sudo nano /etc/vsftpd/vsftpd.conf
OR
sudo /etc/vsftpd.conf

Napravite sljedeće izmjene:

anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES

Nakon toga, obavezno pokrenite vsftpd za svoju trenutnu sesiju i omogućite ga za automatsko pokretanje pri budućim pokretanjima:

systemctl start vsftpd 		[For systemd-based systems]
systemctl enable vsftpd
service vsftpd start 			[For init-based systems]
chkconfig vsftpd on

4. Ako ste odabrali da postavite FTP server u CentOS/RHEL droplet sa SSH ključevima za daljinski pristup, trebat će vam korisnički račun zaštićen lozinkom s odgovarajućim direktorijumom i dozvole datoteke za učitavanje i preuzimanje željenog sadržaja VAN matičnog direktorija root-a.

Zatim možete pretražiti svoj početni direktorij unošenjem sljedećeg URL-a u pretraživač. Pojavit će se prozor za prijavu koji će od vas tražiti da unesete važeći korisnički nalog i lozinku na FTP serveru.

ftp://192.168.0.15

Ako autentifikacija uspije, vidjet ćete sadržaj vašeg matičnog direktorija. Kasnije u ovom vodiču, moći ćete osvježiti tu stranicu kako biste prikazali datoteke koje su otpremljene tokom prethodnih koraka.

Kako instalirati Trickle u Linux

Sada instalirajte trickle putem yum ili apt.

Da bi se osigurala uspješna instalacija, smatra se dobrom praksom da se uvjerite da su trenutno instalirani paketi ažurirani (koristeći yum update) prije instaliranja samog alata.

yum -y update && yum install trickle 		        [On RedHat based systems]
apt -y update && apt install trickle 	[On Debian based systems]

Provjerite hoće li trickle raditi sa željenom binarnom datotekom. Kao što smo ranije objasnili, curenje će raditi samo sa binarnim datotekama koje koriste dinamičke ili dijeljene biblioteke. Da bismo provjerili možemo li koristiti ovaj alat s određenom aplikacijom, možemo koristiti dobro poznati uslužni program ldd, gdje ldd označava dinamičke zavisnosti liste.

Konkretno, tražit ćemo prisustvo glibc (GNU C biblioteka) na listi dinamičkih ovisnosti bilo kojeg programa jer je upravo ta biblioteka ta koja definira sistemske pozive uključene u komunikaciju putem utičnica.

Pokrenite sljedeću naredbu protiv datog binarnog fajla da vidite da li se curenje može koristiti za oblikovanje njegove propusnosti:

ldd $(which [binary]) | grep libc.so

Na primjer,

ldd $(which ncftp) | grep libc.so

čiji je izlaz:

libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)

Niz između zagrada u izlazu može se mijenjati od sistema do sistema, pa čak i između narednih izvođenja iste naredbe jer predstavlja adresu učitavanja biblioteke u fizičkoj memoriji.

Ako gornja naredba ne vrati nikakve rezultate, to znači da binarni program protiv kojeg je pokrenut ne koristi libc, pa se trickle u tom slučaju ne može koristiti kao sredstvo za oblikovanje propusnog opsega.

Naučite kako koristiti Trickle u Linuxu

Najosnovnija upotreba trickle je u samostalnom načinu rada. Koristeći ovaj pristup, trickle se koristi za eksplicitno definiranje brzine preuzimanja i učitavanja date aplikacije. Kao što smo ranije objasnili, radi kratkoće, koristićemo istu aplikaciju za testove preuzimanja i postavljanja.

Trčanje Trickle u samostalnom načinu rada

Uporedićemo brzine preuzimanja i učitavanja sa i bez upotrebe trickle. Opcija -d označava brzinu preuzimanja u KB/s, dok oznaka -u govori trickle da ograniči brzinu učitavanja istom jedinicom. Osim toga, koristit ćemo oznaku -s, koja specificira da trickle treba raditi u samostalnom načinu rada.

Osnovna sintaksa za pokretanje trickle u samostalnom načinu rada je sljedeća:

trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]

Da biste sami izveli sljedeće primjere, uvjerite se da imate trickle i ncftp instalirane na klijentskoj mašini (192.168.0.17 u mom slučaj).

Primjer 1: Učitavanje PDF datoteke od 2,8 MB sa i bez curenja.

Koristimo PDF datoteku Osnove Linuxa koja se slobodno distribuira (dostupnu ovdje) za sljedeće testove.

U početku možete preuzeti ovu datoteku u svoj trenutni radni direktorij sa sljedećom naredbom:

wget http://linux-training.be/files/books/LinuxFun.pdf 

Sintaksa za učitavanje datoteke na naš FTP server bez curenja je sljedeća:

ncftpput -u username -p password 192.168.0.15  /remote_directory local-filename 

Gdje je /remote_directory put direktorija za otpremanje u odnosu na dom korisničkog imena, a local-filename je datoteka u vašem trenutnom radnom direktoriju.

Konkretno, bez curenja dobijamo maksimalnu brzinu otpremanja od 52,02 MB/s (imajte na umu da ovo nije stvarna prosječna brzina učitavanja, već trenutni početni maksimum), a datoteka se učitava gotovo trenutno:

ncftpput -u username -p password 192.168.0.15  /testdir LinuxFun.pdf 

Izlaz :

LinuxFun.pdf:                                        	2.79 MB   52.02 MB/s

Uz trickle, ograničit ćemo brzinu prijenosa prijenosa na 5 KB/s. Prije uploada datoteke po drugi put, moramo je izbrisati iz odredišnog direktorija; u suprotnom, ncftp će nas obavijestiti da je datoteka u odredišnom direktoriju ista koju pokušavamo učitati i neće izvršiti prijenos:

rm /absolute/path/to/destination/directory/LinuxFun.pdf 

onda:

trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf 

Izlaz :

LinuxFun.pdf:                                        	2.79 MB	4.94 kB/s

U gornjem primjeru možemo vidjeti da je prosječna brzina učitavanja pala na ~5 KB/s.

Primjer 2: Preuzimanje iste PDF datoteke od 2,8 MB sa i bez curenja

Prvo, ne zaboravite izbrisati PDF iz izvornog izvornog direktorija:

rm /absolute/path/to/source/directory/LinuxFun.pdf 

Imajte na umu da će sljedeći slučajevi preuzeti udaljenu datoteku u trenutni direktorij na klijentskoj mašini. Ovu činjenicu označava tačka (‘.‘) koja se pojavljuje iza IP adrese FTP servera.

bez curenja:

ncftpget -u username -p  password 111.111.111.111 . /testdir/LinuxFun.pdf 

Izlaz :

LinuxFun.pdf:                                        	2.79 MB  260.53 MB/s

Uz curenje, ograničavanje brzine preuzimanja na 20 KB/s:

trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf 

Izlaz :

LinuxFun.pdf:                                        	2.79 MB   17.76 kB/s

Pokretanje Trickle u nadziranom [neupravljanom] načinu rada

Trickle takođe može da radi u neupravljanom režimu, prateći niz parametara definisanih u /etc/trickled.conf. Ova datoteka definira kako se trickled (daemon) ponaša i upravlja trickleom.

Osim toga, ako želimo postaviti globalne postavke koje će sve aplikacije koristiti, općenito, morat ćemo koristiti trickled komandu. Ova naredba pokreće demon i omogućava nam da definiramo ograničenja preuzimanja i otpremanja koja će dijeliti sve aplikacije koje se pokreću bez potrebe da svaki put specificiramo ograničenja.

Na primjer, trčanje:

trickled -d 50 -u 10

Doći će do toga da brzina preuzimanja i uploada bilo koje aplikacije koja prolazi kroz curenje bude ograničena na 30 KB/s i 10 KB/s, respektivno.

Imajte na umu da u bilo kojem trenutku možete provjeriti da li je trickled pokrenut i sa kojim argumentima:

ps -ef | grep trickled | grep -v grep

Izlaz :

root 	16475 	1  0 Dec24 ?    	00:00:04 trickled -d 50 -u 10
Primjer 3: Učitavanje 19 MB mp4 datoteke na naš FTP server korištenjem sa i bez curenja.

U ovom primjeru koristit ćemo video za slobodno distribuciju “He is the gift”, koji je dostupan za preuzimanje sa ovog linka.

Prvo ćemo preuzeti ovu datoteku u vaš trenutni radni direktorij sa sljedećom naredbom:

wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Prvo ćemo pokrenuti trickled daemon sa gore navedenom naredbom:

trickled -d 30 -u 10

bez curenja:

ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4 

Izlaz :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   36.31 MB/s

sa curkom:

trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4 

Izlaz :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB	9.51 kB/s

Kao što možemo vidjeti u izlazu iznad, brzina prijenosa je pala na ~10 KB/s.

Primjer 4: Preuzimanje istog videa sa i bez curenja

Kao u Primjeru 2, mi ćemo preuzeti datoteku u trenutni radni direktorij.

bez curenja:

ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Izlaz :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB  108.34 MB/s

sa curkom:

trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4 

Izlaz :

2014-00-1460-he-is-the-gift-360p-eng.mp4:           	18.53 MB   29.28 kB/s

Što je u skladu s ranije postavljenim ograničenjem preuzimanja (30 KB/s).

Napomena: Kada se demon pokrene, nema potrebe za postavljanjem pojedinačnih ograničenja za svaku aplikaciju koja koristi trickle.

Kao što smo ranije spomenuli, moguće je dodatno prilagoditi oblikovanje propusnog opsega kroz trickled.conf. Tipičan odjeljak u ovoj datoteci sastoji se od sljedećeg:

[service]
Priority = <value>
Time-Smoothing = <value>
Length-Smoothing = <value>

gdje,

  1. [usluga] označava naziv aplikacije čiju upotrebu propusnog opsega namjeravamo oblikovati.
  2. Prioritet nam omogućava da specificiramo uslugu da ima veći prioritet u odnosu na drugu, čime se ne dozvoljava jednoj aplikaciji da preuzme svu propusnost kojom demon upravlja. Što je manji broj, to je više propusnog opsega koji je dodijeljen [usluzi].
  3. Ujednačavanje vremena [u sekundama]: definira u kojim vremenskim intervalima će pokušati dozvoliti aplikaciji da prenese i/ili primi podatke. Manje vrijednosti (nešto između raspona od 0,1 – 1 s) su idealne za interaktivne aplikacije i rezultirat će kontinuiranijom (glatkijom) sesijom, dok su nešto veće vrijednosti (1 – 10 s) bolje za aplikacije kojima je potreban masovni prijenos. Ako nije navedena vrijednost, koristi se zadana vrijednost (5 s).
  4. Length-Smoothing [u KB]: ideja je ista kao u Time-Smoothing, ali zasnovana na dužini I/O operacije. Ako nije navedena vrijednost, koristi se zadana vrijednost (10 KB).

Promjena vrijednosti izravnavanja će se prevesti u aplikaciju koju je odredio [usluga] koristeći brzine prijenosa unutar intervala umjesto fiksne vrijednosti. Nažalost, ne postoji formula za izračunavanje donje i gornje granice ovog intervala jer uglavnom zavisi od svakog pojedinačnog scenarija.

Slijedi primjer datoteke trickled.conf u CentOS 7 klijentu (192.168.0.17):

[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2

[ftp]
Priority = 2
Time-Smoothing = 1
Length-Smoothing = 3

Koristeći ovo podešavanje, trickled će dati prioritet SSH konekcijama nad FTP transferima. Imajte na umu da interaktivni proces, kao što je SSH, koristi manje vrijednosti za ujednačavanje vremena, dok usluga koja obavlja masovni prijenos podataka (FTP) koristi veću vrijednost.

Vrijednosti izglađivanja su odgovorne za brzinu preuzimanja i učitavanja u našem prethodnom primjeru koji se ne poklapaju sa točnom vrijednošću koju je specificirao trickled daemon, ali se kreću u intervalu blizu njega.

Zaključak

U ovom članku smo istražili kako ograničiti propusnost koju koriste aplikacije koristeći trickle na Fedora baziranim distribucijama i Debianu/derivatima. Drugi mogući slučajevi upotrebe uključuju, ali nisu ograničeni na:

  • Ograničavanje brzine preuzimanja putem sistemskog uslužnog programa kao što je wget ili torrent klijenta, na primjer.
  • Ograničavanje brzine kojom se vaš sustav može ažurirati putem `yum` (ili `aptitude`, ako ste u sustavu baziranom na Debianu), sustava za upravljanje paketima.
  • Ako se vaš server nalazi iza proxyja ili firewall-a (ili je sam proxy ili firewall), možete koristiti trickle da postavite ograničenja za preuzimanje i prijenos ili brzinu komunikacije s klijentima ili izvana.

Pitanja i komentari su dobrodošli. Slobodno koristite obrazac ispod da ih pošaljete na naš put.