Calls to sched_setaffinity are filtered to just those CPUs allowed in that task's cpuset.
Isso implica que as máscaras de afinidade de CPU são interceptadas com os cpus no cgroup do qual o processo é membro.
Por exemplo Se a máscara de afinidade de um processo incluir núcleos {0, 1, 3} e o processo estiver sendo executado no cgroup do sistema, que é restrito aos núcleos {1, 2}, o processo será forçado a ser executado no núcleo 1.
Tenho 99% de certeza de que a saída htop
está "errada" para o fato de os processos não terem despertado desde que os cgroups foram criados, e a exibição está mostrando o núcleo last o processo foi executado.
Se eu começar o vim antes de fazer meu escudo, vim forks duas vezes (por alguma razão), e o filho mais profundo estiver rodando no core 2. Se eu fizer o escudo, então durma vim (ctrl + z) e acorde, ambos os processos mudaram para o núcleo 0. Acho que isso confirma a hipótese de que htop
está mostrando informações antigas.
Você também pode inspecionar /proc/<pid>/status
e ver os campos cpus_allowed_*
.
Por exemplo Eu tenho um console-kit-daemon
process (pid 857) aqui mostrando no htop como rodando no core 3, mas em /proc/857/status
:
Cpus_allowed: 1
Cpus_allowed_list: 0
Acho que isso está dizendo que a máscara de afinidade é 0x1, que permite a execução apenas no core 1 devido aos cgroups: ie intersect ({0,1,2,3}, {0}) = {0}. / p>
Se eu puder, deixarei a questão aberta por um tempo para ver se surge alguma resposta melhor.
Obrigado ao @davmac por ajudar com isso (no irc).