CPU performansını dengelemek için Linux gruplarını kullanma


13

Göreceli olarak yeni çekirdeklere sahip Linux grupları kullanılarak kurulmuş iki adet çift çekirdekli Linux sistemim var; biri Debian Squeeze, diğeri Ubuntu 11.04 Natty Narwhal kullanıyor. Eski çekirdeğine rağmen Debian sisteminde biraz daha iyi çalışan cgroups ile CPU yük dengelemesini aldım. Ama her şey için doğru değil ve burada sorduğum tuhaflık her iki sistemde de oluyor.

Linux'ta Denetim Grupları ile Kaynak Yönetimi'ni okursanız , sorunun nasıl yeniden oluşturulacağını gösteren bir örnek verir. İşte Ubuntu sürümü (bunu root olarak çalıştırın):

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

"Yüksek" sürecin "düşük" olandan daha fazla zaman ayırmasını bekliyordum; Bu test senaryosunda gerçekte olan her zaman daha çok şöyle:

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

Zaman neredeyse eşit. İşte sorum: Bu neden oluyor?

Sunumda, bu işlem her bir işlemin aynı CPU'ya sabitlenmesiyle giderilmektedir; bunu test etmek için ek satırlar:

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

O zaman sonuç her zaman görmeyi beklediğim şeydi: CPU'nun çok daha yüksek bir yüzdesini elde eden "yüksek" süreç:

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

Bunun neden işe yaradığını açıklamak, öncekinin de neden olmadığını anlamak için yararlı bir adım olacaktır.


Yanıtlar:


10

Bu örneğin alındığı makaleyi yazan Stefan Seyfried'in bu test vakası hakkında ilk bir açıklama aldım. Burada sorun, cgroups CPU zamanlayıcı bölümleri her zaman kullanılabilir herhangi bir CPU meşgul tutmayı amaçlamaktadır; eğer her şey aynı anda sığarsa hiçbir zaman zor bir limit uygulamaz.

İki işlemin (burada yüksek ve düşük)> = 2 çekirdek üzerinde çalışması durumunda, bir çekirdek üzerinde yüksek, diğerinde düşük kalır. Daha sonra her ikisi de% 100'e yakın kullanımda her zaman çalışır, çünkü programlayıcının CPU'da yeterli zaman vermediği duruma çarpmadan yapabilirler. cpu.share zamanlaması yalnızca bir eksiklik olduğunda gerçekleşir.

İkinci durumda, her iki işlem de aynı CPU'ya sabitlenir. Daha sonra CPU paylaşım mantığı, göreli cpu.shared numaraları ile dengelemek için yararlı bir şey yapmak zorundadır ve bunu umulduğu gibi yapar.

CPU kullanımındaki sabit sınırların CFS Bant Genişliği Kontrolü yaması bitene kadar görünmesi olası değildir . Bu noktada umduğum gibi bir şey elde etmek mümkün olabilir.


Benim için beklendiği gibi çalışıyor. Tabii ki bu birkaç yıl önce yayınlanmıştır, bu yüzden son çekirdeklerde sizin için bir şeyler gelişti mi?
Ken Sharp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.