Como configurar o Intel SSD NVME irq Affinity no Ubuntu 16.04 LTS?

1

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:

  • Estou trabalhando com um servidor S2600WT da Intel com duas CPUs (Xeon v4 com 24 núcleos por CPU) em execução no Ubuntu 16.04 LTS.
  • Os núcleos [00..23] pertencem à CPU nº 1
  • Núcleos [24..47] pertencem à CPU nº 2
  • Eu tenho 2 SSDs Intel: DC3700 conectado ao PCIe da CPU # 1 (PCIe x4-gen3 cada através de NVME)
  • Eu tenho um quadro de aquisição (Innovative X6-1000M) no outro slot PCIe da CPU # 1 (PCIe x8-gen2)

Tentamos executar um software de aquisição de nossa empresa que captura dados da placa de aquisição e os grava nos SSDs.

  1. Quando tenho apenas uma CPU, o programa está funcionando como esperado e podemos capturar em até 2,4 GB / s
  2. Quando eu tenho duas CPUs, temos um deadlock de software e o programa congela. Quando uso o depurador, vejo que o programa está congelado quando ele tenta gravar 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.

    
por Jeremie Cohen 03.11.2017 / 16:03

0 respostas