Optimisation des performances
Sur cette page, nous allons vous montrer comment configurer un produit CODESYS Control SL basé sur Linux pour votre appareil et votre application afin d'obtenir les meilleures performances possibles.
Nous mettons à votre disposition des outils que vous pouvez utiliser pour vérifier et évaluer l'état actuel de votre système.
Nous recommandons la procédure suivante. Effectuez ces étapes dans l'ordre indiqué. Cela n'a aucun sens de passer à l'étape suivante si l'étape actuelle n'est pas aussi optimisée qu'elle devrait l'être.
Important
Après chaque étape, vérifiez que la dernière modification n'a pas affecté négativement les optimisations des étapes précédentes.
Après avoir atteint les performances souhaitées sous charge normale, vous pouvez éventuellement effectuer un test sous charge élevée avec stress-ng ou iperf.
Vous pouvez trouver plus d’informations sur les sites Web suivants :
Vérification du matériel
N'utilisez pas de caches partagés pour les cœurs de processeur de votre contrôleur.
Si vous utilisez des bus de terrain basés sur Ethernet pour votre équipement cible, utilisez un adaptateur physique pour celui-ci. N'utilisez pas d'architecture de commutateur.
Configuration de Linux
Utilisez un noyau temps réel.
Important
Pour un fonctionnement en temps réel sous Linux, utilisez le correctif Realtime PREEMPT. L'utilisation d'un noyau à faible latence n'est pas suffisante car elle ne garantit pas de propriétés déterministes
Pour plus d'informations, consultez les rubriques suivantes :
La plupart des paramètres système suivants peuvent également être configurés directement à l'aide du PLCshell via le système d'exécution ou directement via le fichier de configuration du système d'exécution. Certains paramètres système ne seront pas conservés lors du redémarrage du système. En saisissant les paramètres dans le fichier de configuration, ceux-ci seront automatiquement restaurés au démarrage du système d'exécution. L'exécution de la commande PLCShell correspondante ajoute également les entrées respectives au fichier de configuration
Commande PLCShell
Entrée du fichier de configuration
Fonction
rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>Renvoie des informations sur les paramètres du système
Exemple 3. Exemplert-get scaling_governorAffiche les régulateurs de mise à l'échelle disponibles et renvoie le régulateur de mise à l'échelle configuré pour le cœur
rt-set scaling_governor <cpu_index> <value>[CmpLinuxRTDiag] ScalingGovernor.CPU0=performance
Définit le régulateur de mise à l'échelle sur l'option spécifiée pour des cœurs spécifiques ou pour tous les cœurs
Exemple 4. Exempleset scaling_governor all performancert-set hyperthreading <state>[CmpLinuxRTDiag] Hyperthreading=off
Activer/désactiver l'hyperthreading
rt-set throttling <state>[CmpLinuxRTDiag] Throttling=off
Active/désactive la régulation
rt-set napi <device> <state>[CmpLinuxRTDiag] Napi=eno1
Active ou désactive le NAPI fileté pour l'adaptateur réseau
rt-clear-settingsSupprime tout
rt-setparamètres à partir du fichier de configurationrt-marker-set <taskname> <threshold>[CmpLinuxRTDiag] TraceMarker.TaskName=MainTask TraceMarker.ThresholdUs=100 [SysTask] Linux.MeasureInterval=1
Active l'écriture d'un marqueur de trace du noyau pour la tâche spécifiée lorsque la gigue dépasse la limite spécifiée.
Disponible uniquement si le moteur d'exécution est exécuté en tant qu'utilisateur root
rt-marker-disableDésactive le marqueur de trace du noyau
rt-marker-getSpécifie le nom de la tâche configurée pour le marqueur de trace du noyau et la limite de gigue
irq-listRépertorie toutes les IRQ disponibles, leurs priorités et leur affinité sur le système
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-settingsSupprime tout
irq setsparamètres à partir du fichier de configurationPour les demandes en temps réel, il est nécessaire d'utiliser le noyau préempt RT (https://wiki.linuxfoundation.org/realtime/documentation/start) pour votre système Linux. Dans le cas des distributions Debian et Ubuntu, vous trouverez un noyau RT sous forme de paquet que vous pouvez facilement installer à l'aide du
aptcommande. Pour plus de détails à ce sujet, consultez le manuel de votre distribution.Sur les systèmes Debian
sudo apt-get install linux-image-rt-amd64Utilisez le
uname -acommande, par exemple, pour vérifier quel noyau vous utilisez.
Évitez d'utiliser un gestionnaire Windows, un serveur GUI/X ou similaire sur votre système.
L'utilisation de ces outils pourrait affecter les capacités en temps réel de votre système, ce qui entraînerait une gigue élevée dans l'application CEI).
Test
Utilisation des "rt-tools" :
Installation de "rt-tools":
sudo apt install rt-testsDémarrage de "cyclictest" :
sudo cyclictest -p 99 -t -mLe
man cyclictestLa commande vous montre davantage d'options de ligne de commande que vous pouvez utiliser pour mieux mesurer des aspects de performances plus spécifiques ou plus spécifiques de votre système.
Que la valeur soit déterminée ou non avec cyclictest peut être considéré comme « bon » en fonction de votre matériel. Si vous utilisez un processeur très puissant (par exemple, un processeur Intel Core i7), vous devez avoir un chiffre faible au maximum. Si vous utilisez un ancien processeur ARM, 100 peut être un bon résultat.
Options d'optimisation
Important
Après avoir modifié chaque réglage ou combinaison de paramètres, vous devez exécuter le cyclictest programme pour vérifier l'efficacité des modifications.
Ces paramètres ne sont pas persistants et doivent donc être réinitialisés après le démarrage ou le redémarrage du système.
Avis
Dans les versions 4.21.0.0 et supérieures, CODESYS fournit une commande PLC Shell qui génère directement la plupart de ces valeurs. Pour ce faire, exécutez system-creatertreport commande. Pour plus de détails sur la commande, exécutez system-creatertreport ?.
Désactivez le mode économie d'énergie du processeur.
Désactivez l'hyperthreading.
Vous pouvez utiliser la commande suivante pour désactiver l'hyperthreading (exemple) :
echo off | sudo tee /sys/devices/system/cpu/smt/controlDésactivez autant que possible la mise à l'échelle et la commutation de la fréquence du processeur.
Par exemple, définissez la fréquence minimale et maximale du processeur sur la même valeur (fixe).
Désactivez le mécanisme d'étranglement en temps réel du noyau Linux, car cela peut provoquer de la gigue sur votre système.
Pour plus d'informations, consultez les rubriques suivantes : La Linux Foundation : Planification — RT throttling
Vous pouvez utiliser la commande suivante pour désactiver la limitation en temps réel (exemple) :
echo -1 > /proc/sys/kernel/sched_rt_runtime_usVérifiez et modifiez le régulateur de planification/de mise à l'échelle.
Vérifiez le régulateur de planification/de dimensionnement utilisé :
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Modifiez le régulateur de planification/de mise à l'échelle utilisé (comme
root/admin) pourPerformance: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
Notez que le régulateur de mise à l'échelle doit être réinitialisé à chaque démarrage du système. Vous pouvez également le définir à l'aide de la configuration du noyau.
Le
intel_pstatele pilote du noyau peut rendre le réglage correct plus difficile. Par conséquent, vous devez utiliser lecpufreq-infocommande pour vérifier votre configuration.Vous pouvez également utiliser des programmes tels que
cpu-freq-utils. Cela pourrait interférer avec les pilotes Intel pstate. Ces pilotes nécessitent normalement une approche différente pour régler la fréquence du processeur.Pour plus d'informations, consultez les rubriques suivantes : https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt
Désactiver
HyperVdans le BIOS (si disponible).
Configuration du CODESYS système d'exécution
Créez une application de test qui décrit en gros l'application pour laquelle vous souhaitez optimiser votre système (en termes de ressources requises, de performances requises et de taille du projet).
Vous pouvez le faire de manière itérative : créez d’abord une approximation très grossière, puis développez-la pour vous rapprocher de plus en plus de l’application réelle.
Test
Lorsque l'application est en cours d'exécution, vérifiez la configuration de la tâche. Ouvrez le Configuration des tâches et sélectionnez le Moniteur languette.

Min. Gigue (µs) / Max. Gigue (µs)
Les valeurs doivent être aussi proches que possible des valeurs déterminées par le programme "cycletest". Les détails sont décrits dans la section Configuration de Linux.
Pour plus d’informations sur la gigue et la latence, consultez : Définitions de la gigue et de la latence
Pour plus d'informations sur l'onglet Surveillance, voir : Onglet : Surveillance
Temps de cycle moyen (µs) / Max. Temps de cycle (µs) Temps de cycle (µs)
Le cycle maximum ne doit jamais s'approcher du temps de cycle configuré. Cela entraîne des problèmes dès que le système subit une charge élevée.
Gardez toujours le temps de cycle aussi court que possible.
Options d'optimisation
Important
Après avoir modifié chaque réglage ou combinaison de paramètres, vous devez exécuter le cyclictest programme pour vérifier l'efficacité des modifications.
Divisez les tâches de longue durée en plusieurs tâches plus petites.
Lors de l'exécution, le temps de cycle maximum de la tâche la plus prioritaire ne doit jamais atteindre le temps de cycle configuré. Si vous ne pouvez pas éviter cela, vous devez augmenter le temps de cycle configuré pour garantir des temps d'exécution cohérents.
Lors du démarrage de systèmes de bus de terrain (par exemple EtherCAT ou PROFINET), les cycles de démarrage peuvent entraîner une charge CPU légèrement plus élevée. Dans ce cas, il est judicieux de surveiller la charge du processeur peu de temps après le démarrage de l'application.
Les options suivantes ne peuvent pas être modifiées dans CODESYS Virtual Control SL, mais doit être configuré sur l'hôte :
Définissez la valeur pour
DisableCpuDmaLatencyà 1 :[SysCpuHandling] Linux.DisableCpuDmaLatency=1
Notez qu'il s'agit du paramètre par défaut à partir de la version d'exécution 4.11.0.0.
Pour vérifier votre version d'exécution, cliquez sur Suppléments → Mettre à jour Linux → Système → Information système.
Vérifiez que le noyau en temps réel est réellement utilisé.
Depuis la version 4.11.0.0, vous pouvez utiliser la commande shell PLC
rt-get kernelinfopour vérifier cela.Si vous possédez une version plus ancienne, vous pouvez la tester directement sur la ligne de commande à l'aide du
uname -acommande.Si le noyau en temps réel n'est pas utilisé, vous devez démarrer l'optimisation depuis le début.
Configuration de l'application IEC
Cette section fait référence à votre candidature actuelle.
Test
Vous pouvez utiliser les tests de l'étape précédente Configuration du CODESYS système d'exécution pour tester votre application IEC.
Options d'optimisation
Important
Après avoir modifié chaque paramètre ou combinaison de paramètres, vous devez exécuter le programme « cyclictest » pour vérifier l'efficacité des modifications.
Vous pouvez utiliser le Multicœur fonctionnalité dans CODESYS.
Déterminez les bonnes priorités pour vos tâches. Les tâches importantes devraient avoir une priorité plus élevée.
Tableau 6. Cartographie des priorités des tâches IEC et des priorités des threads Linux :Priorité des tâches CEI
Priorité d'exécution
Priorité Linux
--
0
88 (SCHED_FIFO)
--
31
57 (SCHED_FIFO)
0 (priorité en temps réel la plus élevée)
32
56 (SCHED_FIFO)
15 (priorité en temps réel la plus faible)
47
41 (SCHED_FIFO)
16 (pas de priorité en temps réel)
48
0 (SCHED_OTHER)
31 (pas de priorité en temps réel)
63
0 (SCHED_OTHER)
--
64
0 (SCHED_OTHER)
--
255
(SCHED_IDLE)
Avis
Sur un système Linux classique, la plupart des interruptions (IRQ) et des opérateurs du noyau ont la priorité Linux 50. L'utilisation des priorités (en cas de charge élevée) ci-dessus peut empêcher les fonctions du système (réseau/stockage) de fonctionner comme prévu
Vous pouvez configurer la priorité d'une tâche dans la configuration de la tâche correspondante.

Si vous n'obtenez pas les performances souhaitées après toutes les étapes mentionnées ici, vous pouvez consulter les sections suivantes :
Informations spécifiques au bus de terrain
Test
Vérifier la
Send Time/Recv Timevaleurs sur la page d’état EtherCAT.Un processeur x64 avec un processeur Intel Core i7 et un bon adaptateur devrait avoir moins de 10 µs.
Les processeurs ARM avec puce intégrée auront environ 50 µs ou plus.

Vérifier la
Send Time/Recv Timevaleurs sur la page d’état PROFINET.Un processeur x64 avec un processeur Intel Core i7 et un bon adaptateur devrait avoir moins de 10µs.
Les processeurs ARM avec puce intégrée auront environ 50 µs ou plus.

Options d'optimisation
Pour trier vos priorités et les IRQ requises, vous pouvez utiliser les commandes du shell PLC
irq-listetirq-set-prio.Ces commandes utilisent les priorités Linux normales et non les priorités CEI.
Cette optimisation n'est pas possible dans CODESYS Virtual Control SL, mais plutôt sur le système hôte.
Utilisez une carte réseau distincte pour les appareils.
Pour plus d'informations, voir :
[Pour les experts] – Outils et sujets supplémentaires
Les outils et options décrits dans cette section sont destinés aux utilisateurs expérimentés. Étant donné que les mesures à prendre dépendent fortement du système spécifique, des recherches indépendantes sont nécessaires. Nous ne sommes donc pas en mesure de vous proposer de solutions spécifiques.
KernelShark / trace du noyau
Si vous découvrez que la cause de vos problèmes de performances est liée à la planification, c'est le programme qu'il vous faut. À l'aide de la « trace du noyau », vous pouvez vérifier si votre tâche est interrompue par une autre tâche, un autre service ou une interruption.
trace-cmd record -p functionVous pouvez utiliser KernelShark pour examiner le généré
trace.datdéposer.
En général, les problèmes de planification peuvent être divisés en deux catégories :
Remplacement/préemption
Si l'interruption ou la tâche empêchant l'exécution est inutile, désactivez-la.
Augmentez la priorité de votre tâche ou réduisez la priorité des autres.
Passez à un autre cœur de processeur.
Important
Vérifiez l'efficacité des modifications à l'aide des programmes décrits dans le chapitre précédent.
Délai d'exécution
Voir ci-dessous « Trace des fonctions du noyau »
Trace des fonctions du noyau
Si le temps de traitement du code est trop long, vous pouvez utiliser cet outil pour trouver le problème.
Si la fonction avec un temps d'exécution trop élevé se trouve dans votre propre code, vous devez alors l'optimiser.
Si la fonction dont le temps d'exécution est trop élevé se trouve dans le noyau, vous pouvez essayer d'obtenir la fonctionnalité souhaitée avec une autre fonction du noyau. Vous pouvez également transmettre des paramètres de configuration au pilote du noyau afin de réduire le temps d'exécution.
Si aucune de ces options ne résout le problème, vous devrez probablement utiliser un matériel plus puissant.
Utilisez les points suivants pour vérifier si l'instrument approprié pour atteindre vos objectifs de performance est répertorié avec eux :
PREEMPT_FULL
isolcpu
rcu_nocbs
rcu_nocb_poll
pas de verrouillage logiciel
irqbalance désactiver
kernel.sched_rt_runtime_us