Skip to main content

Profiling durch Sampling

Wenn diese Messmethode aktiviert wird, generiert CODESYS eine zusätzliche Task. Diese Task unterbricht zu zufälligen Zeitpunkten die zu messende Applikationstask und ermittelt deren aktuellen Aufrufbaum.

Sampling wird nur auf Multicore-Systemen unterstützt. Sie als Anwender müssen die automatisch generierte Profiling-Task in der Taskkonfiguration einer eigenen Taskgruppe zuordnen. Diese Taskgruppe sollte auf einem anderen Kern laufen als die zu messende Task der Applikation.

Die aufgezeichneten Aufrufbäume der zu messenden Task werden zyklisch an das Entwicklungssystem übertragen und dort verarbeitet. Deshalb funktioniert diese Methode nur im Onlinebetrieb des Entwicklungssystems.

Sampling eignet sich nicht, um Ausreißer von Tasklaufzeiten zu ermitteln. Verwenden Sie die Methode, wenn Sie über einen längeren Zeitraum hinweg ermitteln wollen, welche Funktionen viel Zeit verbrauchen und welche wenig. Das Ergebnis ist eine zufällige Sammlung über viele Taskzyklen hinweg. Einmalige Effekte in einzelnen Zyklen können damit nicht erkannt werden.

Ein Vorteil dieser Messmethode ist, dass der Einfluss auf die Tasklaufzeit vergleichsweise gering ist, und dass die Messung zur Laufzeit jederzeit ein- und ausgeschaltet werden kann.

Funktionsweise der Messung

Die Profiling-Task läuft in einer Endlosschleife und hochprior. Zu zufälligen Zeitpunkten prüft die Profiling-Task, ob die zu messende Applikationstask gerade läuft. Falls sie läuft, wird sie angehalten und der aktuelle Aufrufbaum ermittelt. Der ermittelte Aufrufbaum wird in eine Liste (Array) eingetragen.

Diese Liste der Aufrufbäume wird zyklisch an das Entwicklungssystem übertragen und dort mit den bisherigen Messungen verarbeitet. Sampling läuft also nur, solange das Entwicklungssystem mit dem Laufzeitsystem verbunden ist.

Mit der Sampling-Methode wird eine statistische Verteilung der Ausführungen von Programmierbausteinen ermittelt. Die in der Ergebnisansicht ausgegebenen Laufzeiten werden dazu nicht direkt gemessen, sondern sind Ergebnis einer Berechnung. Die Berechnung basiert auf der Annahme, dass Bausteine, die oft im Aufrufbaum zu finden sind, auch mehr Ausführungszeit brauchen. Dabei wird der Anteil der Messungen (Samples) eines Programmierbausteins an der Gesamtanzahl der Samples umgerechnet auf den zeitlichen Anteil des Bausteinaufrufs an der Zykluszeit der Task.

Beispiel: In einer Task T1 werden zwei Programme P1 und P2 aufgerufen und die Taskzykluszeit beträgt 20 ms. Die Profiler-Task führt 100 Samples durch und stellt dabei folgendes fest:

  • 20 mal steht T1 im Programm P1

  • 50 mal steht T1 im Programm P2

  • 30 mal läuft T1 nicht

Der Profiler ermittelt dann die folgenden Zeiten aus dem Anteil der Task an der Zykluszeit und gibt sie in der Onlineansicht aus:

  • P1: 4 ms

  • P2: 10 ms

  • Idle: 6 ms

Die Laufzeit der Task verlängert sich natürlich durch eine Messung. Diese Verlängerung ist nicht konstant, sondern hängt von der Tiefe des Aufrufbaums ab. Je nach Plattform muss mit einer Verlängerung der Laufzeit im Bereich von 10 µs – 100 µs gerechnet werden, eventuell auch mit mehr.

Messungen der Kategorie „Fehlerhafte Samples“:

Wichtig

Bei der Ermittlung des Aufrufbaums kann es zu Fehlern kommen. Mögliche Fehlerursachen:

  • Die Länge des Arrays, in dem der Aufrufbaum gespeichert wird, ist zu kurz. In diesem Fall wird gar kein Aufrufbaum ermittelt. Die Länge des Arrays kann vom Benutzer in den Profiler-Einstellungen (Maximale Tiefe des Aufrufbaums) verändert werden.

  • Die Task ist in einem ungünstigen Zustand, beispielsweise in einem „Lock“, weil gerade versucht wird E/As zu bedienen, also auf Hardware zuzugreifen. Die Messung schlägt fehl.

Die Anzahl fehlgeschlagener Messungen erscheint in der Onlineansicht unter Kategorie Fehlerhafte Samples:

Wenn die Anzahl solcher Fehlmessungen trotz einer ausreichend langen Liste (Array) für den Aufrufbaum sehr hoch ist, sollten Sie versuchen, auf eine andere Messmethode auszuweichen.

Messungen der Kategorie IDLE:

Messungen, bei denen die Task gerade nicht gelaufen ist, erscheinen in der Onlineansicht unter Kategorie IDLE. Hintergrund: Eine zyklische Task wird üblicherweise mit einer kürzeren Laufzeit konfiguriert als die Zykluszeit ist. Somit gibt es einen Zeitraum innerhalb des Zyklus, in dem die Task nicht läuft.

Fehlende Samples:

Fehlende Samples sind Messaufzeichnungen auf der Steuerung, die nicht an das Entwicklungssystem weitergegeben werden.

Durch ein großes Aufrufbaum-Array (große geforderte Aufrufbaumtiefe) und/oder eine hohe Sampling-Rate (kleines Sampling-Intervall) kann es vorkommen, dass nicht alle aufgezeichneten Aufrufbäume an das Entwicklungssystem übertragen werden können. Da sich aber verlorengegangene Messungen genauso über den Zyklus verteilen wie die Messungen, die übermittelt werden, wird das Ergebnis nicht verfälscht. Deshalb wird die Anzahl der fehlenden Messungen nur in der Ansicht Online - Übersicht ausgegeben (Anzahl fehlender Samples), nicht als eigene Kategorie in den Ergebnisansichten (wie die fehlerhaften Messungen). Aber die Zahl verlorengegangener Messungen weist auf eine möglicherweise zu hohe Messdichte hin, die auch die Zykluslaufzeit unnötig erhöht. Sie sollten in diesem Fall entweder die Einstellungen für die Maximale Tiefe des Aufrufbaums oder für das Sampling-Intervall entsprechend verändern.

Hinweise zu den Einstellungen

Für die Sampling-Methode gibt es auf der Registerkarte Einstellungen des Profiler-Editors in der Sektion Sampling-Parameter folgende spezielle Angaben:

Profiler-Taskgruppe: Taskgruppe, die die Profiler-Task enthält.

Sampling-Intervall: Zeitraum, in dem zu einem zufälligen Zeitpunkt eine Messung durchgeführt wird, also eine Aufnahme des Aufrufbaums gemacht und gespeichert wird.

Maximale Tiefe des Aufrufbaums: Maximale Verschachtelungstiefe, für die der Aufrufbaum bei der Messung ermittelt werden soll.

Aktivieren und Durchführen des Profilings durch Sampling

Voraussetzung:

  • Ein CODESYS-Projekt mit einer Applikation aus verschiedenen Bausteinen ist im Offlinebetrieb geöffnet.

  • Die Verbindung zu einer Multicore-Steuerung ist in den Kommunikationseinstellungen konfiguriert und die Steuerung läuft.

  • Die Profiler-Task für das Sampling läuft - idealerweise als einzige Task - auf einem anderen Kern als die zu messende Applikationstask.

    In der Taskkonfiguration ist also auf einem eigenen Kern eine „Profiler“-Taskgruppe angelegt, idealerweise mit Eigenschaft „FixedPinned“. Dieser Gruppe ist (als einzige) die automatisch generierte Profiler-Task zugeordnet. Auf einem anderen Kern liegt die Taskgruppe für die zu messende Task Ihrer IEC-Applikation.

  • Die Applikation ist die aktive Applikation und fehlerfrei übersetzt.

  1. Sie können in der Applikation eine boolsche Variable anlegen, über die das Profiling programmatisch aktivert und deaktiviiert werden kann. Dies ist optional, das Profiling kann zur Laufzeit auch über die Schaltfläche Pause/Start im Bedienfeld der Ansicht Online aus- und eingeschaltet werden.

  2. Fügen Sie im Gerätebaum unterhalb der Applikation mit dem Befehl Objekt hinzufügen ein Objekt Profiler hinzu.

  3. Doppelklicken Sie auf das Objekt.

    Der Editor für das Objekt öffnet sich. Registerkarte _prf_icon_settings.png Einstellungen ist im Vordergrund.

  4. Wählen Sie als Methode die Option Sampling.

  5. Wählen Sie unter Aufzeichnung die Task Ihrer Applikation aus, für deren Bausteinaufrufe Sie Zeitmessungen durchführen möchten.

    Klicken Sie bei Bedingung auf die Schaltfläche _cds_icon_three_dots.png und wählen Sie die boolesche Variable aus Ihrer Applikation aus, über die Sie die Werteaufzeichnung aus- und einschalten möchten. Hinweis: Die Verwendung einer solchen Variablen ist optional. Wenn Sie das Feld leer lassen, wird jeder Zyklus aufgezeichnet.

  6. Stellen Sie unter Sampling-Parameter Folgendes ein:

    • Profiler-Taskgruppe: Name derTaskgruppe, die die automatisch generierte Task für das Profiling enthält (siehe oben, Voraussetzungen in der Taskkonfiguration).

    • Sampling-Zeitintervall: Zeit zwischen den Messungen (empfohlen: Wert der Taskzykluszeit)

    • Maximale Tiefe des Aufrufbaums, die jeweils ermittelt werden soll.

  7. Wählen Sie bei Darstellung der Momentaufnahme das Zeitformat für die Darstellung der Aufzeichnungen.

  8. Laden Sie die Applikation auf die Steuerung: Befehl Online → Einloggen .

    In der Statuszeile von CODESYS Profiler erscheint die Anzeige _prf_img_status.png.

  9. Starten Sie die Applikation: Befehl Online → Start .

    Das Projekt läuft, Sie sehen in den üblichen Monitoring-Ansichten die aktuellen Variablenwerte.

  10. Wenn Sie eine boolsche Variable als Bedingung für das Starten des Profilings konfiguriert haben, setzen Sie diese Variable nun auf TRUE.

  11. Sehen Sie sich nun die Messergebnisse an. Öffnen Sie dazu den Editor des Profiler-Objekts und dessen Registerkarte _prf_icon_online.png Online. Betätigen Sie die Schaltfläche Momentaufnahme aktualisieren und nach einiger Zeit erneut.

    Sie sehen den Aufrufbaum der zu messenden Task. Bei den einzelnen Bausteinen erscheint die jeweilige Anzahl an Samples (Messungen) und die ermittelte Gesamtzeit, die die Bausteinaufrufe verbrauchen.