Você pode usar taskset para distribuir manualmente os processos pelos núcleos, definindo suas afinidades de encadeamento. Para descobrir quais segmentos pertencem a quais núcleos e processadores, verifique /proc/cpuinfo como mostrado abaixo:
$ grep -E '^processor|^physical id|^core id' /proc/cpuinfo |sed 's/^processor/\nprocessor/'
processor : 0
physical id : 0
core id : 0
processor : 1
physical id : 0
core id : 1
processor : 2
physical id : 0
core id : 0
processor : 3
physical id : 0
core id : 1
$ _
processor é o número do encadeamento, physical id é o número da CPU física e core id é o número do núcleo. A saída acima vem de uma máquina com uma única CPU com dois núcleos e quatro threads.
taskset pode ser usado como taskset --all-tasks -p <hex_mask> <pid> para modificar a afinidade de todos os encadeamentos de um processo existente. O hex_mask é uma máscara de bits, em que cada 1 bit representa um encadeamento da CPU atribuído e a numeração começa a partir da direita. Por exemplo, 0xa para a máscara significa binário 0b1010 que indica uma afinidade do encadeamento # 1 e encadeamento # 3 para o processo. O PID, espero, é autoexplicativo.