Estamos executando um processo em tempo real em um kernel não em tempo real (CentOS 6), e isso provavelmente não vai mudar.
Temos um aplicativo de streaming de vídeo que requer cerca de 500 MB / s de tráfego PCIe de um FPGA personalizado continuamente por 1,5 horas por vez. O aplicativo funciona muito bem - na maioria das vezes. No entanto, tivemos situações em que parece que o kernel simplesmente para de atender a solicitações de PCIe ou de memória por até 500 milissegundos por vez. Isso parece acontecer durante E / S de arquivo intermitente de outro encadeamento. Achei impossível tentar replicar esse problema apenas executando muitas E / S de arquivos fictícios do espaço do usuário enquanto o aplicativo principal está em execução.
Existe uma maneira de forçar (simular) um "congelamento" global do kernel do Linux (em particular, parar o PCIe ou todos os acessos à memória DDR3 ou algo parecido) para que possamos reproduzir esse problema?
Temos buffer de até 10 milissegundos implementados agora na memória FPGA interna, mas isso não é suficiente. Podemos fazer buffer para o FPGA DDR3 e depois fazer o dump para o host, mas precisamos de um método para testar esse novo recurso sob pressão.
Não queremos que o kernel congele ou bloqueie permanentemente. Gostaríamos da capacidade de definir o intervalo de tempo.
Estou procurando algo parecido com escrever valores mágicos /proc/sys/vm
temporariamente que faça o sistema praticamente rastejar e depois voltar depois de algumas centenas de milissegundos, mas observar o número de maneiras possíveis de quebrá-lo não é para um novato como eu ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Talvez alguma numactl
mágica?
Respostas:
Uma opção para fazer um teste rápido pode ser usar um kernel habilitado para KGDB e parar o kernel manualmente e testar, consulte este link .
Em outra nota, lembro-me de coisas que poderiam causar suas pausas:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
o valor está em ns (4000 no meu processador AMD FX (tm) -8120 de oito núcleos) não deve ser um problema, mas verifiquecat /sys/module/pcie_aspm/parameters/policy
)/sys/bus/pci/devices/$DEVICE/power/control
fonte
kdb
vez dekgdb
fazer o mesmo? Eu também nunca usei. É como a sequência de comandos "Stop-A" nas estações de trabalho da Sun no passado? Se eu fizer um SysRq-g rápido e digitar "go", terei uma alta probabilidade de não interromper o sistema? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )Podemos ter mais detalhes sobre como seu aplicativo está se comunicando com o FPGA? É o aplicativo que lê o buffer do FPGA ou do FPGA que envia interrupção para o kernel (como placas de rede)?
Espero que abra um bloco / char em / dev e depois comunique-se com ele. Isso significa que ele usa um driver para fazer a comunicação entre o aplicativo e o arquivo / dev / XXX.
Eu gostaria de ter a saída de
cat /proc/interrupts
:;lsmod
;ls -al /dev/yourmod
Aqui estão as idéias:
Forneça todas as informações que você achar úteis.
fonte
Não tenho certeza se isso ajuda. Mas se você pode escrever um módulo do kernel que chama a
suspend
função do módulo do kernel de outro dispositivo, isso pode acontecer.Cada dispositivo PCI pode ser suspenso de acordo com o arquivo de cabeçalho http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479
Por exemplo, aqui está a função de suspensão da Intel e1000 NIC http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
Pelo que me lembro, essa função foi usada principalmente quando o sistema entra em hibernação, o driver de dispositivo precisa salvar o status atual de execução e desligar-se.
fonte
Eu acho que você está pensando na linha errada. Seu objetivo é claro.
O caminho não é interromper o restante dos processos, mas dar prioridade aos seus processos principais em tempo real. Use bom para seus processos importantes de espaço do usuário para isso.
O problema mais difícil é o tratamento de interrupções do PCIe, que reside no espaço do kernel.
Como o hardware está envolvido, você deve começar a olhar mais de perto a pista PCIe envolvida na sua placa principal e como isso está possivelmente conectado a um soquete da CPU específico.
O irqbalance normalmente faz um bom trabalho aqui, mas você pode configurar seu comportamento para atender às suas necessidades.
fonte