Come posso limitare la larghezza di banda utilizzata da un processo?


42

Ho un server CentOS 5.7 che eseguirà il backup dei suoi file ogni notte. Temo che i visitatori dei vari siti ospitati dal server subiranno prestazioni degradate mentre il backup viene trasferito attraverso la rete.

È possibile limitare la velocità massima consentita di un processo a un'interfaccia di rete? Vorrei limitare il trasferimento di file basato su SSH a solo metà della mia larghezza di banda disponibile. Questo potrebbe essere sul lato server o client; vale a dire, sarei felice di farlo sul client che avvia la connessione o sul server che riceve la connessione.

(Sfortunatamente, non posso aggiungere un'interfaccia da dedicare ai backup. Potrei aumentare il mio throughput disponibile, ma ciò significherebbe semplicemente che il trasferimento di rete si completerebbe più velocemente, ma continuerà a massimizzare la capacità totale della connessione mentre lo fa.)


Alcuni retroscena

Forse un po 'di background è in ordine. Facendo un passo indietro, ho avuto un problema con la mancanza di spazio locale sufficiente per creare il backup stesso. Inserisci SSHFS! Il backup viene salvato su quella che è apparentemente un'unità locale in modo che nessun bit di backup sia mai presente sul server Web stesso.

Perché è importante? Perché ciò sembrerebbe invalidare l'uso del venerabile rsync --bwlimit. rsyncnon sta effettivamente eseguendo il trasferimento né può farlo perché non riesco nemmeno a risparmiare lo spazio per salvare il file di backup.

Posso sentirti chiedere: "Quindi aspetta, perché hai anche bisogno di creare un file di backup? Perché non solo rsynci file e le cartelle di origine?" Perché una cosa fastidiosa chiamata "Plesk" è nel mix! Questo è il mio host web rivolto al cliente che utilizza Plesk per comodità. Come tale, uso Plesk per avviare i backup perché Plesk aggiunge ogni sorta di ulteriore magia al backup che rende molto sicuro il suo utilizzo durante una procedura di ripristino.

faccia triste



1
Un'altra possibilità per la mia situazione, che per inciso non risponde esattamente alla domanda specifica, è usare ioniceper limitare le scritture che un processo può fare. Dal momento che sto scrivendo su un filesystem SSHFS, posso rilasciare la classe del processo di backup su 3 per farla passare completamente a qualsiasi altro processo che voglia scrivere. In questo modo ottengo l'effetto che desidero, che non deve mai degradare l'esperienza di un visitatore del sito a causa della larghezza di banda del backup hogging.
Wesley,

Una domanda, il tuo ssh usa la compressione? "Compressione sì" per il tuo .ssh / config?
Zlatko,

Risposte:


25

È possibile utilizzare iptablesper contrassegnare un pacchetto (--pid-owner ...), quindi utilizzare tcper modellare il traffico. Inoltre, "--sid-owner" può essere utilizzato per includere thread e elementi figlio di tale processo.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Corrispondenza --pid-owner
Kernel 2.3, 2.4, 2.5 e 2.6
Esempio iptables -A OUTPUT -m proprietario --pid-owner 78
Spiegazione Questa corrispondenza viene utilizzata per abbinare i pacchetti in base all'ID processo (PID) che ne era responsabile. Questa corrispondenza è un po 'più difficile da usare, ma un esempio potrebbe essere solo quello di consentire a PID 94 di inviare pacchetti dalla porta HTTP (se ovviamente il processo HTTP non è sottoposto a thread). In alternativa, potremmo scrivere un piccolo script che prende il PID da un output ps per un demone specifico e quindi aggiunge una regola per esso. Per un esempio, potresti avere una regola come mostrato nell'esempio Pid-owner.txt


Penso che questo sia legato alla mia soluzione per il modo migliore per farlo. --pid-owner in realtà non seleziona in base al processo, ma il proprietario del processo. Dovrei creare un utente speciale per avviare il processo come e quindi filtrare in base a quel proprietario solo così posso essere sicuro che sto modellando il traffico proprio da quel processo specifico e non, diciamo, più demoni che potrebbero essere stati lanciati da un utente generico.
Wesley,

@Wesley Non è quello che dice la pagina man: " --pid-owner processidCorrisponde se il pacchetto è stato creato da un processo con l'ID del processo indicato ." linux.die.net/man/8/iptables
Ajedi32

Questa risposta sarebbe molto meglio se includesse un esempio di come usare iptables e tc per questo scopo. L' iptables -A OUTPUT -m owner --pid-owner 78esempio dato non sembra completo (poiché corrisponde solo ai pacchetti, non dice come "contrassegnarli") e tcnon viene affatto spiegato.
Ajedi32,

Per contrassegnare un pacchetto è necessario aggiungere qualcosa di simile -j MARK --set-mark 1. Per maggiori dettagli vedi: wiki.archlinux.org/index.php/…
Mircea Vutcovici

40

Un'opzione che ho appena scoperto è usare il gocciolamento .

trickle è uno shaper di larghezza di banda dello spazio utenti leggero e portatile. Può essere eseguito in modalità collaborativa (insieme a gocciolato) o in modalità autonoma.

Il gocciolamento funziona sfruttando il precarico del caricatore unix. In sostanza fornisce all'applicazione una nuova versione della funzionalità necessaria per inviare e ricevere dati tramite socket. Limita quindi il traffico in base al ritardo nell'invio e nella ricezione di dati su un socket. trickle viene eseguito interamente nello spazio utente e non richiede i privilegi di root.


1
Questo è quello che ha risolto il mio problema. Stavo avendo un problema con il demone bitcoin che succhiava casualmente tutto il mio bandwdith quando un client ha deciso che ero la persona da cui scaricare l'intera blockchain.
Onnipotente il

Il tricklecollegamento che hai dato porta a un 404.
Geremia,

Ho corretto il collegamento interrotto (sostituendolo con un collegamento Wayback Machine).
G-Man dice 'Reinstate Monica' il

3
Il trucco sembra essere su github ora: github.com/mariusae/trickle
Cheetah

oppuresudo apt-get install trickle
ggll,

22

Se riesci a scrivere su una pipe (o stdout), puoi installare il pvcomando (pipe viewer). È stato originariamente scritto per visualizzare l'avanzamento dei dati trasferiti attraverso una pipe.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

Questa è in realtà la risposta che penso che userò! Tuttavia, non è esattamente una risposta alla domanda specifica che ho posto inizialmente. Purtroppo, il tipo di domanda si è trasformato, ma era ancora focalizzato sulla limitazione della velocità della rete di un processo. Tuttavia, puoi contribuire a questa nuova domanda che ho posto: unix.stackexchange.com/q/34174/4232
Wesley

Grazie! Stavo facendo una cosa simile e ho finito per farlo ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
Clacke,

1
Avrebbe potuto combinarlo anche con ionice, ma non era consentito su quel particolare server. ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
Clacke,

6

Uso rsync con l'opzione --bwlimit = KBPS per lo stesso motivo.

Il nostro ethernet da 1 Gbit è in grado di inondare facilmente il nostro vecchio RAID DSI SCSI320, ed essenzialmente DOS sono alcune delle nostre vecchie scatole di produzione che si basano su di esso per i suoi negozi NFS.


4

Come si trasferiscono i dati? (rsync su ssh? scp? sftp? qualcos'altro?)

rsync ti permetterà di limitare la larghezza di banda (vedi l'opzione --bwlimit = KBPS). rsync -e ssh --bwlimit ..

In alternativa, è possibile impostare un qdisc o un equivalente per limitare la frequenza, ma sospetto che nel tuo caso ciò comporterebbe un grave sovraccarico. La documentazione al riguardo è disponibile presso il Linux Advanced Routing and Traffic Control HOWTO

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.