ฉันมีระบบ Linux แบบดูอัลคอร์สองระบบติดตั้งโดยใช้ Linux cgroups ที่มีเคอร์เนลค่อนข้างเร็ว หนึ่งกำลังทำงาน Debian Squeeze, Ubuntu อื่น ๆ 11.04 Natty Narwhal ฉันได้รับภาระซีพียูกับ cgroups ทำงานได้ดีขึ้นเล็กน้อยในระบบ Debian แม้จะมีเคอร์เนลรุ่นเก่า แต่มันไม่เหมาะกับทุกสิ่งและความแปลกประหลาดที่ฉันถามเกี่ยวกับที่นี่เกิดขึ้นกับทั้งสองระบบ
หากคุณอ่านการจัดการทรัพยากรใน Linux ด้วยกลุ่มควบคุมจะมีตัวอย่างแสดงวิธีการทำให้เกิดปัญหาอีกครั้ง นี่คือเวอร์ชั่นอูบุนตู (เรียกใช้ด้วยรูท):
cd /sys/fs/cgroup/cpu
[On Debian Squeeze start at /mnt/cgroups/cpu instead]
mkdir low high
echo 512 > low/cpu.shares
echo 2048 > high/cpu.shares
yes low > /dev/null &
echo $! > low/tasks
yes high > /dev/null &
echo $! > high/tasks
ps -C yes -opid,%cpu,psr,args
[repeat that a few times]
killall -9 yes
ฉันคาดหวังว่ากระบวนการ "สูง" จะได้รับการจัดสรรเวลามากกว่ากระบวนการ "ต่ำ" สิ่งที่เกิดขึ้นจริงกับกรณีทดสอบนี้มักจะเป็นเช่นนี้มากขึ้น
root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
PID %CPU PSR COMMAND
3105 88.3 1 yes low
3106 94.5 0 yes high
ในกรณีที่เวลาเกือบเท่ากัน นี่คือคำถามของฉัน: ทำไมสิ่งที่เกิดขึ้น?
ในการนำเสนอปัญหานี้จะปรากฏขึ้นโดยไปปักหมุดแต่ละกระบวนการใน CPU เดียวกัน บรรทัดเพิ่มเติมเพื่อทดสอบว่า:
taskset -c 1 yes high > /dev/null &
echo $! > high/tasks
taskset -c 1 yes low > /dev/null &
echo $! > low/tasks
ps -C yes -opid,%cpu,psr,args
[later, rinse, repeat]
killall -9 yes
ผลลัพธ์ก็คือสิ่งที่ฉันคาดหวังว่าจะได้เห็นตลอดเวลา: กระบวนการ "สูง" ได้รับเปอร์เซ็นต์ของ CPU ที่สูงกว่ามาก:
root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
PID %CPU PSR COMMAND
3128 83.3 1 yes high
3129 20.7 1 yes low
การอธิบายว่าทำไมงานนี้จึงเป็นขั้นตอนที่มีประโยชน์ในการหาสาเหตุที่ทำไมงานก่อนหน้านี้ถึงไม่เกินไป