Obrigado por ler esta pergunta (procurei em todos os lugares para encontrar uma resposta existente sem sucesso ...) A questão está no título, mas aqui estão mais detalhes:
Aqui está minha configuração:
Tentamos executar um software de aquisição de nossa empresa que captura dados da placa de aquisição e os grava nos SSDs.
Por isso, tento ter duas CPUs, mas lanço o software apenas na CPU nº 1 e para direcionar todas as interrupções diretamente para a CPU nº 1 .
Para fazer isso, eu escrevi o arquivo /proc/irq/defaut_smp_affinty
to 0000,00000004
.
Isso funciona para a placa de aquisição, eu posso ver que todas as interrupções são diretamente encaminhadas para o núcleo # 2 (na CPU # 1)
No entanto, vejo que as interrupções do meu NVMe ainda são despachadas em todos os núcleos e também nos núcleos da CPU # 2 (núcleos 24..47).
Eu tentei fazer:
cat /proc/interrupts | grep -i nvme
para ver o número de interrupções pertencente ao SSD NVMe e, em seguida, modificar manualmente o arquivo (irq [157 a 186])
sudo -i echo 0000,00000004 > /proc/irq/186/smp_affinity
permission denied
Eu também tentei:
sudo sh -c "echo 0000,00000004 > /proc/irq/186/smp_affinity"
sh: echo I/O error
sudo sh -c "echo 1,3 > /proc/irq/186/smp_affinity_list"
sh: echo I/O error
Não consigo modificar esses arquivos.
Eu também tentei relançar o serviço irqbalance
dessa maneira:
export IRQBALANCE_BANNED_CPUS=ffff,fffffff0
sudo service irqbalance stop
sudo irqbalance --debug
Eu também tentei numactl
para iniciar o programa na CPU # 1 CORE # 2
Mas nada funcionou até agora, vejo que algumas interrupções NVMe ainda são recebidas pela CPU # 2. Você tem alguma idéia, como eu consegui despachar as interrupções das NVMes apenas para a CPU nº 1 e excluir totalmente a CPU nº 2 do meu software?
Muito obrigado pela resposta, espero ter sido explícito o suficiente para você me ajudar :) caso contrário, é só pedir mais detalhes.
EDIT_1: Consegui que meu software funcionasse desabilitando todos os núcleos da CPU # 2 usando o comando:
for i in {24..47} do; sudo sh -c "echo 0 > /sys/devices/cpu/cpu$i/online"
O problema é que, ao fazer isso, eu apenas desativo todos os NÚCLEOS da CPU # 2, e apenas reduzo meu poder de computação em dois. Mas isso me dá mais pistas de que executar o software em uma CPU só funciona.