Estamos ejecutando un proceso en tiempo real en un kernel no en tiempo real (CentOS 6), y esto probablemente no va a cambiar.
Tenemos una aplicación de transmisión de video que requiere aproximadamente 500 MB / s de tráfico PCIe desde un FPGA personalizado de forma continua durante 1,5 horas a la vez. La aplicación funciona bastante bien, la mayoría de las veces. Sin embargo, hemos tenido situaciones en las que parece que el núcleo simplemente deja de responder al servicio de solicitudes PCIe o de memoria de hasta 500 milisegundos a la vez. Esto parece suceder durante el archivo de ráfaga IO desde otro hilo. Me resulta imposible intentar replicar este problema simplemente haciendo un montón de IO de archivos ficticios desde el espacio del usuario mientras se ejecuta la aplicación principal.
¿Hay una manera de forzar (simular) una "congelación" global del núcleo de Linux (en particular, PCIe parar o todos los accesos de memoria DDR3 o algo así) para que podamos reproducir este problema?
Hemos implementado hasta 10 milisegundos de almacenamiento intermedio en la memoria FPGA interna, pero eso no es suficiente. Podemos almacenar en búfer a FPGA DDR3 y luego volcar al host, pero necesitamos un método para probar esta nueva característica bajo coacción.
No queremos que el núcleo se congele o bloquee permanentemente. Nos gustaría poder establecer el intervalo de tiempo.
Estoy buscando algo similar a escribir valores mágicos /proc/sys/vm
temporalmente que haga que el sistema prácticamente se arrastre, y luego retroceder después de unos cientos de milisegundos, pero mirar la cantidad de formas posibles de romperlo no es para un novato como yo ( https://www.kernel.org/doc/Documentation/sysctl/vm.txt ). Tal vez algunos numactl
magia?
Respuestas:
Una opción para hacer una prueba rápida podría ser usar un kernel habilitado para KGDB y detener el kernel manualmente y probar, vea este enlace .
Por otro lado, las cosas que recuerdo que podrían causar que sus pausas:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency
el valor está en ns (4000 en mi procesador AMD FX (tm) -8120 de ocho núcleos) no debería ser un problema, pero verifiquecat /sys/module/pcie_aspm/parameters/policy
)/sys/bus/pci/devices/$DEVICE/power/control
fuente
kdb
lugar dekgdb
hacer lo mismo? Nunca he usado tampoco. ¿Es esto como la secuencia de comando "Stop-A" en estaciones de trabajo Sun de antaño? Si acabo de hacer una rápida Pet Sis-g, a continuación, escriba "go", voy a tener una alta probabilidad de no romper el sistema? (ref: kernel.org/pub/linux/kernel/people/jwessel/kdb/… )¿Podemos tener más detalles sobre cómo se comunica su aplicación con la FPGA? ¿Es la aplicación que lee el búfer del FPGA, o el FPGA que envía la interrupción al núcleo (como las tarjetas de red)?
Espero que abra un bloque / char in / dev y luego se comunique con él. Esto significa que utiliza un controlador para hacer la comunicación entre la aplicación y el archivo / dev / XXX.
Me gustaría tener la salida de
cat /proc/interrupts
:;lsmod
;ls -al /dev/yourmod
Aquí están las ideas:
Proporcione toda la información que pueda serle útil.
fuente
No estoy seguro si ayuda. Pero si puede escribir un módulo de kernel que llame a la
suspend
función del módulo de kernel de otro dispositivo, eso podría funcionar.Cada dispositivo PCI se puede suspender de acuerdo con el archivo de encabezado http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/pci.h#L479
Por ejemplo, de aquí Intel E1000 de NIC función suspenden http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/net/e1000e/netdev.c#L4643
Por lo que puedo recordar, esta función se usó principalmente cuando el sistema entra en hibernación, el controlador del dispositivo debe guardar el estado de ejecución actual y apagarse.
fuente
Creo que usted está pensando a lo largo de las líneas equivocadas. Su objetivo es claro.
El camino no es detener el resto de los procesos, sino darle a sus procesos principales una prioridad de planificación en tiempo real. Utilice agradable para sus importantes del espacio de usuario-procesos para eso.
El problema más difícil es el PCIe manejo de interrupciones, que reside en espacio de núcleo.
Dado que el hardware está implicado, debe empezar a tomar un vistazo más de cerca el carril PCIe involucrados en la placa base y la forma en que está posiblemente conectada a una toma específica de la CPU.
Irqbalance normalmente hace un buen trabajo aquí, pero puede configurar su comportamiento para satisfacer sus necesidades.
fuente