Jak mogę ograniczyć przepustowość wykorzystywaną przez proces?

42

Mam serwer CentOS 5.7, który co wieczór tworzy kopie zapasowe swoich plików. Obawiam się, że osoby odwiedzające różne witryny hostowane przez serwer odczują obniżoną wydajność podczas przesyłania kopii zapasowej przez sieć.

Czy można ograniczyć maksymalną dozwoloną przepustowość procesu do interfejsu sieciowego? Chciałbym ograniczyć transfer plików oparty na SSH do połowy dostępnej przepustowości. Może to być po stronie serwera lub klienta; to znaczy, chętnie to zrobię na kliencie, który inicjuje połączenie lub na serwerze, który odbiera połączenie.

(Niestety nie mogę dodać interfejsu do tworzenia kopii zapasowych. Mógłbym zwiększyć moją dostępną przepustowość, ale to tylko oznaczałoby, że transfer sieciowy zostałby ukończony szybciej, ale nadal maksymalizowałby całkowitą pojemność połączenia podczas jego wykonywania.)


Niektóre tło

Być może pewne tło jest w porządku. Cofając się, miałem problem z brakiem wystarczającej ilości miejsca lokalnego do utworzenia kopii zapasowej. Wpisz SSHFS! Kopia zapasowa jest zapisywana na czymś, co jest pozornie dyskiem lokalnym, dzięki czemu na samym serwerze sieciowym nie ma żadnych bitów kopii zapasowej.

Dlaczego to takie ważne? Ponieważ to wydaje się unieważniać użycie czcigodnego rsync --bwlimit. rsynctak naprawdę nie wykonuje transferu ani nie może , ponieważ nie mogę nawet zaoszczędzić miejsca na zapisanie pliku kopii zapasowej.

Słyszę, jak pytasz: „Więc czekaj, dlaczego w ogóle potrzebujesz zrobić kopię zapasową? Dlaczego nie tylko rsyncpliki źródłowe i foldery?” Ponieważ denerwująca rzecz o nazwie „Plesk” jest w miksie! To jest mój internetowy klient, który korzysta z Plesk dla wygody. Jako taki używam Plesk do inicjowania kopii zapasowych, ponieważ Plesk dodaje do kopii zapasowej wszelkiego rodzaju dodatkową magię, która sprawia, że ​​korzystanie z niej podczas procedury przywracania jest bardzo bezpieczne.

smutna mina

Wesley
źródło
1
Zobacz serverfault.com/questions/52027
Jeff Ferland
1
Inną możliwością w mojej sytuacji, która, nawiasem mówiąc, nie odpowiada dokładnie na konkretne pytanie, jest użycie ioniceprzepustnicy do zapisów, które może wykonać proces. Ponieważ piszę do systemu plików SSHFS, mogę obniżyć klasę procesu tworzenia kopii zapasowej do 3, aby całkowicie ustąpił miejsca innemu procesowi, który chce pisać. W ten sposób uzyskuję pożądany efekt, który nigdy nie pogarsza wrażeń odwiedzających witrynę z powodu nadmiernej przepustowości.
Wesley
Jedno pytanie, czy twój ssh używa kompresji? „Kompresja tak” do pliku .ssh / config?
Zlatko

Odpowiedzi:

25

Możesz użyć iptablesdo oznaczenia pakietu (--pid-owner ...), a następnie użyć tcdo ukształtowania ruchu. Można także użyć parametru „--sid-owner”, aby uwzględnić wątki i elementy potomne tego procesu.

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

Dopasuj - pid-owner
Jądro 2.3, 2.4, 2.5 i 2.6
Przykład iptables -A WYJŚCIE -m właściciel --pid-owner 78
Objaśnienie To dopasowanie służy do dopasowywania pakietów na podstawie identyfikatora procesu (PID), który był za nie odpowiedzialny. To dopasowanie jest nieco trudniejsze w użyciu, ale jednym z przykładów byłoby jedynie zezwolenie PID 94 na wysyłanie pakietów z portu HTTP (jeśli proces HTTP nie jest wątkowy, oczywiście). Alternatywnie możemy napisać mały skrypt, który pobiera PID z wyjścia ps dla określonego demona, a następnie dodaje dla niego regułę. Na przykład możesz mieć regułę pokazaną w przykładzie Pid-owner.txt

Mircea Vutcovici
źródło
Myślę, że to wiąże się z moim rozwiązaniem najlepszego sposobu na zrobienie tego. --pid-owner nie wybiera właściwie na podstawie procesu, ale właściciela procesu. Musiałbym utworzyć specjalnego użytkownika, aby uruchomić proces jako, a następnie filtrować według tego właściciela, aby mieć pewność, że kształtuję ruch na podstawie tego konkretnego procesu, a nie, powiedzmy, wielu demonów, które mogły zostać uruchomione z ogólny użytkownik.
Wesley
@Wesley Nie tak mówi strona podręcznika: „ --pid-owner processidPasuje, jeśli pakiet został utworzony przez proces o podanym identyfikatorze procesu ”. linux.die.net/man/8/iptables
Ajedi32
Ta odpowiedź byłaby znacznie lepsza, gdyby zawierała przykład użycia iptables i tc do tego celu. Podany iptables -A OUTPUT -m owner --pid-owner 78przykład nie wydaje się być kompletny (ponieważ pasuje tylko do pakietów, nie mówi, jak je „oznaczyć”) i tcw ogóle nie został wyjaśniony.
Ajedi32
Aby oznaczyć pakiet, musisz dodać coś takiego -j MARK --set-mark 1. Aby uzyskać więcej informacji, zobacz: wiki.archlinux.org/index.php/…
Mircea Vutcovici
40

Jedną z właśnie odkrytych przeze mnie opcji jest użycie strużki .

Lichot to przenośny, lekki model do kształtowania przepustowości przestrzeni użytkownika. Może działać w trybie współpracy (wraz ze spuszczaniem) lub w trybie samodzielnym.

trickle działa, korzystając z wstępnego ładowania modułu ładującego unix. Zasadniczo zapewnia aplikacji nową wersję funkcjonalności wymaganej do wysyłania i odbierania danych przez gniazda. Następnie ogranicza ruch oparty na opóźnieniu wysyłania i odbierania danych przez gniazdo. trickle działa całkowicie w przestrzeni użytkownika i nie wymaga uprawnień roota.

Wesley
źródło
1
To ten, który rozwiązał mój problem. Miałem problem z demonem Bitcoin, który losowo wysysał całe moje pasmo, gdy klient zdecydował, że to ja powinienem pobrać cały blockchain.
Wszechobecny
Podany tricklelink prowadzi do 404.
Geremia
Naprawiłem uszkodzony link (zastępując go łączem Wayback Machine).
G-Man mówi „Przywróć Monikę”
3
Trickle wydaje się być teraz na githubie
Cheetah
lubsudo apt-get install trickle
ggll
22

Jeśli możesz pisać na potoku (lub standardowym wyjściu), możesz zainstalować pvkomendę (przeglądarka potoków). Pierwotnie został napisany, aby wyświetlać postęp danych przesyłanych przez potok.

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.
Hhaamu
źródło
To właściwie odpowiedź, której chyba użyję! Nie jest to jednak dokładnie odpowiedź na konkretne pytanie, które pierwotnie zadałem. Niestety, pytanie to zmieniło się, ale nadal koncentrowało się na ograniczeniu prędkości sieci w procesie. Możesz jednak przyczynić się do tego nowego pytania, które zadałem: unix.stackexchange.com/q/34174/4232
Wesley
Dzięki! Robiłem podobne rzeczy i tak się skończyło ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
clacke
1
Mógłby to również połączyć z ionice, ale nie było dozwolone na tym konkretnym serwerze. 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

Używam rsync z opcją --bwlimit = KBPS z tego samego powodu.

Nasza sieć Ethernet 1 Gbit jest w stanie łatwo zalać nasz stary SCSI320 DAS RAID, a w zasadzie DOS to niektóre nasze starsze urządzenia produkcyjne, które korzystają z niego w sklepach NFS.

Magellan
źródło
4

Jak przenosisz dane? (rsync over ssh? scp? sftp? coś innego?)

rsync pozwoli ci ograniczyć przepustowość (zobacz opcję --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Alternatywnie, możesz ustawić qdisc lub ekwiwalent, aby zrobić fantazyjne ograniczenie tempa, ale podejrzewam, że w twoim przypadku byłaby to poważna przesada. Dokumentacja na ten temat jest dostępna w Linux Advanced Routing and Traffic Control HOWTO

Devdas
źródło