Ich habe zwei Dual-Core-Linux-Systeme installiert, die Linux-Cgroups mit relativ neuen Kerneln verwenden. Auf dem einen läuft Debian Squeeze, auf dem anderen Ubuntu 11.04 Natty Narwhal. Ich habe einen CPU-Lastausgleich erhalten, bei dem cgroups auf dem Debian-System trotz des älteren Kernels etwas besser funktionieren. Aber es ist nicht für alles richtig, und die besondere Kuriosität, nach der ich hier frage, tritt auf beiden Systemen auf.
Wenn Sie Resource Management unter Linux mit Kontrollgruppen lesen, wird anhand eines Beispiels gezeigt, wie das Problem reproduziert werden kann. Hier ist die Ubuntu-Version (als root ausführen):
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
Ich hatte damit gerechnet, dass dem "hohen" Prozess mehr Zeit eingeräumt wird als dem "niedrigen". Was mit diesem Testfall tatsächlich passiert, sieht immer so aus:
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
Wo die Zeiten fast gleich sind. Hier ist meine Frage: Warum passiert das?
In der Präsentation wird gezeigt, wie dieses Problem behoben wird, indem jeder Prozess an dieselbe CPU angeheftet wird. zusätzliche Zeilen, um das zu testen:
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
Das Ergebnis ist dann das, was ich erwartet hatte: der "hohe" Prozess bekommt einen viel höheren Prozentsatz der 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
Erklären, warum dies funktioniert, ist ein nützlicher Schritt, um herauszufinden, warum das frühere nicht auch funktioniert.