Skip to main content

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.

  1. Vérification du matériel

  2. Configuration de Linux

  3. Configuration du CODESYS système d'exécution

  4. Configuration de l'application IEC

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. Exemple

    rt-get scaling_governor

    Affiche 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. Exemple

    set scaling_governor all performance



    rt-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-settings

    Supprime tout rt-set paramètres à partir du fichier de configuration

    rt-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-disable

    Désactive le marqueur de trace du noyau

    rt-marker-get

    Spécifie le nom de la tâche configurée pour le marqueur de trace du noyau et la limite de gigue

    irq-list

    Ré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-settings

    Supprime tout irq sets paramètres à partir du fichier de configuration

    Pour 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 apt commande. 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-amd64

    • Utilisez le uname -a commande, 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-tests

  • Démarrage de "cyclictest" : sudo cyclictest -p 99 -t -m

  • Le man cyclictest La 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/control
  • Dé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_us
  • Vé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) pour Performance:

      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_pstate le pilote du noyau peut rendre le réglage correct plus difficile. Par conséquent, vous devez utiliser le cpufreq-info commande 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 HyperV dans 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.

_rtsl_img_performance_oprimization_cds.png
  • Min. Gigue (µs) / Max. Gigue (µs)

  • 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 kernelinfo pour 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 -a commande.

    • 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

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.

    _rtsl_img_performance_iec.PNG

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 Time valeurs 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.

    _rtsl_img_performance_ecat.png
  • Vérifier la Send Time / Recv Time valeurs 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.

    _rtsl_img_performance_pn.png

Options d'optimisation

  • Pour trier vos priorités et les IRQ requises, vous pouvez utiliser les commandes du shell PLC irq-list et irq-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 function

      • Vous pouvez utiliser KernelShark pour examiner le généré trace.dat dé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