วิธี Throttle ต่อกระบวนการ I / O ถึงขีด จำกัด สูงสุด


32

ฉันกำลังมองหาวิธี จำกัด กระบวนการของดิสก์ io ถึงขีด จำกัด ความเร็วที่ตั้งไว้ โดยหลักการแล้วโปรแกรมจะทำงานคล้ายกับสิ่งนี้:

$ limitio --pid 32423 --write-limit 1M

จำกัด กระบวนการ 32423 ถึง 1 เมกะไบต์ต่อวินาทีความเร็วในการเขียนฮาร์ดไดรฟ์

คำตอบ:


33

นั่นเป็นงานที่ไม่สำคัญอย่างแน่นอนที่ไม่สามารถทำได้ใน userspace โชคดีที่มันเป็นไปได้ที่จะทำบน Linux ใช้cgroupmechanizm และควบคุม blkio

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

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

ตอนนี้คุณมีblkioชุดควบคุมแล้วคุณสามารถใช้มันได้:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

ตอนนี้คุณมี cgroup limit1Mที่ จำกัด ความเร็วในการเขียนบนอุปกรณ์ที่มีหมายเลขหลัก / รองหมายเลขX: Yถึง 1MB / s อย่างที่คุณเห็นขีด จำกัด นี้จะเป็นไปตามอุปกรณ์ สิ่งที่คุณต้องทำตอนนี้คือการทำให้กระบวนการบางอย่างอยู่ในกลุ่มนั้นและมันควรจะถูก จำกัด :

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

ฉันไม่รู้ว่าจะสามารถทำได้ในระบบปฏิบัติการอื่นหรือไม่


3
โปรดทราบว่าคุณจำเป็นต้องตั้งค่านโยบายรวมทั้งหมดของอุปกรณ์เพื่อสร้างกลุ่มย่อยโดยเช่นecho "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_deviceและคุณได้รับ X และ Y โดยls -l /dev/sda
dothebart

cgroup v1 ไม่สนับสนุนการเขียนแคชต่อไปนี้ นั่นหมายความว่าการทดสอบคำสั่ง dd อย่างง่าย ๆ ที่เขียนไปยังไฟล์มาตรฐานในระบบไฟล์ (แทนที่จะเป็นอุปกรณ์) อาจไม่แสดงข้อ จำกัด ใด ๆ ไม่ใช้การเขียนกลับใด ๆ จะทำงานได้: dd ... oflag=directจะทำงานตามที่คาดไว้ cgroup v2 สามารถจัดการกับสิ่งนี้ได้หากระบบไฟล์รองรับ รายละเอียด: การใช้ cgroups เพื่อ จำกัด I / O
AB

22

ioniceจากutil-linuxสิ่งที่คล้ายกับสิ่งที่คุณต้องการ

ไม่ได้ตั้งค่าขีด จำกัด IO แบบสัมบูรณ์ แต่จะตั้งค่าลำดับความสำคัญของ IO และ 'ความดี' - คล้ายกับniceลำดับความสำคัญของ CPU ในกระบวนการ

จากหน้าคน:

ionice - ตั้งค่าหรือรับคลาสการกำหนดตารางเวลากระบวนการ I / O และลำดับความสำคัญ

รายละเอียด
โปรแกรมนี้ตั้งค่าหรือรับคลาสการกำหนดตารางเวลา I / O และลำดับความสำคัญสำหรับ
โครงการ หากไม่ได้ระบุอาร์กิวเมนต์หรือเพียงแค่ -p ionice จะทำการค้นหา
คลาสการกำหนดตารางเวลา I / O ปัจจุบันและลำดับความสำคัญสำหรับกระบวนการนั้น

เมื่อได้รับคำสั่งอิออนจะเรียกใช้คำสั่งนี้พร้อมกับคำสั่งที่กำหนด
ข้อโต้แย้ง หากไม่ได้ระบุคลาสแล้วคำสั่งจะถูกดำเนินการ
กับคลาสการกำหนดตารางเวลา "ความพยายามที่สุด" ระดับความสำคัญเริ่มต้นคือ 4

5
หนึ่งควรจำไว้ว่ามันทำงานเฉพาะกับCFQI / O ตารางเวลา ระบบที่ทันสมัยจำนวนมากมีระบบที่deadlineเปิดใช้งานโดยค่าเริ่มต้น
Highstaker

8

systemd จัดเตรียม wrapper สำหรับการร้องขอ cgroup-manipulated จากหน้าคน systemd-run (1):

คำสั่งต่อไปนี้เรียกใช้เครื่องมือ updatedb (8) แต่ลดน้ำหนักบล็อก IO ลงเหลือ 10 ดูที่ systemd.resource-control (5) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติ BlockIOWeight =
systemd-run -p BlockIOWeight=10 updatedb

พิจารณาใช้--scopeตัวเลือกเพื่อให้systemd-runเรียกใช้โปรแกรมในเบื้องหน้า


7

คำตอบของfcheนั้นเป็นคำใบ้ที่ดีมากขอบคุณแม้ว่ามันจะไม่สามารถแก้ปัญหาได้จริง ๆ แต่คำถามก็คือการ จำกัด กระบวนการให้แบนด์วิดท์เฉพาะ

ฉันขอแนะนำสิ่งนี้:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

หรือรุ่นที่เลิกใช้:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

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

ลิงค์:

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