मैं एक प्रक्रिया द्वारा उपयोग किए जाने वाले बैंडविड्थ को कैसे सीमित कर सकता हूं?


42

मेरे पास एक सेंटोस 5.7 सर्वर है जो रात को अपनी फाइलों का बैकअप लेगा। मुझे चिंता है कि सर्वर द्वारा होस्ट किए जाने वाले विभिन्न साइटों पर आने वाले आगंतुकों को अपमानित प्रदर्शन का अनुभव होगा जबकि बैकअप पूरे नेटवर्क में स्थानांतरित हो रहा है।

क्या नेटवर्क इंटरफ़ेस में किसी प्रक्रिया की अधिकतम अनुमत थ्रूपुट को सीमित करना संभव है? मैं अपने उपलब्ध बैंडविड्थ के केवल आधे हिस्से में एसएसएच-आधारित फ़ाइल स्थानांतरण को सीमित करना चाहूंगा। यह सर्वर या क्लाइंट की तरफ हो सकता है; यही है, मुझे ऐसा करने में खुशी होगी या तो उस क्लाइंट पर जो कनेक्शन शुरू करता है या कनेक्शन प्राप्त करने वाला सर्वर।

(दुर्भाग्य से, मैं बैकअप के लिए समर्पित करने के लिए एक इंटरफ़ेस नहीं जोड़ सकता। मैं अपने उपलब्ध थ्रूपुट को बढ़ा सकता हूं, लेकिन इसका मतलब केवल यह होगा कि नेटवर्क हस्तांतरण तेजी से पूरा होगा, लेकिन फिर भी इसे करते समय कनेक्शन की कुल क्षमता अधिकतम होगी।)


कुछ पृष्ठभूमि

शायद कुछ पृष्ठभूमि क्रम में है। वापस कदम रखते हुए, मुझे बैकअप बनाने के लिए पर्याप्त स्थानीय स्थान न होने की समस्या थी। SSHFS दर्ज करें! जो स्थानीय रूप से एक स्थानीय ड्राइव है, ताकि कोई बैकअप बिट्स कभी भी वेब सर्वर पर न हो, बैकअप सहेजा जाता है।

वह महत्वपूर्ण क्यों है? क्योंकि यह आदरणीय के उपयोग को अमान्य करने के लिए प्रतीत होता है rsync --bwlimitrsyncवास्तव में स्थानांतरण नहीं कर रहा है और न ही कर सकता है क्योंकि मैं बैकअप फ़ाइल को सहेजने के लिए स्थान भी नहीं बचा सकता।

मैं आपको यह पूछते हुए सुन सकता हूं: "तो रुको, आपको एक बैकअप फ़ाइल बनाने की आवश्यकता क्यों है? न केवल rsyncस्रोत फ़ाइलों और फ़ोल्डरों को क्यों?" क्योंकि मिक्स में "प्लस्क" नामक एक कष्टप्रद बात है! यह मेरा क्लाइंट-फेसिंग वेब होस्ट है जो सुविधा के लिए प्लेस्क का उपयोग करता है। जैसे, मैं बैकअप शुरू करने के लिए Plesk का उपयोग करता हूं क्योंकि Plesk बैकअप के लिए सभी प्रकार के अतिरिक्त जादू जोड़ता है जो एक बहाली प्रक्रिया के दौरान इसका सेवन बहुत सुरक्षित बनाता है।

उदास चेहरा



1
मेरी स्थिति के लिए एक और संभावना, जो संयोगवश विशिष्ट प्रश्न का उत्तर नहीं देती है , यह है ioniceकि लिखने के लिए उपयोग करना है जो एक प्रक्रिया कर सकती है। चूंकि मैं SSHFS फाइलसिस्टम में लिख रहा हूं, इसलिए मैं पूरी तरह से किसी भी अन्य प्रक्रिया को लिखने के लिए बैकअप प्रक्रिया की कक्षा को 3 से ड्रॉप कर सकता हूं जो लिखना चाहता है। इस तरह मुझे वह प्रभाव मिलता है जो मैं चाहता हूं कि बैकअप हॉगिंग बैंडविड्थ की वजह से साइट विजिटर के अनुभव को कभी कम न करें।
वेस्ले

एक सवाल, आपके ssh कम्प्रेशन का उपयोग करता है? आपके .ssh / config करने के लिए "संपीड़न हाँ"?
ज़्लातको

जवाबों:


25

आप iptablesएक पैकेट (-पिड-मालिक ...) को चिह्नित करने के लिए उपयोग कर सकते हैं , फिर tcट्रैफ़िक को आकार देने के लिए उपयोग कर सकते हैं। इसके अलावा "-साइड-ओनर" का उपयोग थ्रेड्स और उस प्रक्रिया के बच्चों को शामिल करने के लिए किया जा सकता है।

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

मैच --pid- मालिक
कर्नेल 2.3, 2.4, 2.5 और 2.6
उदाहरण iptables-OUTPUT -m मालिक --pid-owner 78
स्पष्टीकरण इस मैच का उपयोग प्रक्रिया आईडी (PID) के आधार पर पैकेट से मेल खाने के लिए किया जाता है जो उनके लिए जिम्मेदार था। यह मैच उपयोग करने के लिए थोड़ा कठिन है, लेकिन एक उदाहरण केवल पीआईडी ​​94 को HTTP पोर्ट से पैकेट भेजने की अनुमति देने के लिए होगा (यदि एचटीटीपी प्रक्रिया थ्रेडेड नहीं है, तो निश्चित रूप से)। वैकल्पिक रूप से हम एक छोटी स्क्रिप्ट लिख सकते हैं जो पीआईडी ​​को एक विशिष्ट डेमॉन के लिए पीएस आउटपुट से पकड़ती है और फिर इसके लिए एक नियम जोड़ती है। उदाहरण के लिए, आपके पास एक नियम हो सकता है जैसा कि Pid-owner.txt उदाहरण में दिखाया गया है


मुझे लगता है कि ऐसा करने के सबसे अच्छे तरीके के लिए यह मेरे समाधान के साथ जुड़ा हुआ है। -पिड-मालिक वास्तव में प्रक्रिया के आधार पर चयन नहीं करता है, लेकिन प्रक्रिया के मालिक। मुझे इस प्रक्रिया को लॉन्च करने के लिए एक विशेष उपयोगकर्ता बनाना होगा और फिर उस स्वामी के आधार पर फ़िल्टर करना होगा ताकि मैं यह सुनिश्चित कर सकूं कि मैं उस विशिष्ट प्रक्रिया से ट्रैफ़िक को आकार दे रहा हूं और यह नहीं कह सकता कि, कई डेमॉन लॉन्च किए गए हैं एक सामान्य उपयोगकर्ता।
वेस्ले

@Wesley यही वह नहीं है जो मैन पेज कहता है: " --pid-owner processidमेल खाता है यदि पैकेट किसी प्रक्रिया आईडी के साथ बनाया गया था ।" linux.die.net/man/8/iptables
Ajedi32

यह उत्तर बहुत बेहतर होगा यदि इसमें इस उद्देश्य के लिए iptables और tc का उपयोग करने का एक उदाहरण शामिल है। दिया गया iptables -A OUTPUT -m owner --pid-owner 78उदाहरण पूर्ण नहीं लगता (क्योंकि यह केवल पैकेट से मेल खाता है, यह नहीं कहता कि उन्हें "कैसे चिह्नित करें") और उन्हें tcबिल्कुल नहीं समझाया गया है।
Ajedi32

एक पैकेट को चिह्नित करने के लिए आपको कुछ ऐसा जोड़ना होगा -j MARK --set-mark 1। अधिक जानकारी के लिए देखें: wiki.archlinux.org/index.php/…
Mircea Vutcovici

40

एक विकल्प जो मैंने अभी खोजा है वह ट्रिकल का उपयोग करना है ।

ट्रिकल एक पोर्टेबल लाइटवेट यूजरस्पेस बैंडविड्थ शेपर है। यह सहयोगी मोड (एक साथ छल) के साथ या अकेले खड़े मोड में चल सकता है।

ट्रिक्स यूनिक्स लोडर प्रीलोडिंग का लाभ उठाकर काम करती है। अनिवार्य रूप से यह एप्लिकेशन को, सॉकेट के माध्यम से डेटा भेजने और प्राप्त करने के लिए आवश्यक कार्यक्षमता का एक नया संस्करण प्रदान करता है। यह तब सॉकेट पर डेटा भेजने और प्राप्त करने में देरी के आधार पर यातायात को सीमित करता है। ट्रिकल पूरी तरह से यूजरस्पेस में चलता है और इसके लिए रूट विशेषाधिकारों की आवश्यकता नहीं होती है।


1
यह वही है जिसने मेरी समस्या को हल किया है। मुझे बिटकॉइन डेमॉन के साथ बेतरतीब ढंग से मेरे सभी बैंडवाडिथ को चूसने में समस्या हो रही थी जब एक ग्राहक ने फैसला किया कि मैं वह व्यक्ति हूं जिससे उन्हें पूरे ब्लॉकचेन को डाउनलोड करना चाहिए।
सर्वव्यापी

trickleलिंक आप एक 404. करने के लिए सुराग दे दी है
Geremia

मैंने टूटी हुई कड़ी को ठीक किया (इसे वेनबैक मशीन लिंक से बदलकर)।
जी-मैन ने कहा कि 'मोनिका'

3
ट्रिकल लगता है अब github पर है: github.com/mariusae/trickle
चीता

याsudo apt-get install trickle
ggll

22

यदि आप एक पाइप (या स्टडआउट) को लिख सकते हैं, तो आप pv(पाइप दर्शक) कमांड स्थापित कर सकते हैं । यह मूल रूप से एक पाइप के माध्यम से स्थानांतरित किए गए डेटा की प्रगति को प्रदर्शित करने के लिए लिखा गया था।

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.

यह वास्तव में जवाब है जो मुझे लगता है कि मैं उपयोग करूँगा! हालाँकि, यह मूल रूप से पूछे गए विशिष्ट प्रश्न का उत्तर नहीं है। काश, प्रश्न का आकार एक प्रकार की है लेकिन फिर भी एक प्रक्रिया की नेटवर्क गति को सीमित करने पर केंद्रित था। हालाँकि, आप मेरे द्वारा पूछे गए इस नए प्रश्न में योगदान कर सकते हैं: unix.stackexchange.com/q/34174/4232
वेस्ले

धन्यवाद! मैं एक समान काम कर रहा था और कर रहा था ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
क्ले

1
इसे आयनिस के साथ भी जोड़ सकते थे, लेकिन उस विशेष सर्वर पर इसकी अनुमति नहीं थी। ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
क्ले

6

मैं उसी कारण के लिए --bwlimit = KBPS विकल्प के साथ rsync का उपयोग करता हूं।

हमारा 1 Gbit ईथरनेट हमारे पुराने SCSI320 DAS RAID को आसानी से स्वाइप करने में सक्षम है, और अनिवार्य रूप से DOS के कुछ पुराने उत्पादन बॉक्स हैं जो इसके NFS स्टोर के लिए इस पर निर्भर हैं।


4

आप डेटा को कैसे स्थानांतरित कर रहे हैं? (ssp पर rsync? scp? sftp? कुछ और?)

rsync आपको बैंडविड्थ को सीमित करने की अनुमति देगा (विकल्प देखें --bwlimit = KBPS)। rsync -इ ssh --bwlimit ।।

वैकल्पिक रूप से, आप फैंसी दर को सीमित करने के लिए एक qdisc या समकक्ष सेट कर सकते हैं, लेकिन मुझे संदेह है कि आपके मामले में यह गंभीर टॉस्किल होगा। इस पर प्रलेखन लिनक्स उन्नत रूटिंग और ट्रैफिक कंट्रोल HOWTO पर उपलब्ध है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.