Bagaimana saya bisa membatasi bandwidth yang digunakan oleh suatu proses?

42

Saya memiliki server CentOS 5.7 yang akan mencadangkan file-nya setiap malam. Saya khawatir bahwa pengunjung ke berbagai situs yang dihosting oleh server akan mengalami penurunan kinerja saat cadangan ditransfer di seluruh jaringan.

Apakah mungkin untuk membatasi throughput maksimum yang diizinkan suatu proses ke antarmuka jaringan? Saya ingin membatasi transfer file berbasis SSH hanya setengah dari bandwidth saya yang tersedia. Ini bisa di sisi server atau klien; yaitu, saya akan senang melakukan ini baik pada klien yang memulai koneksi atau server yang menerima koneksi.

(Sayangnya, saya tidak dapat menambahkan antarmuka yang didedikasikan untuk cadangan. Saya dapat meningkatkan throughput yang tersedia, tetapi itu hanya berarti bahwa transfer jaringan akan selesai lebih cepat, tetapi masih memaksimalkan kapasitas total koneksi saat melakukannya.)


Beberapa latar belakang

Mungkin beberapa latar belakang sudah beres. Melangkah mundur, saya punya masalah dengan tidak memiliki ruang lokal yang cukup untuk membuat cadangan itu sendiri. Masukkan SSHFS! Cadangan disimpan ke apa yang tampaknya drive lokal sehingga tidak ada bit cadangan yang pernah ada di server web itu sendiri.

Mengapa itu penting? Karena itu tampaknya akan membatalkan penggunaan Yang Mulia rsync --bwlimit. rsynctidak benar-benar melakukan transfer juga tidak bisa karena saya bahkan tidak bisa menyisihkan ruang untuk menyimpan file cadangan.

Saya dapat mendengar Anda bertanya: "Jadi, tunggu, mengapa Anda bahkan perlu membuat file cadangan? Mengapa tidak hanya rsyncfile sumber dan folder?" Karena hal menjengkelkan yang disebut "Plesk" ada di dalam campuran! Ini adalah host web yang menghadap klien saya yang menggunakan Plesk untuk kenyamanan. Karena itu, saya menggunakan Plesk untuk memulai cadangan karena Plesk menambahkan segala macam sihir ekstra ke cadangan yang membuatnya memakannya selama prosedur pemulihan sangat aman.

muka sedih

Wesley
sumber
1
Kemungkinan lain untuk situasi saya, yang secara kebetulan tidak benar - benar menjawab pertanyaan spesifik, adalah digunakan ioniceuntuk membatasi penulisan yang dapat dibuat oleh suatu proses. Karena saya menulis ke sistem file SSHFS, saya dapat menurunkan kelas proses pencadangan ke 3 untuk membuatnya benar-benar memberi jalan kepada proses lain yang ingin ditulis. Dengan begitu saya mendapatkan efek yang saya inginkan yaitu tidak pernah menurunkan pengalaman pengunjung situs karena bandwidth memonopoli cadangan.
Wesley
Satu pertanyaan, ssh Anda menggunakan kompresi? "Kompresi ya" ke .ssh / config Anda?
Zlatko

Jawaban:

25

Anda dapat menggunakan iptablesuntuk menandai paket (--pid-owner ...), lalu gunakan tcuntuk membentuk lalu lintas. Juga "--sid-owner" dapat digunakan untuk menyertakan utas dan anak-anak dari proses itu.

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

Match --pid-owner
Kernel 2.3, 2.4, 2.5 dan 2.6
Contoh iptables -A OUTPUT -m owner --pid-owner 78
Penjelasan Pertandingan ini digunakan untuk mencocokkan paket-paket berdasarkan pada Process ID (PID) yang bertanggung jawab untuk mereka. Kecocokan ini sedikit lebih sulit untuk digunakan, tetapi satu contoh hanya akan memungkinkan PID 94 mengirim paket dari port HTTP (tentu saja jika proses HTTP tidak di-threaded). Atau kita bisa menulis skrip kecil yang mengambil PID dari keluaran ps untuk daemon tertentu dan kemudian menambahkan aturan untuk itu. Sebagai contoh, Anda bisa memiliki aturan seperti yang ditunjukkan pada contoh Pid-owner.txt

Mircea Vutcovici
sumber
Saya pikir ini terkait dengan solusi saya untuk cara terbaik untuk melakukan ini. --pid-pemilik tidak benar-benar memilih berdasarkan pada proses, tetapi pemilik proses. Saya harus membuat pengguna khusus untuk meluncurkan proses dan kemudian memfilter berdasarkan pada pemilik itu supaya saya bisa memastikan saya membentuk lalu lintas hanya dari proses tertentu dan tidak, katakanlah, beberapa daemon yang mungkin diluncurkan dari pengguna generik.
Wesley
@Wesley Bukan itu yang dikatakan halaman manual: " --pid-owner processidCocok jika paket itu dibuat oleh suatu proses dengan proses id yang diberikan ." linux.die.net/man/8/iptables
Ajedi32
Jawaban ini akan jauh lebih baik jika menyertakan contoh bagaimana menggunakan iptables dan tc untuk tujuan ini. Contoh yang diberikan iptables -A OUTPUT -m owner --pid-owner 78tampaknya tidak lengkap (karena hanya cocok dengan paket, ia tidak mengatakan bagaimana "menandai" mereka) dan tctidak dijelaskan sama sekali.
Ajedi32
Untuk menandai paket Anda perlu menambahkan sesuatu seperti -j MARK --set-mark 1. Untuk perincian lebih lanjut, lihat: wiki.archlinux.org/index.php/…
Mircea Vutcovici
40

Salah satu opsi yang baru saya temukan adalah menggunakan tetesan .

trickle adalah pembentuk bandwidth userspace ringan portabel. Itu dapat berjalan dalam mode kolaboratif (bersama dengan menetes) atau dalam mode yang berdiri sendiri.

trickle berfungsi dengan memanfaatkan preloading loader unix. Pada dasarnya itu memberikan, ke aplikasi, versi baru dari fungsionalitas yang diperlukan untuk mengirim dan menerima data melalui soket. Lalu lintas dibatasi berdasarkan penundaan pengiriman dan penerimaan data melalui soket. trickle berjalan sepenuhnya di ruang pengguna dan tidak memerlukan hak akses root.

Wesley
sumber
1
Inilah yang memecahkan masalah saya. Saya mengalami masalah dengan daemon bitcoin yang secara acak menyedot semua bandwidth saya ketika seorang klien memutuskan bahwa saya adalah orang yang harus mereka unduh dari seluruh blockchain.
Mahakuasa
The tricklelink yang Anda berikan mengarah ke 404.
Geremia
Saya memperbaiki tautan yang rusak (dengan menggantinya dengan tautan Wayback Machine).
G-Man Mengatakan 'Reinstate Monica'
3
Trickle tampaknya ada di github sekarang: github.com/mariusae/trickle
Cheetah
atausudo apt-get install trickle
ggll
22

Jika Anda dapat menulis ke sebuah pipa (atau stdout), Anda dapat menginstal perintah pv(penampil pipa). Awalnya ditulis untuk menampilkan kemajuan data yang ditransfer melalui pipa.

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
sumber
Ini sebenarnya jawaban yang saya pikir akan saya gunakan! Namun, itu bukan jawaban yang tepat untuk pertanyaan spesifik yang awalnya saya tanyakan. Sayangnya, pertanyaannya agak berubah tetapi masih fokus pada membatasi kecepatan jaringan suatu proses. Namun, Anda dapat berkontribusi untuk pertanyaan baru yang saya ajukan: unix.stackexchange.com/q/34174/4232
Wesley
Terima kasih! Saya melakukan hal yang sama dan akhirnya melakukan ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
clacke
1
Bisa dikombinasikan dengan ionice juga, tetapi tidak diizinkan di server tertentu. 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

Saya menggunakan rsync dengan opsi --bwlimit = KBPS untuk alasan yang sama.

Ethernet 1 Gbit kami dengan mudah dapat membanjiri RAID DAS SCSI320 lama kami, dan pada dasarnya DOS adalah beberapa kotak produksi lama kami yang mengandalkannya untuk toko NFS-nya.

Magellan
sumber
4

Bagaimana Anda mentransfer data? (rsync atas ssh? scp? sftp? sesuatu yang lain?)

rsync akan memungkinkan Anda untuk membatasi bandwidth (lihat opsi --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Atau, Anda dapat mengatur qdisc atau setara untuk melakukan pembatasan tarif mewah, tetapi saya menduga bahwa dalam kasus Anda ini akan menjadi kerja keras yang berlebihan. Dokumentasi tentang ini tersedia di Linux Advanced Routing dan Traffic Control HOWTO

Devdas
sumber