เคยคัดลอกหรือย้ายข้อมูลหลายสิบหรือหลายร้อยกิกะไบต์? หากเคย คุณแน่สังเกตว่าระบบตอบสนองช้าลงมากในช่วงนั้น ใน Linux คุณสามารถหลีกเลี่ยงได้ด้วยคำสั่ง ionice
I/O Priority คืออะไร?
I/O ย่อมาจาก Input/Output มีอุปกรณ์ I/O หลายประเภท แต่ในกรณีนี้เกี่ยวกับอุปกรณ์จัดเก็บข้อมูล
แต่ละกระบวนการที่ต้องการอ่านหรือเขียนข้อมูลไปยังอุปกรณ์ดังกล่าว จะได้รับการมอบหมาย Scheduling Class และ Priority number (หรือค่า "nice") บน Linux ใช้กับระบบไฟล์อย่าง ext4 ระบบไฟล์อื่นๆ เช่น ZFS อาจใช้วิธีการจัดตารางการอ่าน/เขียนดิสก์ที่แตกต่างเล็กน้อย นอกจากนี้ Scheduler CFQ ควรจะ Active สำหรับการทำงานนี้ ตรวจสอบได้ด้วย:
cat /sys/block/*/queue/scheduler
กระบวนการที่มีค่า "nice" สูง มี Priority ต่ำ ตรรกะคือ ค่าเท่าไหร่มาก ความ "ดี" ต่อกระบวนการอื่นเท่านั้น
I/O Priority ทำงานอย่างไร?
อุปกรณ์จัดเก็บมี IOPS (I/O operations per second) จำกัด เมื่อสองกระบวนการต้องการอ่าน/เขียนพร้อมกัน แต่ละตัวได้สัดส่วน IOPS หาก Priority เท่ากัน จะได้ประมาณ 50% แต่ละตัว
IOPS อาจดูนามธรรมและซับซ้อน เพื่อความเข้าใจง่าย ให้คิดถึงผลลัพธ์สุดท้าย: ความเร็วอ่าน/เขียน สมมติดิสก์เขียนได้สูงสุด 100MB/s กระบวนการ A เริ่มเขียน เขียนที่ 100MB/s กระบวนการ B มาต้องการเขียนดิสก์เดียวกัน จะเขียนประมาณ 50MB/s ทำให้ความเร็วเขียนของ A ลดเหลือ 50MB/s ตอนนี้ หากกำหนดให้ B มีค่า I/O nice สูงกว่า B จะเขียนที่ 20MB/s ให้ A เขียนที่ 80MB/s เมื่อ A เสร็จ B จะเริ่มเขียนที่ 100MB/s
ตัวอย่างนี้ช่วยเข้าใจสิ่งที่อาจสับสนบางคน หากกระบวนการมี Priority ต่ำมาก (ค่า nice สูง) ไม่ได้หมายความว่ามันจะเขียนช้าตลอดเวลา หากมันเป็นกระบวนการเดียวที่ใช้ดิสก์ มันจะอ่าน/เขียนด้วยความเร็วสูงสุด แต่เมื่อกระบวนการอื่นต้องการดิสก์ มันจะหลีกทางชั่วคราวและให้พวกเขาใช้แบนด์วิธดิสก์มากขึ้น สำหรับการคัดลอก/เขียนที่ใช้เวลาหลายชั่วโมง การให้ Priority ต่ำนั้นเป็นความคิดดี หากคุณต้องการใช้คอมพิวเตอร์ในช่วงนั้น
วิธีใช้คำสั่ง ionice
ไวยากรณ์ทั่วไปของคำสั่งคือ:
ionice -c scheduling_class -n priority_nice_value command
Scheduling Classes ของ ionice
Idle (Class 3): กระบวนการในคลาสนี้อ่าน/เขียนเฉพาะเมื่อไม่มีโปรแกรมอื่นต้องการเข้าถึงดิสก์ หมายความว่ากระบวนการอ่าน/เขียนที่ความเร็วเต็มที่เมื่อไม่มีคู่แข่ง เมื่อโปรแกรมอื่นต้องการเวลาดิสก์ กระบวนการในคลาส Idle จะอ่าน/เขียนด้วยทรัพยากรที่เหลือ จาก 100MB/s อาจเขียนชั่วคราวที่ 5MB/s แล้วกลับไป 100MB/s เมื่อโปรแกรมอื่นเสร็จสิ้นการเข้าถึงดิสก์ นี่คือคลาสที่สมบูรณ์แบบสำหรับงานที่รันนานและคุณไม่ต้องการให้ระบบช้า ไม่ต้องระบุ Priority สำหรับคลาสนี้
ตัวอย่างคำสั่ง:
ionice -c 3 cp /home/user/largefile /Backups
Best-effort (Class 2): รับค่า Priority/nice ระหว่าง 0 ถึง 7 จำไว้ว่า ตัวเลขต่ำ = Priority สูง ใช้คลาสนี้เมื่อต้องการปรับเวลาดิสก์อย่างละเอียดสำหรับสองกระบวนการขึ้นไป
ตัวอย่าง: คุณต้องการ Backup เสร็จเร็ว กำหนด nice value 0 คุณย้ายหนัง 6 เรื่องไปดิสก์อื่น แต่ไม่เร่งรีบ กำหนด nice value 7
ตัวอย่างคำสั่ง:
ionice -c 2 -n 0 backup_command
Realtime (Class 1): ควรใช้เฉพาะเมื่อสำคัญมากที่กระบวนการควรเขียนโดยเร็วที่สุด ไม่ถูกขัดจังหวะโดยโปรแกรมอื่น ผู้ใช้ส่วนใหญ่ไม่ต้องการและควรหลีกเลี่ยย ยกเว้นกรณีพิเศษ รองรับค่า nice 0-7 เช่นกัน เฉพาะ root เท่านั้นที่ใช้คลาสนี้ได้ หมายความว่าคุณอาจต้องเติม sudo นำหน้าคำสั่ง โปรดทราบว่ากระบวนการในคลาส Realtime priority 0 อาจทำให้กระบวนการอื่นขาดทรัพยากร ในทางปฏิบัติ หมายถึงโปรแกรมอื่นอาจต้องรอนาทีหรือชั่วโมงเพื่ออ่าน/เขียนข้อมูลเพียงไม่กี่เมกะไบต์ ใช้ด้วยความระมัดระวัง เฉพาะเมื่อคุณแน่ใจว่าจำเป็น หากกระบวนการสำคัญในคลาส 2 หรือ 3 ต้องการเข้าถึงดิสก์ ระบบของคุณอาจค้างจนกระทั่งกระบวนการ Realtime เขียนเสร็จ
ตัวอย่างคำสั่ง:
sudo ionice -c 1 -n 7 bash
ตัวอย่าง ionice ที่มีประโยชน์
ในตัวอย่างสุดท้าย แทนที่จะรันคำสั่งคัดลอก/ย้าย ได้เปิด Shell (Bash) แทน ตอนนี้คำสั่งต่อไปที่คุณพิมพ์ใน Shell นั้นจะสืบทอด I/O Scheduling Class และ Priority คุณยังทำได้บน GUI
ionice -c 3 pcmanfm
คำสั่งสุดท้ายจะเปิด File Explorer บน LXDE แทนที่ "pcmanfm" ด้วยชื่อ File Explorer ของ Desktop Environment ของคุณ ตอนนี้การดำเนินการดิสก์ทั้งหมดที่คุณเริ่มต้นที่นี่จะทำงานด้วย I/O Scheduling Class แบบ Idle
ในสถานการณ์อื่น การคัดลอก/ย้ายอาจกำลังทำงานอยู่แล้ว ในกรณีนี้คุณสามารถใช้ ionice แบบต่างกัน:
ionice -c 3 -p 4910
คำสั่งนี้เปลี่ยน Priority Class ของโปรแกรมที่รันด้วย Process ID 4910 คุณหา PID ได้จาก Task Manager หรือคำสั่งอย่าง pgrep
สรุป
ionice มีประโยชน์บน Desktop ที่คุณไม่ต้องการให้ล้มขณะคัดลอก/ย้ายไฟล์ใหญ่ แต่จำไว้ว่ามันอาจมีประโยชน์มากกว่านั้นบนเซิร์ฟเวอร์ คุณแน่นอนไม่ต้องการให้เว็บไซต์ที่โฮสต์อยู่ ล้มกับผู้เยี่ยมชมขณะที่คุณทำ Full Backup