Optimización del rendimiento
En esta página, le mostraremos cómo configurar un producto CODESYS Control SL basado en Linux para su dispositivo y su aplicación para que pueda obtener el mejor rendimiento posible.
Le proporcionamos herramientas que puede utilizar para comprobar y evaluar el estado actual de su sistema.
Se recomienda el siguiente procedimiento. Siga estos pasos en el orden especificado. No tiene ningún sentido pasar al siguiente paso si el actual no está tan optimizado como debería estar.
Importante
Después de cada paso, compruebe que el último cambio no haya afectado negativamente a las optimizaciones de los pasos anteriores.
Una vez que haya logrado el rendimiento deseado bajo carga normal, opcionalmente puede realizar una prueba bajo carga alta con stress-ng o iperf.
Puede encontrar más información en los siguientes sitios web:
Comprobando el hardware
No utilice cachés compartidos para los núcleos del procesador de su controlador.
Si utiliza buses de campo basados en Ethernet para su dispositivo de destino, utilice un adaptador físico para ellos. No utilice
Configurando Linux
Utilice un kernel en tiempo real.
Importante
Para un funcionamiento en tiempo real en Linux, utilice el parche Realtime PREEMPT. El uso de un kernel de baja latencia no es suficiente porque no garantiza
Para obtener más información, consulte lo siguiente:
Muchos de los siguientes ajustes del sistema también se pueden configurar directamente mediante el PLCShell a través del sistema de ejecución o directamente a través del archivo de configuración del sistema de ejecución. Algunos ajustes del sistema no se mantendrán durante el reinicio del sistema. Al introducir los ajustes en el archivo de configuración, los ajustes se restaurarán automáticamente cuando se inicie el sistema de ejecución. Al ejecutar el comando PLCShell correspondiente, también se agregan las entradas correspondientes al archivo de configuración
Comando PLCShell
Entrada del archivo de configuración
Función
rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>Devuelve información sobre la configuración del sistema
ejemplo 3. Ejemplort-get scaling_governorMuestra los gobernadores de escalado disponibles y devuelve el regulador de escalado configurado para el núcleo
rt-set scaling_governor <cpu_index> <value>[CmpLinuxRTDiag] ScalingGovernor.CPU0=performance
Establece el regulador de escalado en la opción especificada para núcleos específicos o para todos los núcleos
ejemplo 4. Ejemploset scaling_governor all performancert-set hyperthreading <state>[CmpLinuxRTDiag] Hyperthreading=off
Activa o desactiva el Hyperthreading
rt-set throttling <state>[CmpLinuxRTDiag] Throttling=off
Activa o desactiva la aceleración
rt-set napi <device> <state>[CmpLinuxRTDiag] Napi=eno1
Activa o desactiva la NAPI con subprocesos para el adaptador de red
rt-clear-settingsElimina todo
rt-setajustes del archivo de configuraciónrt-marker-set <taskname> <threshold>[CmpLinuxRTDiag] TraceMarker.TaskName=MainTask TraceMarker.ThresholdUs=100 [SysTask] Linux.MeasureInterval=1
Permite escribir un marcador de rastreo del núcleo para la tarea especificada cuando la fluctuación supera el límite especificado.
Disponible solo si el tiempo de ejecución se ejecuta como usuario raíz
rt-marker-disableDeshabilita el marcador de rastreo del kernel
rt-marker-getEspecifica el nombre de la tarea configurada para el marcador de rastreo del kernel y el límite de fluctuación
irq-listEnumera todos los IRQ disponibles, sus prioridades y afinidad en el sistema
irq-set-prio <no | device> <priority>[CmpLinuxInterrupt] Interrupt.1.Priority=51 Interrupt.1.Device=eno1
Sets the priority of interrupts specified either by number <no> or device <device> to the desired value
irq-set-affinity <no | device> <bitmask>[CmpLinuxInterrupt] Interrupt.1.Affinity=128 Interrupt.1.Device=eno1
Sets the core affinity of the interrupt specified either by number <no> or device <device> to the desired bitmask
irq-clear-settingsElimina todo
irq setsparámetros del archivo de configuraciónPara las demandas en tiempo real, es necesario utilizar el kernel de preferencia RT (https://wiki.linuxfoundation.org/realtime/documentation/start) para su sistema Linux. En el caso de las distribuciones Debian y Ubuntu, encontrará un núcleo RT en forma de paquete que puede instalar fácilmente usando el
aptcomando. Para obtener más información sobre esto, consulte el manual de su distribución.En sistemas Debian
sudo apt-get install linux-image-rt-amd64Usa el
uname -acomando, por ejemplo, para comprobar qué núcleo está utilizando.
Evite usar un administrador de Windows, un servidor GUI/X o similar en su sistema.
El uso de estas herramientas podría afectar las capacidades en tiempo real de su sistema, lo que resulta en una alta fluctuación en la aplicación IEC).
Prueba
Uso de "herramientas rt":
Instalación de "rt-tools":
sudo apt install rt-testsIniciando "prueba cíclica":
sudo cyclictest -p 99 -t -mEl
man cyclictestEl comando le muestra más opciones de línea de comandos que puede usar para medir mejor aspectos de rendimiento más específicos de su sistema.
Si el valor determinado con cyclictest puede considerarse «bueno» en función del hardware. Si utilizas un procesador muy potente (por ejemplo, el Intel Core i7), deberías tener un número bajo de 1 dígito como máximo. Si utilizas un procesador ARM antiguo, 100 podría ser un buen resultado
Opciones de optimización
Importante
Después de cambiar cada ajuste o combinación de ajustes, debe ejecutar cyclictest programa para verificar la eficacia de los cambios.
Estas configuraciones no son persistentes y, por lo tanto, deben restablecerse después de arrancar o reiniciar el sistema.
Aviso
En la versión 4.21.0.0 y superior, CODESYS proporciona un comando PLC Shell que genera directamente la mayoría de estos valores. Para ello, ejecute el system-creatertreport comando. Para obtener más información sobre el comando, ejecute system-creatertreport ?.
Desactiva el modo de ahorro de energía de la CPU.
Deshabilite el hyperthreading.
Puede usar el siguiente comando para deshabilitar el hiperproceso (ejemplo):
echo off | sudo tee /sys/devices/system/cpu/smt/controlDesactive el escalado y la conmutación de frecuencia de la CPU en la medida de lo posible.
Por ejemplo, establezca la frecuencia mínima y máxima de la CPU en el mismo valor (fijo).
Deshabilite el mecanismo de limitación en tiempo real del kernel de Linux, ya que esto puede provocar fluctuaciones en su sistema.
Para obtener más información, consulte lo siguiente: The Linux Foundation: Programación: aceleración de RT
Puedes usar el siguiente comando para deshabilitar la limitación en tiempo real (ejemplo):
echo -1 > /proc/sys/kernel/sched_rt_runtime_usCompruebe y cambie el regulador de programación/escalado.
Compruebe el regulador de escalado y programación utilizado:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Cambie el regulador de escalado y programación usado (como
root/admin) paraPerformance:echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # set it for all available cores: echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
Tenga en cuenta que el regulador de escala debe restablecerse cada vez que se inicia el sistema. También puede configurarlo mediante la configuración del núcleo.
El
intel_pstateel controlador del núcleo puede dificultar la configuración correcta. Por lo tanto, debe usar elcpufreq-infocomando para comprobar su configuración.También puede utilizar programas como
cpu-freq-utils. Esto podría interferir con los controladores Intel pstate. Estos controladores normalmente requieren un enfoque diferente para configurar la frecuencia de la CPUPara obtener más información, consulte lo siguiente: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt
Desactivar
HyperVen la BIOS (si está disponible).
Configuración del CODESYS sistema de ejecución
Cree una aplicación de prueba que describa de forma aproximada la aplicación para la que desea optimizar el sistema (en términos de los recursos necesarios, el rendimiento requerido y el tamaño del proyecto).
Puede hacer esto de forma iterativa: primero cree una aproximación muy aproximada y luego amplíela para acercarse cada vez más a la aplicación real.
Prueba
Cuando la aplicación se esté ejecutando, verifique la configuración de la tarea. Abre el Configuración de tareas y seleccione el Monitor pestaña.

Mín. Jitter (μs) / Máx. Jitter (μs)
Los valores deben ser lo más cercanos posible a los valores determinados por el programa "cycletest". Los detalles se describen en la sección Configurando Linux.
Para obtener más información sobre la fluctuación y la latencia, consulte: Definiciones de fluctuación y latencia
Para obtener más información sobre la pestaña Monitoreo, consulte: Pestaña: Monitoreo
Tiempo de ciclo promedio (μs) / Máx. Tiempo de ciclo (μs) Tiempo de ciclo (μs)
El ciclo máximo nunca debe acercarse al tiempo del ciclo configurado. Esto genera problemas tan pronto como el sistema experimenta una carga elevada.
Mantenga siempre el tiempo del ciclo lo más corto posible.
Opciones de optimización
Importante
Después de cambiar cada ajuste o combinación de ajustes, debe ejecutar cyclictest programa para verificar la eficacia de los cambios.
Divida las tareas de larga duración en varias tareas más pequeñas.
Cuando se ejecuta, el tiempo de ciclo máximo de la tarea de mayor prioridad nunca debe alcanzar el tiempo de ciclo configurado. Si no puede evitar esto, entonces debe aumentar el tiempo de ciclo configurado para asegurarse de que los tiempos de ejecución sean consistentes.
Al iniciar sistemas de bus de campo (por ejemplo, EtherCAT o PROFINET), los ciclos de inicio pueden provocar una carga de CPU ligeramente mayor. En este caso, tiene sentido controlar la carga de la CPU poco después de iniciar la aplicación.
Las siguientes opciones no se pueden cambiar en CODESYS Virtual Control SL, pero debe configurarse en el host:
Establecer el valor para
DisableCpuDmaLatencya 1:[SysCpuHandling] Linux.DisableCpuDmaLatency=1
Tenga en cuenta que esta es la configuración predeterminada a partir de la versión de ejecución 4.11.0.0.
Para verificar su versión de tiempo de ejecución, haga clic en Extras → Actualizar Linux → Sistema → Información del sistema.
Compruebe que el kernel en tiempo real se esté utilizando realmente.
A partir de la versión 4.11.0.0, puede utilizar el comando de shell del PLC
rt-get kernelinfopara comprobar esto.Si tienes una versión anterior, puedes probarla directamente en la línea de comandos con el
uname -acomando.Si no se está utilizando el kernel en tiempo real, debe iniciar la optimización desde el principio.
Configuración de la aplicación IEC
Esta sección se refiere a su aplicación real.
Prueba
Puedes usar las pruebas del paso anterior Configuración del CODESYS sistema de ejecución para probar su aplicación IEC.
Opciones de optimización
Importante
Después de cambiar cada configuración o combinación de configuraciones, debe ejecutar el programa "prueba cíclica" para verificar la efectividad de los cambios.
Puedes usar el multinúcleo característica en CODESYS.
Determine las prioridades correctas para sus tareas. Las tareas importantes deberían tener mayor prioridad.
tabla 6. Mapeo de prioridades de tareas IEC y prioridades de subprocesos de Linux:Prioridad de tarea IEC
Prioridad de ejecución
Prioridad de Linux
--
0
88 (SCHED_FIFO)
--
31
57 (SCHED_FIFO)
0 (máxima prioridad en tiempo real)
32
56 (SCHED_FIFO)
15 (prioridad más baja en tiempo real)
47
41 (SCHED_FIFO)
16 (no es prioridad en tiempo real)
48
0 (SCHED_OTHER)
31 (no es prioridad en tiempo real)
63
0 (SCHED_OTHER)
--
64
0 (SCHED_OTHER)
--
255
(SCHED_INACTIVO)
Aviso
En un sistema Linux convencional, la mayoría de las interrupciones (IRQ) y los trabajadores del kernel tienen la prioridad 50 de Linux. Si se utilizan prioridades superiores (con una carga elevada), es posible que las funciones del sistema (red/almacenamiento) no
Puede configurar la prioridad de una tarea en la configuración de tarea respectiva.

Si no logra el rendimiento deseado después de todos los pasos mencionados aquí, puede consultar las siguientes secciones:
Información específica del bus de campo
Prueba
Comprobar el
Send Time/Recv Timevalores en la página de estado de EtherCAT.Una CPU x64 con un procesador Intel Core i7 y un buen adaptador debería tener menos de 10 µs.
Los procesadores ARM con chip integrado tendrán ~50 µs o más.

Comprobar el
Send Time/Recv Timevalores en la página de estado de PROFINET.Una CPU x64 con un procesador Intel Core i7 y un buen adaptador debería tener menos de 10 µs.
Los procesadores ARM con chip integrado tendrán ~50 µs o más.

Opciones de optimización
Para ordenar sus prioridades y las IRQ requeridas, puede usar los comandos del shell del PLC
irq-listyirq-set-prio.Estos comandos utilizan las prioridades normales de Linux y no las prioridades IEC.
Esta optimización no es posible en CODESYS Virtual Control SL, sino más bien en el sistema anfitrión.
Utilice un adaptador de red independiente para los dispositivos.
Para más información, ver:
[Para expertos] – Herramientas y temas adicionales
Las herramientas y opciones que se describen en esta sección están destinadas a usuarios avanzados. Dado que las medidas que deben tomarse dependen en gran medida del sistema específico, es necesaria una investigación independiente. Por lo tanto, no podemos ofrecerle ninguna solución específica.
KernelShark/rastreo del kernel
Si descubre que la causa de sus problemas de rendimiento tiene algo que ver con la programación, este es el programa que debe elegir. Con la ayuda del «kernel trace», puedes comprobar si tu tarea está siendo interrumpida por otra tarea, otro servicio o una interrupción.
trace-cmd record -p functionPuede utilizar KernelShark para examinar el generado
trace.datarchivo.
En general, los problemas de programación se pueden dividir en dos categorías:
Reemplazo / preferencia
Si la interrupción o la tarea que impide la ejecución es innecesaria, desactívela.
Aumenta la prioridad de tu tarea o reduce la prioridad de las demás.
Cambie a un núcleo de CPU diferente.
Importante
Compruebe la eficacia de los cambios mediante los programas descritos en el capítulo anterior.
Tiempo de ejecución
Consulte a continuación Rastreo de funciones del kernel
Rastreo de funciones del kernel
Si el tiempo de procesamiento del código es demasiado alto, puede usar esta herramienta para encontrar el problema.
Si la función con un tiempo de ejecución demasiado alto está en su propio código, entonces debe optimizarla.
Si la función con un tiempo de ejecución demasiado alto está en el núcleo, puede intentar conseguir la funcionalidad deseada con otra función del núcleo. Como alternativa, también puede pasar los parámetros de configuración al controlador del núcleo para reducir el tiempo de ejecución.
Si ninguna de estas opciones resuelve el problema, es probable que necesite usar un hardware más potente.
Utilice los siguientes puntos para comprobar si junto con ellos figura el instrumento adecuado para alcanzar sus objetivos de rendimiento:
PREEMPT_FULL
isolcpu
rcu_nocbs
rcu_nocb_poll
nosoftlockup
deshabilitar equilibrio irq
kernel.sched_rt_runtime_us