Eu escrevi um script Python que simplesmente gira alguns tópicos e queima os ciclos da CPU. A ideia é testar o taskset, pois é bem simples.
#!/usr/bin/env python
import threading
def cycle_burner():
while True:
meh = 84908230489 % 323422
for i in range(3):
thread = threading.Thread(target=cycle_burner)
print "Starting a thread"
thread.start()
Apenas executar o script Python consome cerca de 150% do uso da CPU.
[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Iniciar meu script Python com o taskset funciona conforme o esperado. A parte superior de observação mostra o processo do Python indexado em 100% de uso.
[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread
Curiosamente, iniciar o script Python e, em seguida, usar imediatamente o conjunto de tarefas para definir a afinidade do processo recém-iniciado limita o processo em 100%. Observe na saída que o planejador do Linux concluiu a execução dos comandos Bash antes de gerar os encadeamentos do Python. Então, o processo Python foi iniciado, então ele foi configurado para rodar na CPU 0, então gerou seus threads, que herdaram a afinidade apropriada.
[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 'pgrep python'
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread
Esse resultado contrasta com esse método, que é exatamente o mesmo, mas permite que os threads do Python gerem antes de definir a afinidade do processo Python. Isso replica os resultados do "conjunto de tarefas não faz nada" que descrevi acima.
[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 'pgrep python'
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0
What's going wrong here?
Aparentemente, os segmentos gerados antes da alteração da afinidade do processo pai não herdam a afinidade de seu pai. Se alguém pudesse editar em um link para a documentação que explica isso, isso seria útil.