Pelo menos um problema definido e não resolvido com cpusets está documentado no rastreador de bugs do kernel aqui:
Bug 42789 - cpuset cgroup: when a CPU goes offline, it is removed from all cgroup's cpuset.cpus, but when it comes online, it is only restored to the root cpuset.cpus
Para citar um um comentário do ticket (estou adicionando os hiperlinks para o real commits e remover o endereço de e-mail da IBM no caso de spambots):
This was independently reported by Prashanth Nageshappa...and fixed in commit 8f2f748b0656257153bcf0941df8d6060acc5ca6, but subsequently reverted by Linus as commit 4293f20c19f44ca66e5ac836b411d25e14b9f185. According to his commit, the fix caused regressions elsewhere.
A correção de confirmação (que foi revertida posteriormente) descreve bem o problema:
Currently, during CPU hotplug, the cpuset callbacks modify the cpusets to reflect the state of the system, and this handling is asymmetric. That is, upon CPU offline, that CPU is removed from all cpusets. However when it comes back online, it is put back only to the root cpuset.
This gives rise to a significant problem during suspend/resume. During suspend, we offline all non-boot cpus and during resume we online them back. Which means, after a resume, all cpusets (except the root cpuset) will be restricted to just one single CPU (the boot cpu). But the whole point of suspend/resume is to restore the system to a state which is as close as possible to how it was before suspend.
O mesmo problema de hotplug assimétrico é descrito com mais detalhes sobre como ele se relaciona com a herança, em:
Bug 188101 - process scheduling in cpuset of cgroup is not working properly.
Citando esse ticket:
When cpuset of a container (docker/lxc both uses underlying cgroup) becomes empty (due to hotplug/hotunplug) then processes running in that container can be scheduled on any cpus in cpuset of its nearest non-empty ancestor.
But, when cpuset of a running container (docker/lxc) becomes non-empty from an empty state (adding cpu to the empty cpuset) by updating the cpuset of the running container (by using echo method), the processes running in that container still uses the same cpuset as that of its nearest non-empty ancestor.
Embora possa haver outros problemas com o cpuset, o acima é suficiente para entender e entender a afirmação de que o systemd não expõe nem utiliza o cpuset "devido à semântica da herança quebrada da lógica do kernel".
A partir desses dois relatórios de bugs, não apenas as CPUs não são adicionadas de volta a um cpuset após o currículo, mas mesmo quando são (manualmente) adicionadas, os processos nesse cgroup continuarão sendo executados em CPUs potencialmente desaprovadas pelo cpuset.
Encontrei uma mensagem do Lennart Poettering que confirma isso diretamente reason (negrito adicionado):
Em qua, 2016-08-03 às 16:56 +0200, Lennart Poettering escreveu:
On Wed, 03.08.16 14:46, Dr. Werner Fink (werner at suse.de) wrote:
problem with v228 (and I guess this is also later AFAICS from logs of current git) that repeating CPU hotplug events (offline/online). The root cause is that cpuset.cpus become not restored by machined. Please note that libvirt can not do this as it is not allowed to do so.
Esta é uma limitação da interface cpuset do kernel, e é uma das as razões pelas quais não expomos os cpusets de forma alguma em systemd right agora. Felizmente, há uma alternativa aos cpusets, que é a CPU controles de afinidade expostos via CPUAffinity = em systemd, que faz muito do mesmo, mas têm menos semântica borked.
Gostaríamos de apoiar os cpusets diretamente no systemd, mas não fazemos isso desde que as interfaces do kernel sejam tão borked quanto são. Para exemplo, cpusets são liberados inteiramente no momento em que o sistema passa por um ciclo de suspensão / retomada.