Bir işlem tarafından kullanılan bant genişliğini nasıl sınırlayabilirim?


42

Dosyalarını her gece yedekleyecek bir CentOS 5.7 sunucum var. Yedekleme ağ üzerinden aktarılırken, sunucunun barındırdığı çeşitli sitelere gelen ziyaretçilerin düşük performans göstereceğinden endişe duyuyorum.

Bir işlemin izin verilen maksimum verimini bir ağ arabirimiyle sınırlandırmak mümkün mü? SSH tabanlı dosya aktarımını mevcut bant genişliğimin yalnızca yarısı ile sınırlamak istiyorum. Bu sunucu veya müşteri tarafında olabilir; yani, bağlantıyı başlatan istemcide veya bağlantıyı alan sunucuda bunu yapmaktan mutlu olurum.

(Ne yazık ki, yedeklemeye adamak için bir arayüz ekleyemiyorum. Kullanılabilir kapasitemi artırabilirim, ancak bu yalnızca ağ aktarımının daha hızlı tamamlandığı, ancak bağlantının toplam kapasitesini en yüksek düzeye çıkardığı anlamına gelir.)


Bazı arka plan

Belki bazı arka plan sırada. Geri adım attığımda, yedeği oluşturmak için yeterli yerel alana sahip olmadığımda sorun yaşadım. SSHFS'ye giriniz! Yedekleme görünüşte yerel bir sürücüye kaydedilir; böylece web sunucusunda hiçbir yedekleme biti bulunmaz.

Bu neden önemli? Çünkü bu saygıdeğer kullanımını geçersiz hale getirecek gibi görünüyor rsync --bwlimit. rsyncaslında aktarımı yapmıyor ya da yapamıyorum çünkü yedek dosyayı kaydetmek için alan ayıramam bile.

Sorunuzu duyabiliyorum: "Öyleyse bekleyin, neden bir yedekleme dosyası yapmanız gerekiyor? Neden yalnızca rsynckaynak dosya ve klasörler değil?" Çünkü "Plesk" denilen can sıkıcı bir şey karışımın içinde! Bu benim rahatlık için Plesk kullanan benim müşteri karşı karşıya web barındırma. Bu nedenle, yedeklemeyi başlatmak için Plesk'i kullanıyorum, çünkü Plesk, bir restorasyon işlemi sırasında onu tüketmeyi çok güvenli kılan her türlü ekstra sihri ekliyor.

Üzgün ​​surat



1
Durumum için tesadüfen belirli bir soruyu tam olarak cevaplamayan bir başka olasılık ionice, bir sürecin yapabileceği yazıları bastırmak için kullanmaktır . Bir SSHFS dosya sistemine yazdığım için, yedekleme işleminin sınıfını, yazmak isteyen başka bir işleme tamamen yol açması için 3'e bırakabilirim. Bu şekilde, yedek hogging bant genişliği nedeniyle bir site ziyaretçisinin deneyimini asla düşürmemeyi istediğim bir etki elde ediyorum.
Wesley

Bir soru, senin ssh sıkıştırma kullanır? .Ssh / config'ine "Sıkıştırma evet" mi?
Zlatko

Yanıtlar:


25

Sen kullanabilirsiniz iptablessonra, bir paket (--pid sahibi ...) işaretlemek için kullanmak tctrafik şekillendirmeye. Ayrıca, "--sid-owner", bu işlemin iş parçacıklarını ve alt öğelerini dahil etmek için kullanılabilir.

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

Eşleşme --pid-sahibi
Kernel 2.3, 2.4, 2.5 ve 2.6
Örnek iptables -A OUTPUT -m sahibi --pid-sahibi 78
Açıklama Bu maç, kendilerinden sorumlu olan İşlem Kimliğine (PID) dayalı paketleri eşleştirmek için kullanılır. Bu eşleşmeyi kullanmak biraz daha zor, ancak bir örnek yalnızca PID 94'ün HTTP bağlantı noktasından paketleri göndermesine izin vermek için olabilir (tabii ki HTTP süreci iş parçacığı değilse). Alternatif olarak, PID'yi belirli bir daemon için ps çıktısından alan küçük bir komut dosyası yazabilir ve sonra bunun için bir kural ekleyebiliriz. Örneğin, Pid-owner.txt örneğinde gösterildiği gibi bir kuralınız olabilir.


Bunu yapmanın en iyi yolunun benim çözümümle bağlantılı olduğunu düşünüyorum. --pid-owner aslında sürece dayanarak değil, işlem sahibini seçer. Süreci olduğu gibi başlatmak için özel bir kullanıcı oluşturmak zorunda kaldım ve sonra o sahibine göre filtreledim, böylece yalnızca belirli bir işlemden gelen trafiği şekillendirdiğimden eminim; genel bir kullanıcı.
Wesley

@Wesley Man sayfası bu değil: " --pid-owner processidPaketin verilen işlem kimliğine sahip bir işlem tarafından oluşturulmuş olması durumunda eşleşir ." linux.die.net/man/8/iptables
Ajedi32

Bu cevap, iptables ve tc'nin bu amaç için nasıl kullanılacağına dair bir örnek içeriyorsa çok daha iyi olurdu. Verilen iptables -A OUTPUT -m owner --pid-owner 78örnek tam olarak görünmüyor (yalnızca paketlerle eşleştiği için, onları "nasıl işaretleyeceğinizi" söylemiyor) ve tchiç açıklanmadı.
Ajedi32

Bir paketi işaretlemek için bir şey eklemeniz gerekir -j MARK --set-mark 1. Daha fazla ayrıntı için bakınız: wiki.archlinux.org/index.php/…
Mircea Vutcovici

40

Yeni keşfettiğim seçeneklerden biri, damlama kullanmak .

damlama taşınabilir hafif bir kullanıcı alanı bant genişliği şekillendirici. İşbirlikçi modda (damlatılarak birlikte) veya tek başına modda çalışabilir.

damlama unix yükleyici önyüklemesinden faydalanarak çalışır. Temel olarak, uygulamaya, soketlerden veri göndermek ve almak için gereken işlevselliğin yeni bir sürümünü sağlar. Daha sonra bir soket üzerinden veri göndermeyi ve almayı geciktirmeye dayalı olarak trafiği sınırlandırır. damlama tamamen kullanıcı alanında çalışır ve kök ayrıcalıkları gerektirmez.


1
Bu benim sorunumu çözdü. Bir müşteri bütün blockchain'i indirmeleri gereken kişi olduğuma karar verdiğinde rastgele tüm bant ustalarımı emen bitcoin cini ile ilgili bir problem yaşıyordum.
Omnifarious

trickleBağlantı sizi 404. yol açar verdi
Geremia

Kırık bağlantıyı düzelttim (bir Wayback Machine bağlantısı ile değiştirerek).
G-Man 'Monica'yı Yeniden Girin'

3
Damlama şimdi github'da
Cheetah

veyasudo apt-get install trickle
ggll

22

Bir boruya (veya stdout) yazabiliyorsanız, pv(boru görüntüleyici) komutunu yükleyebilirsiniz . Orijinal olarak bir borudan aktarılan verinin ilerlemesini göstermek için yazılmıştır.

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.

Aslında kullanacağımı sandığım cevap bu! Ancak, aslında sorduğum belirli bir sorunun cevabı değil. Ne yazık ki, soru biraz şekillendi ama yine de bir sürecin ağ hızını sınırlandırmaya odaklandı. Ancak sorduğum bu yeni soruya katkıda bulunabilirsiniz: unix.stackexchange.com/q/34174/4232
Wesley

Teşekkürler! Ben de benzer bir şey yapıyordum ve bitirdim ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
clacke

1
Ionice ile de birleştirmiş olabilir, ancak o sunucuya izin verilmedi. 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

Aynı sebepten dolayı --bwlimit = KBPS seçeneğiyle rsync kullanıyorum.

1 Gbit ethernet'imiz eski SCSI320 DAS RAID'imizi ve aslında NFS depoları için kullanılan eski üretim kutularımızı DOS'lardan kolayca kaldırabiliyor.


4

Verileri nasıl aktarıyorsunuz? (ssh üzerinden rsync? scp? sftp? başka bir şey?)

rsync bant genişliğini sınırlamanıza izin verecektir (--bwlimit = KBPS seçeneğine bakınız). rsync -e ssh --bwlimit ..

Alternatif olarak, fantezi oranını sınırlandırmak için bir qdisc veya eşdeğeri kurabilirsiniz, ancak sizin durumunuzda bunun aşırı derecede ağır olacağından şüpheleniyorum. Bununla ilgili belgeler Linux Gelişmiş Yönlendirme ve Trafik Kontrolü NASIL belgesinde bulunabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.