ฉันจะ จำกัด แบนด์วิดท์ที่ใช้โดยกระบวนการได้อย่างไร


42

ฉันมีเซิร์ฟเวอร์ CentOS 5.7 ที่จะทำการสำรองไฟล์ทุกคืน ฉันกังวลว่าผู้เยี่ยมชมไซต์ต่างๆที่โฮสต์เซิร์ฟเวอร์จะได้รับประสิทธิภาพลดลงในขณะที่การสำรองข้อมูลกำลังถ่ายโอนข้ามเครือข่าย

เป็นไปได้หรือไม่ที่จะ จำกัด ปริมาณการรับส่งข้อมูลสูงสุดที่กระบวนการอนุญาตให้เชื่อมต่อกับเครือข่าย ฉันต้องการ จำกัด การถ่ายโอนไฟล์ที่ใช้ SSH เพียงครึ่งหนึ่งของแบนด์วิดท์ที่มีอยู่ของฉัน นี่อาจเป็นทางเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ นั่นคือฉันยินดีที่จะทำเช่นนี้กับลูกค้าที่เริ่มต้นการเชื่อมต่อหรือเซิร์ฟเวอร์ที่ได้รับการเชื่อมต่อ

(น่าเสียดายที่ฉันไม่สามารถเพิ่มอินเทอร์เฟซเพื่ออุทิศให้กับการสำรองข้อมูลฉันสามารถเพิ่มปริมาณงานที่มีได้ แต่นั่นก็หมายความว่าการถ่ายโอนเครือข่ายจะเสร็จเร็วขึ้น แต่ยังคงความจุสูงสุดของการเชื่อมต่อทั้งหมด


พื้นหลังบางส่วน

บางทีพื้นหลังบางอย่างอยู่ในลำดับ เมื่อย้อนกลับไปฉันมีปัญหากับการมีพื้นที่ในตัวเครื่องไม่เพียงพอในการสร้างข้อมูลสำรอง ใส่ SSHFS! การสำรองข้อมูลจะถูกบันทึกไว้ในสิ่งที่เป็นไดรฟ์ภายในอย่างเห็นได้ชัดเพื่อให้ไม่มีบิตการสำรองข้อมูลอยู่บนเว็บเซิร์ฟเวอร์

เหตุใดจึงสำคัญ เพราะดูเหมือนว่าจะทำให้การใช้งานของผู้นับถือrsync --bwlimitนั้นเป็นโมฆะ rsyncไม่ได้ทำการโอนย้ายหรือทำได้เพราะฉันไม่สามารถสำรองพื้นที่ในการบันทึกไฟล์สำรองได้

ฉันได้ยินคุณถามว่า: "เดี๋ยวก่อนทำไมคุณถึงต้องสร้างไฟล์สำรองข้อมูลด้วยทำไมไม่เพียงแค่rsyncไฟล์และโฟลเดอร์ต้นทาง" เพราะสิ่งที่น่ารำคาญที่เรียกว่า "Plesk" อยู่ในส่วนผสม! นี่คือเว็บโฮสต์ที่ไคลเอ็นต์ของฉันซึ่งใช้ Plesk เพื่อความสะดวก ด้วยเหตุนี้ฉันจึงใช้ Plesk เพื่อเริ่มการสำรองข้อมูลเพราะ Plesk เพิ่มความมหัศจรรย์พิเศษทุกประเภทให้กับการสำรองข้อมูลที่ใช้งานได้ในระหว่างขั้นตอนการกู้คืนที่ปลอดภัยมาก

หน้าเศร้า



1
ความเป็นไปได้สำหรับสถานการณ์ของฉันซึ่งบังเอิญไม่ได้อีกว่าตอบคำถามที่เฉพาะเจาะจงคือการใช้ioniceเค้นเขียนที่กระบวนการที่สามารถทำให้ เนื่องจากฉันกำลังเขียนไปยังระบบไฟล์ SSHFS ฉันสามารถปล่อยคลาสของกระบวนการสำรองข้อมูลเป็น 3 เพื่อให้มันสมบูรณ์ให้กับกระบวนการอื่น ๆ ที่ต้องการเขียน ด้วยวิธีนี้ฉันจะได้รับผลกระทบที่ฉันต้องการซึ่งจะไม่ลดทอนประสบการณ์ของผู้เยี่ยมชมไซต์เนื่องจากแบนด์วิดท์การรับข้อมูลสำรอง
Wesley

หนึ่งคำถาม ssh ของคุณใช้การบีบอัด? "การบีบอัดใช่" เป็น. ssh / config ของคุณหรือไม่
Zlatko

คำตอบ:


25

คุณสามารถใช้iptablesเพื่อทำเครื่องหมายแพ็คเก็ต (--pid-owner ... ) จากนั้นใช้tcเพื่อกำหนดรูปร่างการรับส่งข้อมูล นอกจากนี้ยังสามารถใช้ "--sid-owner" เพื่อรวมเธรดและลูกของกระบวนการนั้น

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

จับคู่ --pid-owner
Kernel 2.3, 2.4, 2.5 และ 2.6
ตัวอย่าง iptables -A OUTPUT -m owner --pid-owner 78
คำอธิบายการ จับคู่นี้ใช้เพื่อจับคู่แพ็กเก็ตตามรหัสกระบวนการ (PID) ที่รับผิดชอบ การจับคู่นี้ใช้งานยากขึ้นเล็กน้อย แต่ตัวอย่างหนึ่งจะอนุญาตให้ PID 94 ส่งแพ็กเก็ตจากพอร์ต HTTP เท่านั้น (หากกระบวนการ HTTP ไม่ได้ถูกเธรดแน่นอน) อีกทางเลือกหนึ่งเราสามารถเขียนสคริปต์ขนาดเล็กที่คว้า PID จากเอาต์พุต ps สำหรับ daemon ที่เฉพาะเจาะจงแล้วเพิ่มกฎสำหรับมัน ตัวอย่างเช่นคุณอาจมีกฎตามที่แสดงในตัวอย่าง Pid-owner.txt


ฉันคิดว่าสิ่งนี้เชื่อมโยงกับโซลูชันของฉันสำหรับวิธีที่ดีที่สุดในการทำสิ่งนี้ --pid-owner ไม่ได้เลือกตามกระบวนการ แต่เป็นเจ้าของกระบวนการ ฉันจะต้องสร้างผู้ใช้พิเศษเพื่อเปิดใช้กระบวนการเป็นและจากนั้นกรองตามเจ้าของนั้นดังนั้นฉันจึงมั่นใจได้ว่าฉันกำลังสร้างทราฟฟิกจากกระบวนการเฉพาะนั้นและไม่ใช่พูดหลาย daemons ที่อาจเปิดตัวจาก ผู้ใช้ทั่วไป
Wesley

@Wesley นั่นไม่ใช่สิ่งที่ man page พูดว่า: " --pid-owner processidตรงกันถ้าแพ็กเก็ตถูกสร้างโดยกระบวนการที่มี id กระบวนการที่กำหนด " 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

ทางเลือกหนึ่งที่ฉันเพิ่งค้นพบคือการใช้หยด

หยดเป็น shaper แบนด์วิดธ์ของผู้ใช้แบบพกพาน้ำหนักเบา มันสามารถทำงานในโหมดการทำงานร่วมกัน (พร้อมกับเล็ดลอด) หรือในโหมดสแตนด์อะโลน

หยดทำงานโดยใช้ประโยชน์จากการโหลดไว้ล่วงหน้า unix โดยพื้นฐานแล้วแอพพลิเคชั่นนี้เป็นเวอร์ชั่นใหม่ของฟังก์ชันการทำงานที่จำเป็นในการส่งและรับข้อมูลผ่านซ็อกเก็ต จากนั้นจะ จำกัด ปริมาณการรับส่งข้อมูลตามการหน่วงเวลาการส่งและรับข้อมูลผ่านซ็อกเก็ต หยดทำงานในพื้นที่ผู้ใช้ทั้งหมดและไม่ต้องการสิทธิ์รูท


1
นี่คือสิ่งที่แก้ไขปัญหาของฉัน ฉันมีปัญหากับ bitcoin daemon ดูด bandwdith ทั้งหมดของฉันแบบสุ่มเมื่อลูกค้าตัดสินใจว่าฉันเป็นคนที่พวกเขาควรดาวน์โหลด blockchain ทั้งหมดจาก
Omnifarious

trickleเชื่อมโยงคุณให้นำไปสู่การ 404
Geremia

ฉันแก้ไขลิงก์ที่เสียหาย (โดยแทนที่ด้วยลิงก์ Wayback Machine)
G-Man กล่าวว่า 'Reinstate Monica'

3
Trickle ดูเหมือนจะอยู่ใน github ตอนนี้: github.com/mariusae/trickle
Cheetah

หรือsudo apt-get install trickle
ggll

22

หากคุณสามารถเขียนไปที่ไพพ์ (หรือ stdout) คุณสามารถติดตั้ง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.

นี่คือคำตอบที่ฉันคิดว่าฉันจะใช้! อย่างไรก็ตามมันไม่ใช่คำตอบสำหรับคำถามเฉพาะที่ฉันถาม อนิจจาคำถามประเภท morphed แต่ยังคงมุ่งเน้นไปที่การ จำกัด ความเร็วเครือข่ายของกระบวนการ อย่างไรก็ตามคุณสามารถมีส่วนร่วมกับคำถามใหม่นี้ที่ฉันถาม: unix.stackexchange.com/q/34174/4232
Wesley

ขอบคุณ! ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gzผมทำสิ่งที่คล้ายกันและจบลงด้วยการทำ
clacke

1
อาจรวมกับ ionice ด้วยเช่นกัน แต่มันไม่ได้รับอนุญาตบนเซิร์ฟเวอร์นั้น 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

ฉันใช้ rsync กับตัวเลือก --bwlimit = KBPS ด้วยเหตุผลเดียวกัน

อีเทอร์เน็ต 1 Gbit ของเราสามารถลบ SCSI320 DAS RAID เก่าของเราได้อย่างง่ายดายและโดยพื้นฐานแล้ว DOS เป็นกล่องผลิตรุ่นเก่าของเราบางส่วนที่ใช้ในร้าน NFS


4

คุณจะถ่ายโอนข้อมูลได้อย่างไร (rsync มากกว่า ssh? scp? sftp อย่างอื่น)

rsync จะอนุญาตให้คุณ จำกัด แบนด์วิดท์ (ดูตัวเลือก --bwlimit = KBPS) rsync -e ssh --bwlimit ..

อีกวิธีหนึ่งคุณสามารถตั้งค่า qdisc หรือเทียบเท่าเพื่อ จำกัด อัตราแฟนซี แต่ฉันสงสัยว่าในกรณีของคุณนี้จะเป็น overkill รุนแรง เอกสารเกี่ยวกับเรื่องนี้มีอยู่ที่Linux Advanced Routing และ Traffic HOWTO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.