คำสั่ง nice ของ Linux: กำหนดลำดับความสำคัญ เปลี่ยนด้วย renice และวัดส่วนแบ่ง CPU เมื่อแย่งกัน
คำสั่ง nice ของ Linux คือคำสั่งที่กำหนดค่า nice (-20~19) ซึ่งเป็นตัวบอกว่าโปรแกรมจะยอมให้ CPU กับงานอื่นมากแค่ไหนเมื่อทำงาน ได้ผูกงานสองงานไว้กับ CPU คอร์เดียวบนเซิร์ฟเวอร์ AlmaLinux 9 แล้ววัดโดยเปลี่ยนค่า nice ไปเรื่อยๆ ผลคือส่วนแบ่ง CPU ถูกแบ่งเฉพาะเมื่อแย่ง CPU กัน และงาน nice 19 ใช้ไปเพียง 1.4%
โปรเซสที่ทำงานอยู่แล้วเปลี่ยนค่าด้วย renice ส่วนการยอมให้ในฝั่งดิสก์เป็นหน้าที่ของ ionice ทั้งสามคำสั่งแสดงผลลัพธ์ตามที่รันจริงด้วยบัญชี root และบัญชีผู้ใช้ทั่วไป
1️⃣ คำสั่ง nice ของ Linux: ช่วงของค่าและส่วนแบ่งเมื่อแย่ง CPU กัน
ค่า nice คือตัวเลขที่กำหนดว่าจะยอมให้มากแค่ไหนเมื่อแบ่งเวลา CPU และกำหนดได้ตั้งแต่ -20 ถึง 19 โปรแกรมทั่วไปทำงานด้วยค่า 0 โดย -20 ได้ทำก่อนสุด และ 19 ยอมให้มากที่สุด
มักเข้าใจกันว่าตัวเลขยิ่งมากยิ่งได้ทำก่อน แต่ค่า nice กลับตรงกันข้าม ตัวจัดลำดับงานของ Linux กำหนดน้ำหนักให้ค่า nice แต่ละค่า แล้วแบ่งเวลา CPU ตามสัดส่วนนั้น โดย nice 0 คือ 1024, 10 คือ 110 และ 19 คือ 15
การยอมให้เกิดขึ้นเฉพาะเมื่อแย่ง CPU กัน ถ้ามี CPU ว่างอยู่ งาน nice 19 ก็ทำงานได้ทันทีโดยไม่ต้องรอ เหมือนที่นั่งสำรองบนรถเมล์ ถ้าว่างใครก็นั่งได้ และจะลุกให้เฉพาะตอนที่รถแน่น
ตารางน้ำหนักนี้คืออาร์เรย์ [sched_prio_to_weight] ในซอร์สโค้ดเคอร์เนล Linux [kernel/sched/core.c] และกำหนดไว้ให้เวลา CPU ลดลงราว 10% ทุกครั้งที่ค่า nice เพิ่มขึ้น 1
2️⃣ วิธีใช้ nice เบื้องต้น: +10 เมื่อไม่ใส่ตัวเลข และค่าที่อยู่นอกช่วง
ถ้าใส่คำสั่งต่อท้าย nice คำสั่งนั้นจะทำงานด้วยค่า nice ที่เปลี่ยนแล้ว และถ้าพิมพ์ nice อย่างเดียวจะแสดงค่า nice ของเชลล์ปัจจุบัน
nice0ตัวอย่างด้านล่างคือคำสั่งที่ให้ bash ที่ถูกรันแสดงค่า nice ของตัวเองด้วย [ps -o ni=] ถ้ารันโดยไม่มี -n จะบวก 10 เข้ากับค่าปัจจุบัน และ -n 5 จะบวก 5
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5ค่าที่เกินช่วงจะถูกปรับเป็นค่าขอบโดยไม่มีข้อผิดพลาด -n 50 จึงทำงานด้วย 19
nice -n 50 bash -c 'ps -o ni= -p $$' 19การเลื่อนขึ้นก่อนด้วยค่าติดลบทำได้เฉพาะบัญชี root บัญชีผู้ใช้ทั่วไปจะเห็นคำเตือน [cannot set niceness] และคำสั่งยังทำงานด้วย nice 0 ตามเดิม
# บัญชีผู้ใช้ทั่วไป
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# บัญชี root
nice -n -5 bash -c 'ps -o ni= -p $$' -5โปรเซสลูกที่คำสั่งซึ่งรันด้วย nice เรียกต่อ ก็ทำงานด้วยค่า nice เดียวกัน
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7ดังนั้นถ้ารันสคริปต์หนึ่งตัวด้วย nice คำสั่งทั้งหมดในสคริปต์นั้นก็ยอมให้ตามไปด้วย
3️⃣ renice: เปลี่ยนค่า nice ของโปรเซสที่กำลังทำงาน
nice กำหนดค่าได้เฉพาะตอนเริ่มรัน โปรเซสที่ทำงานอยู่แล้วจึงเปลี่ยนด้วย renice ให้ตรวจ PID และค่าปัจจุบันจากคอลัมน์ NI ของ top หรือด้วย ps ก่อน
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10ดังที่เห็นในผลลัพธ์ renice -n ไม่ได้บวกเพิ่มจากค่าปัจจุบัน แต่ตั้งเป็นค่าที่ระบุ ผลจึงเป็น 10 ไม่ใช่ 15 ที่ได้จาก 5 บวก 10 ไม่ใช่การกดปุ่ม ▲ บนรีโมตแอร์ให้ขึ้นทีละขั้น แต่เหมือนการตั้งอุณหภูมิที่ต้องการไว้ที่ 24 องศา
เอกสารทางการของ util-linux ก็อธิบาย -n เป็นค่าสัมบูรณ์ ส่วนการบวกเพิ่มเป็นหน้าที่ของตัวเลือก [--relative] ในรุ่นใหม่ util-linux 2.37.4 ที่ทดสอบยังไม่มีตัวเลือกนี้
บัญชีผู้ใช้ทั่วไปเพิ่มค่าของโปรเซสตัวเองได้อย่างเดียว และเมื่อเพิ่มแล้วจะลดกลับไม่ได้
# บัญชีผู้ใช้ทั่วไป
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedบัญชี root ลดค่าได้ด้วย และในการทดสอบเดียวกันได้เปลี่ยน 10 เป็น 3 ได้ทันที
🔲 ซิมูเลเตอร์ nice · renice
ในซิมูเลเตอร์ด้านล่างที่เข้าด้วยบัญชีผู้ใช้ทั่วไป คุณพิมพ์ nice และ renice เองแล้วดูค่า nice ที่เปลี่ยนไปได้
4️⃣ วัดส่วนแบ่งเมื่อแย่ง CPU กัน: nice 0 vs 0·10·19
การเพิ่มค่า nice ไม่ได้ทำให้งานนั้นช้าลงเสมอไป ส่วนแบ่งจะลดลงเฉพาะเมื่อแย่ง CPU ตัวเดียวกับงานอื่น
ได้ผูกงานสองงานไว้กับ CPU คอร์เดียว (taskset) แล้วรันสคริปต์ด้านล่างที่นับเลขทีละหนึ่งเป็นเวลา 5 วินาทีพร้อมกัน ยิ่งนับได้มากแปลว่ายิ่งใช้เวลา CPU มาก
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nสคริปต์จะเพิ่ม n ทีละ 1 จนครบ 5 วินาที แล้วแสดงค่าสุดท้าย
nice 0 สองงานแบ่งกันคนละครึ่ง nice 10 ใช้ราว 10% และ nice 19 ใช้เพียง 1.4% ตรงกับสัดส่วนที่คำนวณจากน้ำหนักของเคอร์เนล (1024 : 110 คือ 90.3 : 9.7 และ 1024 : 15 คือ 98.6 : 1.4)
เมื่อรัน nice 19 เพียงงานเดียวบนคอร์เดียวกัน นับได้ราว 650,000–1,140,000 ครั้งใน 5 วินาที ถ้าไม่มีใครให้ต้องยอม nice 19 ก็ใช้ CPU เต็มที่ และระหว่างทดสอบโหลดของเซิร์ฟเวอร์ (load average) อยู่ที่ 3–5
5️⃣ ionice: การยอมให้ในฝั่งดิสก์และการตรวจตัวจัดลำดับงาน
nice กำหนดเฉพาะส่วนแบ่ง CPU งานที่อ่านเขียนดิสก์นานอย่างการแบ็กอัปจึงใช้ ionice ให้ยอมลำดับดิสก์ด้วย ถ้ารันด้วย -c3 (idle) งานจะได้ทำเฉพาะตอนที่ไม่มีโปรแกรมอื่นใช้ดิสก์
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0โปรเซสที่ไม่ได้กำหนดอะไรไว้จะแสดงเป็น [none] และตามเอกสารเคอร์เนลจะถูกจัดเป็นคลาส best-effort โดยคำนวณลำดับจากค่า nice ของ CPU
คลาสของ ionice มีผลเฉพาะเมื่อตัวจัดลำดับงานของดิสก์รองรับ และเอกสารเคอร์เนลระบุว่า bfq กับ mq-deadline เป็นตัวที่รองรับ ตัวที่อยู่ในวงเล็บเหลี่ยมคือตัวที่กำลังใช้อยู่
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqดิสก์ NVMe ของเซิร์ฟเวอร์ทดสอบเป็น [none] ตามเอกสารทางการ การกำหนด ionice จึงอาจไม่มีผล และไม่ได้วัดผลแยกไว้ ตรวจชื่อดิสก์ได้ด้วย lsblk
6️⃣ ใช้ nice ตรงไหน: แบ็กอัป·cron·wp-cli
ใส่ nice ให้งานที่ใช้เวลานานแต่ไม่เร่งด่วน การบีบอัดแบ็กอัปใช้ทั้ง CPU และดิสก์ จึงกำหนด nice กับ ionice ไปพร้อมกัน
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleถ้างานที่ทำงานอยู่แล้วทำให้เซิร์ฟเวอร์ช้า ให้ตรวจ PID ใน top แล้วเพิ่มค่าด้วย renice ส่วนงาน cron ที่รันทุกวันให้ใส่ nice ไว้หน้าคำสั่ง
0 3 * * * nice -n 10 /usr/local/bin/backup.shบนเซิร์ฟเวอร์ WordPress ถ้ารันงาน wp-cli ขนาดใหญ่อย่าง search-replace หรือการสร้างรูปภาพใหม่ด้วย nice -n 10 เมื่อ CPU ยุ่ง php-fpm ที่รับคำขอของผู้เยี่ยมชมจะได้ใช้ CPU ก่อน
nice -n 10 wp media regenerate --yesในทางกลับกัน อย่าเพิ่มค่า nice ให้ php-fpm หรือตัวเว็บเซิร์ฟเวอร์เอง ถ้าโปรเซสที่ตอบผู้เยี่ยมชมยอมให้ หน้าเว็บจะตอบช้าลงเมื่อ CPU ยุ่ง
🔢 FAQ & เนื้อหาแนะนำ









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