Computer >> คอมพิวเตอร์ >  >> ระบบ >> Linux

วิธีจัดการลำดับความสำคัญของกระบวนการ I/O ใน Linux

วิธีจัดการลำดับความสำคัญของกระบวนการ I/O ใน Linux

เคยคัดลอกหรือย้ายข้อมูลหลายสิบหรือหลายร้อยกิกะไบต์หรือไม่ หากคุณทำเช่นนั้น คุณจะสังเกตเห็นว่าระบบตอบสนองได้น้อยลงมากในช่วงเวลานั้น บน Linux คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยความช่วยเหลือของ ionice คำสั่ง

ลำดับความสำคัญของ I/O คืออะไร

I/O สั้นสำหรับอินพุต/เอาต์พุต มีอุปกรณ์ I/O หลายประเภท แต่ในกรณีนี้จะเกี่ยวกับอุปกรณ์จัดเก็บข้อมูล

แต่ละกระบวนการที่ต้องการอ่านหรือเขียนข้อมูลไปยังอุปกรณ์ดังกล่าวจะได้รับมอบหมายคลาสการจัดกำหนดการและหมายเลขลำดับความสำคัญ (หรือค่า "ดี") สิ่งนี้ใช้กับระบบไฟล์ Linux เช่น ext4 ระบบไฟล์อื่นๆ เช่น ZFS อาจใช้วิธีที่แตกต่างกันเล็กน้อยสำหรับการจัดกำหนดการการดำเนินการอ่าน/เขียนบนดิสก์ นอกจากนี้ ตัวจัดกำหนดการ CFQ ควรเปิดใช้งานเพื่อให้สิ่งนี้ทำงาน สามารถตรวจสอบได้ที่

cat /sys/block/*/queue/scheduler

กระบวนการที่มีค่า "ดี" สูงมีลำดับความสำคัญต่ำกว่า ตรรกะเบื้องหลังสิ่งนี้คือ ยิ่งจำนวนสูง กระบวนการก็จะยิ่ง "ดี" มากขึ้นสำหรับกระบวนการอื่นๆ

ลำดับความสำคัญของ I/O ทำงานอย่างไร

อุปกรณ์จัดเก็บข้อมูลมีจำนวนการดำเนินการ I/O ที่จำกัดที่สามารถทำได้ต่อวินาที (IOPS) ดังนั้นเมื่อกระบวนการทั้งสองต้องการอ่าน/เขียนพร้อมกัน ต่างก็ได้รับส่วนแบ่งของ IOPS หากมีลำดับความสำคัญเท่ากัน แต่ละรายการจะได้รับ IOPS ประมาณ 50%

วิธีจัดการลำดับความสำคัญของกระบวนการ I/O ใน Linux

แต่ IOPS อาจดูเป็นนามธรรมและซับซ้อน เพื่อความเรียบง่าย คุณสามารถนึกถึงผลลัพธ์สุดท้าย:ความเร็วในการอ่าน/เขียน สมมติว่าดิสก์ของคุณสามารถเขียนได้สูงสุด 100MB/s กระบวนการ A เริ่มดำเนินการเขียน มันเขียนลงดิสก์ด้วย 100MB/s กระบวนการ B มาพร้อมและต้องการเขียนลงในดิสก์เดียวกัน มันจะเขียนด้วยความเร็วประมาณ 50MB/s ทำให้กระบวนการ A ความเร็วในการเขียนมีค่าเท่ากันคือ 50MB/s ตอนนี้ ถ้าคุณกำหนดค่า I/O ที่ดีของกระบวนการ B ให้สูงขึ้น มันจะเขียนด้วย 20MB/s และปล่อยให้กระบวนการ A เขียนด้วย 80MB/s เมื่อกระบวนการ A เสร็จสิ้น กระบวนการ B จะเริ่มเขียนด้วยความเร็ว 100MB/s

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

วิธีใช้คำสั่งไอออไนซ์

ไวยากรณ์ทั่วไปของคำสั่งคือ:

ionice -c scheduling_class -n priority_nice_value command

คลาสการจัดตารางไอออนไนซ์

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

ตัวอย่างคำสั่ง:

ionice -c 3 cp /home/user/largefile /Backups

พยายามสุดความสามารถ (คลาส 2):ใช้ลำดับความสำคัญ/ค่าที่ดีระหว่าง 0 ถึง 7 โปรดจำไว้ว่า ตัวเลขที่ต่ำกว่าหมายถึงลำดับความสำคัญที่สูงกว่า ใช้คลาสนี้เมื่อคุณต้องการปรับแต่งเวลาดิสก์สำหรับกระบวนการตั้งแต่ 2 กระบวนการขึ้นไป

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

ตัวอย่างคำสั่ง:

ionice -c 2 -n 0 backup_command

วิธีจัดการลำดับความสำคัญของกระบวนการ I/O ใน Linux

เรียลไทม์ (คลาส 1):ควรใช้ก็ต่อเมื่อจำเป็นที่กระบวนการควรเขียนโดยเร็วที่สุดเท่าที่เป็นไปได้โดยไม่หยุดชะงักจากโปรแกรมอื่นๆ ผู้ใช้ส่วนใหญ่จะไม่ต้องการสิ่งนี้และควรหลีกเลี่ยงสิ่งนี้ ยกเว้นกรณีพิเศษ ยังรองรับค่าที่ดีระหว่าง 0 ถึง 7 เฉพาะรูทเท่านั้นที่สามารถใช้คลาสนี้ได้ ซึ่งหมายความว่าคุณอาจจะนำหน้าคำสั่งด้วย sudo โปรดทราบว่ากระบวนการในคลาสเรียลไทม์ที่มีลำดับความสำคัญเป็น 0 อาจทำให้กระบวนการอื่นๆ ของทรัพยากรหยุดชะงัก ในทางปฏิบัติ หมายความว่าโปรแกรมอื่นอาจต้องรอเป็นนาทีหรือเป็นชั่วโมงจึงจะเขียน/อ่านข้อมูลขนาดไม่กี่เมกะไบต์ให้เสร็จได้ ใช้ด้วยความระมัดระวัง เฉพาะเมื่อคุณแน่ใจว่าคุณต้องการสิ่งนี้ หากกระบวนการที่สำคัญในคลาส 2 หรือ 3 ต้องการการเข้าถึงดิสก์ ระบบของคุณอาจหยุดทำงานจนกว่ากระบวนการแบบเรียลไทม์จะเสร็จสิ้น

ตัวอย่างคำสั่ง:

sudo ionice -c 1 -n 7 bash

ตัวอย่างไอออนไนซ์ที่มีประโยชน์

ในตัวอย่างที่แล้ว แทนที่จะรันคำสั่ง copy/move เชลล์ได้เปิดใช้ (Bash) ตอนนี้ทุกคำสั่งที่ตามมาที่คุณพิมพ์ในเชลล์นั้นจะสืบทอดคลาสและลำดับความสำคัญของการจัดกำหนดการ I/O คุณยังสามารถทำสิ่งนี้ได้บนอินเทอร์เฟซแบบกราฟิก

ionice -c 3 pcmanfm

คำสั่งสุดท้ายจะเปิดตัว file explorer ในสภาพแวดล้อมเดสก์ท็อป LXDE แทนที่ "pcmanfm" ด้วยชื่อของ file explorer ของเดสก์ท็อปของคุณโดยเฉพาะ ตอนนี้ การดำเนินการดิสก์ทั้งหมดที่คุณเริ่มต้นจะถูกดำเนินการกับคลาสการตั้งเวลา I/O ที่ไม่ได้ใช้งาน

ในสถานการณ์อื่นๆ การทำสำเนา/ย้ายอาจเปิดใช้งานอยู่แล้ว ในกรณีนี้ คุณสามารถใช้ไอออไนซ์ในวิธีที่ต่างออกไปได้

ionice -c 3 -p 4910

การดำเนินการนี้จะเปลี่ยนระดับความสำคัญของโปรแกรมที่ทำงานด้วยรหัสกระบวนการ 4910 คุณสามารถค้นหา PID (ID กระบวนการ) ด้วยตัวจัดการงานของคุณหรือด้วยคำสั่งเช่น pgrep .

วิธีจัดการลำดับความสำคัญของกระบวนการ I/O ใน Linux

บทสรุป

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