Skip to main content

Ottimizzazione delle prestazioni

In questa pagina, ti mostreremo come configurare un prodotto CODESYS Control SL basato su Linux per il tuo dispositivo e la tua applicazione in modo da ottenere le migliori prestazioni possibili.

Ti forniamo gli strumenti che puoi utilizzare per verificare e valutare lo stato attuale del tuo sistema.

Consigliamo la seguente procedura. Esegui questi passaggi nell'ordine specificato. Non ha alcun senso passare alla fase successiva se quella attuale non è ottimizzata come dovrebbe essere.

  1. Controllo dell'hardware

  2. Configurazione di Linux

  3. Configurazione del CODESYS sistema di runtime

  4. Configurazione dell'applicazione IEC

Importante

Dopo ogni passaggio, verifica che l'ultima modifica non abbia influito negativamente sulle ottimizzazioni dei passaggi precedenti.

Dopo aver raggiunto le prestazioni desiderate con carico normale, è possibile opzionalmente eseguire un test con carico elevato stress-ng O iperf.

Puoi trovare maggiori informazioni sui seguenti siti web:

Controllo dell'hardware

  • Non utilizzare cache condivise per i core del processore del controller.

  • Se utilizzi bus di campo basati su Ethernet per il dispositivo di destinazione, utilizza un adattatore fisico per essi. Non utilizzate

Configurazione di Linux

  • Utilizza un kernel in tempo reale.

    Importante

    Per il funzionamento in tempo reale su Linux, usa la patch Realtime PREEMPT. L'uso di un kernel a bassa latenza non è sufficiente perché non garantisce proprietà deterministiche in tempo

    Per ulteriori informazioni, vedere quanto segue:

    Molte delle seguenti impostazioni di sistema possono anche essere configurate direttamente utilizzando PLCShell tramite il sistema runtime o direttamente tramite il file di configurazione del sistema runtime. Alcune impostazioni di sistema non persisteranno dopo il riavvio del sistema. Inserendo le impostazioni nel file di configurazione, le impostazioni verranno ripristinate automaticamente all'avvio del sistema di runtime. L'esecuzione del comando PLCShell corrispondente aggiunge anche le rispettive voci al file di configurazione

    Comando PLCShell

    Inserimento del file di configurazione

    Funzione

    rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>

    Restituisce informazioni sulle impostazioni di sistema

    Esempio 3. Esempio

    rt-get scaling_governor

    Visualizza i regolatori di scalabilità disponibili e restituisce il regolatore di scala configurato per il core



    rt-set scaling_governor <cpu_index> <value>

    [CmpLinuxRTDiag]
    ScalingGovernor.CPU0=performance

    Imposta il regolatore di scala sull'opzione specificata per core specifici o tutti i core

    Esempio 4. Esempio

    set scaling_governor all performance



    rt-set hyperthreading <state>

    [CmpLinuxRTDiag]
    Hyperthreading=off

    Attiva/disattiva l'Hyperthreading

    rt-set throttling <state>

    [CmpLinuxRTDiag]
    Throttling=off

    Attiva/disattiva il throttling

    rt-set napi <device> <state>

    [CmpLinuxRTDiag]
    Napi=eno1

    Abilita o disabilita la NAPI con thread per l'adattatore di rete

    rt-clear-settings

    Elimina tutto rt-set impostazioni dal file di configurazione

    rt-marker-set <taskname> <threshold>

    [CmpLinuxRTDiag]
    TraceMarker.TaskName=MainTask
    TraceMarker.ThresholdUs=100
    
    [SysTask]
    Linux.MeasureInterval=1

    Abilita la scrittura di un marker di traccia del kernel per l'attività specificata quando il jitter supera il limite specificato.

    Disponibile solo se il runtime viene eseguito come utente root

    rt-marker-disable

    Disattiva il kernel trace marker

    rt-marker-get

    Specifica il nome dell'attività configurato per il marker di traccia del kernel e il limite di jitter

    irq-list

    Elenca tutti gli IRQ disponibili, le relative priorità e affinità sul 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-settings

    Elimina tutto irq sets impostazioni dal file di configurazione

    Per richieste in tempo reale, è necessario utilizzare il kernel RT preempt (https://wiki.linuxfoundation.org/realtime/documentation/start) per il tuo sistema Linux. Nel caso delle distribuzioni Debian e Ubuntu, troverai un kernel RT come pacchetto che puoi installare facilmente usando apt comando. Per ulteriori informazioni, consulta il manuale della tua distribuzione.

    • Sui sistemi Debian

      sudo apt-get install linux-image-rt-amd64

    • Usa il uname -a comando, ad esempio, per verificare quale kernel stai usando.

  • Evita di utilizzare un gestore Windows, un server GUI/X o simili sul tuo sistema.

    L'utilizzo di questi strumenti potrebbe influire sulle capacità in tempo reale del sistema, con conseguente jitter elevato nell'applicazione IEC).

Test

Utilizzo degli "rt-tools":

  • Installazione di "rt-tools": sudo apt install rt-tests

  • Avvio del "test ciclico": sudo cyclictest -p 99 -t -m

  • IL man cyclictest Il comando mostra più opzioni della riga di comando che puoi utilizzare per misurare meglio aspetti prestazionali più o specifici del tuo sistema.

Indipendentemente dal fatto che il valore sia determinato con cyclictest può essere considerato «buono» dipende dal tuo hardware. Se utilizzi un processore molto potente (ad esempio, Intel Core i7), dovresti avere al massimo un numero basso di 1 cifra. Se si utilizza un vecchio processore ARM, 100 potrebbe essere un

Opzioni di ottimizzazione

Importante

Dopo aver modificato ciascuna impostazione o combinazione di impostazioni, è necessario eseguire cyclictest programma per verificare l'efficacia delle modifiche.

Queste impostazioni non sono permanenti e pertanto devono essere ripristinate dopo l'avvio o il riavvio del sistema.

Avviso

Nella versione 4.21.0.0 e successive, CODESYS fornisce un comando PLC Shell che emette direttamente la maggior parte di questi valori. A tale scopo, eseguite il system-creatertreport comando. Per maggiori dettagli sul comando, esegui system-creatertreport ?.

  • Disattiva la modalità di risparmio energetico della CPU.

  • Disabilita l'hyperthreading.

    È possibile utilizzare il comando seguente per disabilitare l'hyperthreading (esempio):

    echo off | sudo tee /sys/devices/system/cpu/smt/control
  • Disabilita il ridimensionamento e la commutazione della frequenza della CPU il più possibile.

    Ad esempio, imposta la frequenza minima e massima della CPU sullo stesso valore (fisso).

  • Disabilita il meccanismo di limitazione in tempo reale del kernel Linux perché ciò può causare jitter sul tuo sistema.

    Per ulteriori informazioni, vedere quanto segue: The Linux Foundation: Scheduling — RT throttling

    È possibile utilizzare il comando seguente per disattivare la limitazione in tempo reale (esempio):

    echo -1 > /proc/sys/kernel/sched_rt_runtime_us
  • Controlla e modifica il regolatore di pianificazione/scalabilità.

    • Controlla il regolatore di schedulazione/scalabilità utilizzato:

      cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    • Modificare il regolatore di schedulazione/scalabilità utilizzato (come root/admin) a 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

      Si noti che il regolatore di scala deve essere reimpostato ogni volta che il sistema viene avviato. Puoi anche impostarlo tramite la configurazione del kernel

      Le intel_pstate driver del kernel può rendere più difficile l'impostazione corretta. Pertanto, è necessario utilizzare cpufreq-info comando per verificare la configurazione.

    • Puoi anche usare programmi come cpu-freq-utils. Ciò potrebbe interferire con i driver Intel pstate. Questi driver richiedono normalmente un approccio diverso per impostare la frequenza della CPU

    • Per ulteriori informazioni, vedere quanto segue: https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt

  • Disabilita HyperV nel BIOS (se disponibile).

Configurazione del CODESYS sistema di runtime

  • Crea un'applicazione di test che descriva approssimativamente l'applicazione per la quale desideri ottimizzare il tuo sistema (in termini di risorse richieste, prestazioni richieste e dimensioni del progetto).

  • Puoi farlo in modo iterativo: prima crea un'approssimazione molto approssimativa e poi espandila per avvicinarti sempre di più all'applicazione reale.

Test

Quando l'applicazione è in esecuzione, controlla la configurazione dell'attività. Apri il Configurazione delle attività e seleziona il Tenere sotto controllo scheda.

_rtsl_img_performance_oprimization_cds.png
  • minimo Jitter (μs)/max. Jitter (μs)

  • Tempo ciclo medio (μs)/max. Tempo di ciclo (μs) Tempo di ciclo (μs)

    • Il ciclo massimo non dovrebbe mai avvicinarsi al tempo di ciclo configurato. Ciò porta a problemi non appena il sistema sperimenta un carico elevato.

    • Mantenere sempre il tempo di ciclo il più breve possibile.

Opzioni di ottimizzazione

Importante

Dopo aver modificato ciascuna impostazione o combinazione di impostazioni, è necessario eseguire cyclictest programma per verificare l'efficacia delle modifiche.

  • Suddividi le attività di lunga durata in più attività più piccole.

  • Durante l'esecuzione, il tempo di ciclo massimo del task con la priorità più alta non dovrebbe mai raggiungere il tempo di ciclo configurato. Se non è possibile evitarlo, è necessario aumentare il tempo di ciclo progettato per garantire tempi di esecuzione coerenti.

  • All'avvio dei sistemi bus di campo (ad esempio EtherCAT o PROFINET) i cicli di avvio possono comportare un carico leggermente maggiore della CPU. In questo caso ha senso monitorare il carico della CPU subito dopo l'avvio dell'applicazione.

Non è possibile modificare le seguenti opzioni CODESYS Virtual Control SL, ma devono essere configurati sull'host:

  • Imposta il valore per DisableCpuDmaLatency a 1:

    [SysCpuHandling]
    Linux.DisableCpuDmaLatency=1
    • Tieni presente che questa è l'impostazione predefinita a partire dalla versione runtime 4.11.0.0.

    • Per verificare la versione del runtime, fare clic su Extra → Aggiorna Linux → Sistema → Informazioni di sistema.

  • Verificate che il kernel in tempo reale sia realmente utilizzato.

    • A partire dalla versione 4.11.0.0 è possibile utilizzare il comando della shell PLC rt-get kernelinfo per verificare questo.

    • Se hai una versione precedente, puoi testarla direttamente sulla riga di comando con uname -a comando.

    • Se il kernel in tempo reale non viene utilizzato, è necessario avviare l'ottimizzazione dall'inizio.

Configurazione dell'applicazione IEC

Questa sezione si riferisce alla tua applicazione effettiva.

Test

Opzioni di ottimizzazione

Importante

Dopo aver modificato ciascuna impostazione o combinazione di impostazioni, è necessario eseguire il programma "ciclicotest" per verificare l'efficacia delle modifiche.

  • Puoi usare il Multicore caratteristica in CODESYS.

  • Determina le priorità corrette per i tuoi compiti. I compiti importanti dovrebbero avere una priorità più alta.

    Tabella 6. Mappatura delle priorità delle attività IEC e delle priorità dei thread Linux:

    Priorità del compito IEC

    Priorità di runtime

    Priorità Linux

    --

    0

    88 (SCHED_FIFO)

    --

    31

    57 (SCHED_FIFO)

    0 (massima priorità in tempo reale)

    32

    56 (SCHED_FIFO)

    15 (priorità minima in tempo reale)

    47

    41 (SCHED_FIFO)

    16 (priorità non in tempo reale)

    48

    0 (SCHED_OTHER)

    31 (priorità non in tempo reale)

    63

    0 (SCHED_OTHER)

    --

    64

    0 (SCHED_OTHER)

    --

    255

    (SCHED_IDLE)

    Avviso

    Su un sistema Linux convenzionale, la maggior parte degli interrupt (IRQ) e dei kernel worker hanno la priorità Linux 50. L'uso di priorità (con carico elevato) superiori a tale valore può far sì che le funzioni di sistema (rete/storage) non funzionino



  • È possibile configurare la priorità di un'attività nella rispettiva configurazione dell'attività.

    _rtsl_img_performance_iec.PNG

Se non ottieni le prestazioni desiderate dopo tutti i passaggi qui menzionati, puoi consultare le seguenti sezioni:

Informazioni specifiche del bus di campo

Test

  • Controlla il Send Time / Recv Time valori nella pagina di stato EtherCAT.

    • Una CPU x64 con processore Intel Core i7 e un buon adattatore dovrebbe avere meno di 10μs.

    • I processori ARM con chip integrato avranno ~50μs o più.

    _rtsl_img_performance_ecat.png
  • Controlla il Send Time / Recv Time valori nella pagina di stato PROFINET.

    • Una CPU x64 con processore Intel Core i7 e un buon adattatore dovrebbe avere meno di 10μs.

    • I processori ARM con chip integrato avranno ~50μs o più.

    _rtsl_img_performance_pn.png

Opzioni di ottimizzazione

  • Per ordinare le priorità e gli IRQ richiesti, è possibile utilizzare i comandi della shell PLC irq-list E irq-set-prio.

    • Questi comandi utilizzano le normali priorità Linux e non le priorità IEC.

    • Questa ottimizzazione non è possibile in CODESYS Virtual Control SL, ma piuttosto sul sistema host.

  • Utilizzare un adattatore di rete separato per i dispositivi.

  • Per ulteriori informazioni, vedere:

[Per esperti] – Strumenti e argomenti aggiuntivi

Gli strumenti e le opzioni descritti in questa sezione sono destinati agli utenti esperti. Poiché le azioni da intraprendere dipendono fortemente dal sistema specifico, è necessaria una ricerca indipendente. Pertanto, non siamo in grado di offrirti soluzioni specifiche.

  • KernelShark/traccia del kernel

    • Se scopri che la causa dei tuoi problemi di prestazioni ha qualcosa a che fare con la pianificazione, allora questo è il programma da scegliere. Con l'aiuto di «kernel trace», puoi verificare se la tua attività viene interrotta da un'altra attività, da un altro servizio o

      • trace-cmd record -p function

      • È possibile utilizzare KernelShark per esaminare il file generato trace.dat file.

    • In generale, i problemi di pianificazione possono essere suddivisi in due categorie:

      • Sostituzione/prelazione

        • Se l'interruzione o l'attività che impedisce l'esecuzione non è necessaria, disabilitala.

        • Aumenta la priorità del tuo compito o riduci la priorità degli altri.

        • Passa a un core della CPU diverso.

        Importante

        Verifica l'efficacia delle modifiche utilizzando i programmi descritti nel capitolo precedente.

      • Tempo di esecuzione

        Vedi sotto «Kernel Function Trace»

  • Trace della funzione del kernel

    • Se il tempo di elaborazione del codice è troppo elevato, puoi utilizzare questo strumento per trovare il problema.

    • Se la funzione con un tempo di esecuzione troppo elevato è nel tuo codice, devi ottimizzarla.

    • Se la funzione con un tempo di esecuzione troppo elevato è nel kernel, puoi provare a ottenere la funzionalità desiderata con un'altra funzione del kernel. In alternativa, puoi anche passare i parametri di configurazione al driver del kernel per ridurre il tempo di esecuzione

    • Se nessuna di queste opzioni risolve il problema, probabilmente dovrai utilizzare hardware più potente.

Utilizza i seguenti punti per verificare se lo strumento giusto per raggiungere i tuoi obiettivi prestazionali è elencato con essi:

  • PREEMPT_FULL

  • isolcpu

  • rcu_nocbs

  • rcu_nocb_poll

  • nosoftlockup

  • disabilitazione del bilanciamento irq

  • kernel.sched_rt_runtime_us