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.