Hvordan begrense nettverksbåndbredden som brukes av applikasjoner i et Linux-system med Trickle


Har du noen gang vært borti situasjoner der én applikasjon dominerte hele nettverksbåndbredden din? Hvis du noen gang har vært i en situasjon der en applikasjon spiste opp all trafikken din, vil du verdsette rollen til applikasjonen for vedlikeholdsbåndbreddeformer.

Enten du er systemadministrator eller bare en Linux-bruker, må du lære hvordan du kontrollerer opplastings- og nedlastingshastigheter for applikasjoner for å sikre at nettverksbåndbredden ikke brennes av en enkelt applikasjon.

[Du vil kanskje også like: 16 nyttige verktøy for båndbreddeovervåking for å analysere nettverksbruk i Linux ]

Hva er Trickle?

Trickle er et nettverksbåndbreddeformingsverktøy som lar oss administrere opplastings- og nedlastingshastighetene til applikasjoner for å forhindre at en enkelt av dem bruker hele (eller mesteparten) av den tilgjengelige båndbredden.

Med få ord lar trickle deg kontrollere nettverkstrafikkhastigheten per applikasjon, i motsetning til per-brukerkontroll, som er det klassiske eksemplet på båndbreddeforming i et klient-servermiljø, og sannsynligvis er oppsettet vi er mer. kjent med.

Hvordan fungerer Trickle?

I tillegg kan en drypp hjelpe oss med å definere prioriteringer per applikasjon, slik at når generelle grenser er satt for hele systemet, vil prioriterte apper fortsatt få mer båndbredde automatisk.

For å utføre denne oppgaven, setter vedlikeholdsladden trafikkgrenser for måten data sendes til og mottas fra, stikkontakter som bruker TCP-tilkoblinger. Vi må merke oss at, bortsett fra dataoverføringshastighetene, trickle ikke på noen måte endrer oppførselen til prosessen den former på et gitt tidspunkt.

Hva kan ikke Trickle gjøre?

Den eneste begrensningen, så å si, er at trickle ikke vil fungere med statisk koblede applikasjoner eller binærfiler med SUID- eller SGID-bitene satt siden den bruker dynamisk kobling og lasting for å plassere seg selv mellom den formede prosessen og den tilhørende nettverkskontakten. Trickle fungerer da som en proxy mellom disse to programvarekomponentene.

Siden trickle ikke krever superbrukerprivilegier for å kjøre, kan brukere sette sine egne trafikkgrenser. Siden dette kanskje ikke er ønskelig, vil vi undersøke hvordan man setter generelle grenser som systembrukere ikke kan overskride. Med andre ord vil brukere fortsatt kunne administrere trafikkratene sine, men alltid innenfor grensene satt av systemadministratoren.

I denne artikkelen vil vi forklare hvordan du begrenser nettverksbåndbredden som brukes av applikasjoner på en Linux-server med en vedlikeholdslading.

For å generere nødvendig trafikk vil vi bruke ncftpput og ncftpget (begge verktøyene er tilgjengelige ved å installere ncftp) på klienten (CentOS server – dev1: 192.168.0.17), og vsftpd på serveren (Debian – dev2: 192.168.0.15) for demonstrasjonsformål. De samme instruksjonene fungerer også på RedHat, Fedora og Ubuntu-baserte systemer.

Installere ncftp og vsftpd i Linux

1. Aktiver EPEL-depotet for RHEL/CentOS 8/7. Extra Packages for Enterprise Linux (EPEL) er et oppbevaringssted for høykvalitets gratis og åpen kildekode-programvare vedlikeholdt av Fedora-prosjektet og er 100 % kompatibel med spinoffene, som Red Hat Enterprise Linux og CentOS. Både trickle og ncftp gjøres tilgjengelig fra dette depotet.

2. Installer ncftp som følger:

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

3. Sett opp en FTP-server på en egen server. Vær oppmerksom på at selv om FTP er iboende usikker, er den fortsatt mye brukt i tilfeller der sikkerhet ved opp- eller nedlasting av filer ikke er nødvendig.

Vi bruker den i denne artikkelen for å illustrere trickle-premiene og fordi den viser overføringsratene i stdout på klienten, og vi vil la diskusjonen om hvorvidt den bør eller ikke skal brukes til en annen dato og klokkeslett.

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

Rediger nå filen /etc/vsftpd/vsftpd.conf på FTP-serveren som følger:

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

Gjør følgende endringer:

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

Etter det, sørg for å starte vsftpd for din nåværende økt og aktivere den for automatisk start på fremtidige støvler:

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

4. Hvis du valgte å sette opp FTP-serveren i en CentOS/RHEL-dråpe med SSH-nøkler for ekstern tilgang, trenger du en passordbeskyttet brukerkonto med riktig katalog og filtillatelser for å laste opp og laste ned ønsket innhold UTENFOR rotens hjem katalog.

Du kan deretter bla til hjemmekatalogen din ved å skrive inn følgende URL i nettleseren din. Et påloggingsvindu vil dukke opp som ber deg om en gyldig brukerkonto og passord på FTP-serveren.

ftp://192.168.0.15

Hvis autentiseringen lykkes, vil du se innholdet i hjemmekatalogen din. Senere i denne opplæringen vil du kunne oppdatere siden for å vise filene som har blitt lastet opp under tidligere trinn.

Hvordan installere Trickle i Linux

Installer nå trickle via yum eller apt.

For å sikre en vellykket installasjon anses det som god praksis å sørge for at de installerte pakkene er oppdatert (ved å bruke yum update) før du installerer selve verktøyet.

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

Kontroller om trickle vil fungere med ønsket binær. Som vi forklarte tidligere, vil vedlikeholdet bare fungere med binære filer som bruker dynamiske eller delte biblioteker. For å verifisere om vi kan bruke dette verktøyet med en bestemt applikasjon, kan vi bruke det velkjente ldd-verktøyet, der ldd står for listedynamiske avhengigheter.

Spesifikt vil vi se etter tilstedeværelsen av glibc (GNU C-biblioteket) i listen over dynamiske avhengigheter til et gitt program fordi det er nettopp det biblioteket som definerer systemanropene som er involvert i kommunikasjon gjennom sockets.

Kjør følgende kommando mot en gitt binær for å se om trickle kan brukes til å forme båndbredden:

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

For eksempel,

# ldd $(which ncftp) | grep libc.so

hvis utgang er:

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

Strengen mellom parenteser i utdataene kan endres fra system til system og til og med mellom påfølgende kjøringer av samme kommando siden den representerer innlastingsadressen til biblioteket i fysisk minne.

Hvis kommandoen ovenfor ikke returnerer noen resultater, betyr det at binæren den ble kjørt mot ikke bruker libc, og dermed kan trickle ikke brukes som båndbreddeformer i så fall.

Lær hvordan du bruker Trickle i Linux

Den mest grunnleggende bruken av trickle er i frittstående modus. Ved å bruke denne tilnærmingen brukes trickle til å eksplisitt definere nedlastings- og opplastingshastighetene til en gitt applikasjon. Som vi forklarte tidligere, for korthets skyld, vil vi bruke samme applikasjon for nedlasting og opplasting av tester.

Vi vil sammenligne nedlastings- og opplastingshastighetene med og uten å bruke trickle. Alternativet -d indikerer nedlastingshastigheten i KB/s, mens -u flagget forteller trickle å begrense opplastingshastigheten med samme enhet. I tillegg vil vi bruke -s-flagget, som spesifiserer at trickle skal kjøres i frittstående modus.

Den grunnleggende syntaksen for å kjøre trickle i frittstående modus er som følger:

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

For å utføre følgende eksempler på egen hånd, sørg for å ha trickle og ncftp installert på klientmaskinen (192.168.0.17 i mitt tilfelle).

Vi bruker den fritt distribuerbare PDF-filen Linux Fundamentals (tilgjengelig her) for følgende tester.

Du kan først laste ned denne filen til din nåværende arbeidskatalog med følgende kommando:

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

Syntaksen for å laste opp en fil til vår FTP-server uten vedlikehold er som følger:

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

Hvor /remote_directory er banen til opplastingskatalogen i forhold til brukernavnets hjem, og lokal-filnavn er en fil i din nåværende arbeidskatalog.

Spesifikt, uten vedlikehold får vi en toppopplastingshastighet på 52,02 MB/s (vær oppmerksom på at dette ikke er den virkelige gjennomsnittlige opplastingshastigheten, men en umiddelbar starttopp), og filen blir lastet opp nesten umiddelbart:

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

Produksjon:

LinuxFun.pdf:                                        	2.79 MB   52.02 MB/s

Med trickle vil vi begrense opplastingsoverføringshastigheten til 5 KB/s. Før vi laster opp filen for andre gang, må vi slette den fra målkatalogen; ellers vil ncftp informere oss om at filen i målkatalogen er den samme som vi prøver å laste opp, og vil ikke utføre overføringen:

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

Deretter:

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

Produksjon:

LinuxFun.pdf:                                        	2.79 MB	4.94 kB/s

I eksemplet ovenfor kan vi se at den gjennomsnittlige opplastingshastigheten falt til ~5 KB/s.

Husk først å slette PDF-en fra den opprinnelige kildekatalogen:

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

Vær oppmerksom på at følgende tilfeller vil laste ned den eksterne filen til gjeldende katalog på klientmaskinen. Dette faktum indikeres av punktum (‘.‘) som vises etter IP-adressen til FTP-serveren.

Uten drypp:

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

Produksjon:

LinuxFun.pdf:                                        	2.79 MB  260.53 MB/s

Med vedlikeholdslading, begrense nedlastingshastigheten til 20 KB/s:

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

Produksjon:

LinuxFun.pdf:                                        	2.79 MB   17.76 kB/s

Kjøre Trickle i overvåket [uadministrert] modus

Trickle kan også kjøre i uadministrert modus, etter en rekke parametere definert i /etc/trickled.conf. Denne filen definerer hvordan trickled (demonen) oppfører seg og håndterer trickle.

I tillegg, hvis vi ønsker å angi globale innstillinger som skal brukes, totalt sett, av alle applikasjoner, må vi bruke trickled-kommandoen. Denne kommandoen kjører daemonen og lar oss definere nedlastings- og opplastingsgrenser som vil deles av alle applikasjonene som kjører gjennom trickle uten at vi trenger å spesifisere grenser hver gang.

For eksempel kjører:

# trickled -d 50 -u 10

Vil føre til at nedlastings- og opplastingshastighetene for alle applikasjoner som kjøres gjennom trickle, begrenses til henholdsvis 30 KB/s og 10 KB/s.

Vær oppmerksom på at du når som helst kan sjekke om trickled kjører og med hvilke argumenter:

# ps -ef | grep trickled | grep -v grep

Produksjon:

root 	16475 	1  0 Dec24 ?    	00:00:04 trickled -d 50 -u 10

I dette eksemplet vil vi bruke den fritt distribuerbare «Han er gaven»-videoen, tilgjengelig for nedlasting fra denne lenken.

Vi vil først laste ned denne filen til din nåværende arbeidskatalog med følgende kommando:

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

Først vil vi starte den dryppede daemonen med kommandoen som er oppført ovenfor:

# trickled -d 30 -u 10

Uten drypp:

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

Produksjon:

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

Med drypp:

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

Produksjon:

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

Som vi kan se i utdataene ovenfor, falt opplastingsoverføringshastigheten til ~10 KB/s.

Som i eksempel 2, vil vi laste ned filen til gjeldende arbeidskatalog.

Uten drypp:

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

Produksjon:

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

Med drypp:

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

Produksjon:

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

Som er i samsvar med nedlastingsgrensen satt tidligere (30 KB/s).

Merk: Når demonen er startet, er det ikke nødvendig å sette individuelle grenser for hver applikasjon som bruker trickle.

Som vi nevnte tidligere, kan man tilpasse trickles båndbreddeforming ytterligere gjennom trickled.conf. En typisk seksjon i denne filen består av følgende:

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

Hvor,

  1. [tjeneste] angir navnet på applikasjonen hvis båndbreddebruk vi har tenkt å forme.
  2. Prioritet lar oss spesifisere en tjeneste for å ha en høyere prioritet i forhold til en annen, og dermed tillater ikke en enkelt applikasjon å ta opp all båndbredden som demonen administrerer. Jo lavere tall, jo mer båndbredde er tilordnet [tjeneste].
  3. Tidsutjevning [i sekunder]: definerer med hvilke tidsintervaller som vil prøve å la programmet overføre og/eller motta data. Mindre verdier (noe mellom området 0,1 – 1 s) er ideelle for interaktive applikasjoner og vil resultere i en mer kontinuerlig (jevn) økt mens litt større verdier (1 – 10 s) er bedre for applikasjoner som trenger bulkoverføring. Hvis ingen verdi er spesifisert, brukes standardverdien (5 s).
  4. Lengdeutjevning [i KB]: ideen er den samme som i tidsutjevning, men basert på lengden på en I/O-operasjon. Hvis ingen verdi er spesifisert, brukes standardverdien (10 KB).

Endring av utjevningsverdiene vil oversettes til applikasjonen spesifisert av [service] ved å bruke overføringshastigheter innenfor et intervall i stedet for en fast verdi. Dessverre er det ingen formel for å beregne de nedre og øvre grensene for dette intervallet, da det hovedsakelig avhenger av hvert enkelt tilfelle.

Følgende er en trickled.conf-eksempelfil i CentOS 7-klienten (192.168.0.17):

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

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

Ved å bruke dette oppsettet vil trickled prioritere SSH-tilkoblinger over FTP-overføringer. Legg merke til at en interaktiv prosess, for eksempel SSH, bruker mindre tidsutjevnende verdier, mens en tjeneste som utfører bulkdataoverføringer (FTP) bruker en større verdi.

Utjevningsverdiene er ansvarlige for at nedlastings- og opplastingshastighetene i vårt forrige eksempel ikke samsvarer med den eksakte verdien spesifisert av den dryppede daemonen, men beveger seg i et intervall nær den.

[Du vil kanskje også like: Hvordan sikre og herde OpenSSH Server ]

Konklusjon

I denne artikkelen har vi utforsket hvordan man kan begrense båndbredden som brukes av applikasjoner som bruker trickle på Fedora-baserte distribusjoner og Debian/derivater. Andre mulige brukstilfeller inkluderer, men er ikke begrenset til:

  • Begrense nedlastingshastigheten via et systemverktøy som for eksempel torrentklient.
  • Begrense hastigheten som systemet ditt kan oppdateres med via \\aptitude\\, hvis du er i et Debian-basert system), pakkebehandlingssystemet.
  • Hvis serveren din tilfeldigvis er bak en proxy eller brannmur (eller er selve proxyen eller brannmuren), kan du bruke trickle for å sette grenser for både nedlasting og opplasting eller kommunikasjonshastighet med klientene eller utsiden.

Spørsmål og kommentarer er hjertelig velkommen. Bruk gjerne skjemaet nedenfor for å sende dem til oss.