ใช้ Linux cgroups เพื่อปรับสมดุลประสิทธิภาพของ CPU


13

ฉันมีระบบ 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

การอธิบายว่าทำไมงานนี้จึงเป็นขั้นตอนที่มีประโยชน์ในการหาสาเหตุที่ทำไมงานก่อนหน้านี้ถึงไม่เกินไป


เกี่ยวข้อง: unix.stackexchange.com/q/247209/135943
Wildcard

คำตอบ:


10

ฉันได้รับคำอธิบายเบื้องต้นเกี่ยวกับกรณีทดสอบนี้จาก Stefan Seyfried ผู้เขียนบทความนี้ตัวอย่างมาจาก ปัญหาที่นี่คือส่วนของตัวกำหนดตารางเวลา CPU ของ cgroups มีจุดมุ่งหมายเพื่อให้ CPU ไม่ว่างอยู่เสมอ มันไม่ได้บังคับใช้ขีด จำกัด อย่างหนักหากทุกอย่างจะพอดีในครั้งเดียว

ในกรณีที่กระบวนการสอง (สูงและต่ำที่นี่) กำลังทำงานบน> = 2 แกนมันก็จะให้สูงในหนึ่งแกนและต่ำในอื่น ๆ ทั้งสองจะทำงานตลอดเวลาที่การใช้งานเกือบ 100% เนื่องจากพวกเขาสามารถทำได้โดยไม่ต้องกดปุ่มสถานการณ์ที่ตัวกำหนดเวลาไม่ให้เวลาเพียงพอกับ CPU cpu.share การกำหนดเวลาจะเกิดขึ้นก็ต่อเมื่อมีปัญหาการขาดแคลน

ในกรณีที่สองกระบวนการทั้งสองจะถูกตรึงที่ CPU เดียวกัน จากนั้นตรรกะการแบ่งปัน CPU จะต้องทำสิ่งที่มีประโยชน์กับตัวเลข cpu.shares ที่เกี่ยวข้องเพื่อทำให้พวกเขาสมดุลและมันก็เป็นไปตามที่หวังไว้

ข้อ จำกัด อย่างหนักในการใช้งาน CPU ไม่น่าจะปรากฏขึ้นจนกว่าหลังจากที่แพตช์ CFS Bandwidth Control ได้รับความนิยม ณ จุดนี้อาจเป็นไปได้ที่จะได้รับสิ่งที่มากกว่าที่ฉันหวังไว้


ดูเหมือนว่าจะทำงานได้ตามที่คาดไว้สำหรับฉัน แน่นอนว่าสิ่งนี้ถูกโพสต์เมื่อหลายปีก่อนดังนั้นสิ่งต่าง ๆ ที่ได้รับการปรับปรุงให้ดีขึ้นสำหรับคุณในเมล็ดล่าสุด?
Ken Sharp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.