ฉันกำลังมองหาวิธี จำกัด กระบวนการของดิสก์ io ถึงขีด จำกัด ความเร็วที่ตั้งไว้ โดยหลักการแล้วโปรแกรมจะทำงานคล้ายกับสิ่งนี้:
$ limitio --pid 32423 --write-limit 1M
จำกัด กระบวนการ 32423 ถึง 1 เมกะไบต์ต่อวินาทีความเร็วในการเขียนฮาร์ดไดรฟ์
ฉันกำลังมองหาวิธี จำกัด กระบวนการของดิสก์ io ถึงขีด จำกัด ความเร็วที่ตั้งไว้ โดยหลักการแล้วโปรแกรมจะทำงานคล้ายกับสิ่งนี้:
$ limitio --pid 32423 --write-limit 1M
จำกัด กระบวนการ 32423 ถึง 1 เมกะไบต์ต่อวินาทีความเร็วในการเขียนฮาร์ดไดรฟ์
คำตอบ:
นั่นเป็นงานที่ไม่สำคัญอย่างแน่นอนที่ไม่สามารถทำได้ใน userspace โชคดีที่มันเป็นไปได้ที่จะทำบน Linux ใช้cgroup
mechanizm และควบคุม 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
ฉันไม่รู้ว่าจะสามารถทำได้ในระบบปฏิบัติการอื่นหรือไม่
dd ... oflag=direct
จะทำงานตามที่คาดไว้ cgroup v2 สามารถจัดการกับสิ่งนี้ได้หากระบบไฟล์รองรับ รายละเอียด: การใช้ cgroups เพื่อ จำกัด I / O
ionice
จากutil-linux
สิ่งที่คล้ายกับสิ่งที่คุณต้องการ
ไม่ได้ตั้งค่าขีด จำกัด IO แบบสัมบูรณ์ แต่จะตั้งค่าลำดับความสำคัญของ IO และ 'ความดี' - คล้ายกับnice
ลำดับความสำคัญของ CPU ในกระบวนการ
จากหน้าคน:
ionice - ตั้งค่าหรือรับคลาสการกำหนดตารางเวลากระบวนการ I / O และลำดับความสำคัญ รายละเอียด โปรแกรมนี้ตั้งค่าหรือรับคลาสการกำหนดตารางเวลา I / O และลำดับความสำคัญสำหรับ โครงการ หากไม่ได้ระบุอาร์กิวเมนต์หรือเพียงแค่ -p ionice จะทำการค้นหา คลาสการกำหนดตารางเวลา I / O ปัจจุบันและลำดับความสำคัญสำหรับกระบวนการนั้น เมื่อได้รับคำสั่งอิออนจะเรียกใช้คำสั่งนี้พร้อมกับคำสั่งที่กำหนด ข้อโต้แย้ง หากไม่ได้ระบุคลาสแล้วคำสั่งจะถูกดำเนินการ กับคลาสการกำหนดตารางเวลา "ความพยายามที่สุด" ระดับความสำคัญเริ่มต้นคือ 4
CFQ
I / O ตารางเวลา ระบบที่ทันสมัยจำนวนมากมีระบบที่deadline
เปิดใช้งานโดยค่าเริ่มต้น
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
เรียกใช้โปรแกรมในเบื้องหน้า
คำตอบของfcheนั้นเป็นคำใบ้ที่ดีมากขอบคุณแม้ว่ามันจะไม่สามารถแก้ปัญหาได้จริง ๆ แต่คำถามก็คือการ จำกัด กระบวนการให้แบนด์วิดท์เฉพาะ
ฉันขอแนะนำสิ่งนี้:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
หรือรุ่นที่เลิกใช้:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
สิ่งนี้ยังไม่พอดีกับคำถามที่ทำให้ไม่สามารถใช้สำหรับกระบวนการที่กำลังทำงานอยู่ได้ แต่อาจเป็นประโยชน์ในบางกรณี
ลิงค์:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
และคุณได้รับ X และ Y โดยls -l /dev/sda