J'ai deux systèmes Linux dual-core installés à l'aide de groupes de contrôle Linux avec des noyaux relativement récents; l'un exécute Debian Squeeze, l'autre Ubuntu 11.04 Natty Narwhal. J'ai obtenu un équilibrage de la charge CPU avec des groupes de contrôle fonctionnant un peu mieux sur le système Debian malgré son noyau plus ancien. Mais ce n'est pas bon pour tout, et la bizarrerie spécifique que je demande ici se produit sur les deux systèmes.
Si vous lisez Gestion des ressources sous Linux avec des groupes de contrôle, cela donne un exemple montrant comment reproduire le problème. Voici la version d'Ubuntu (exécutez-la en tant que root):
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
Je m'attendais à ce que le processus "haut" se voit allouer plus de temps que le processus "bas"; ce qui se passe réellement avec ce cas de test ressemble toujours plus à ceci:
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
Où les temps sont presque égaux. Voici ma question: pourquoi cela se produit-il?
Dans la présentation, ce problème est résolu en épinglant chaque processus au même processeur; lignes supplémentaires pour tester que:
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
Le résultat est alors ce que je m'attendais à voir tout le temps: le processus "haut" obtenant un pourcentage beaucoup plus élevé du 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
Expliquer pourquoi cela fonctionne serait une étape utile pour comprendre pourquoi la précédente ne le fait pas aussi.