Der Speicherverbrauch meiner IEC-Applikation nimmt zu
Vorbereitungen
Sie benötigen ein Laufzeitsystem, in der die Komponente CmpMemGC
aktiviert und aktiv ist. Sie können im Runtime-Protokoll überprüfen, ob diese Komponente geladen ist.
Fehlerbehebung
Wenn Sie nach einer bestimmten Betriebszeit Ihrer IEC-Anwendung seltsame Effekte feststellen, wie den Verlust des Lizenzstatus oder dass kein neuer Speicher zugewiesen werden kann, könnte dies durch ein Speicherleck verursacht worden sein.
Sie sollten diese Effekte untersuchen und herausfinden, woher das Problem kommt.
CODESYS Memory DeviceTrace
Diese Funktion ist in Laufzeitsystemen ab Version SP19 (SL Version 4.9.0.0) vorhanden und kann sehr einfach verwendet werden:
Aktivieren Sie die Einstellung in der Laufzeitumgebung.
Beenden Sie das Laufzeitsystem über das Deploy Tool.
Verbinden Sie sich über
putty
oder einen anderen SSH-Client mit Ihrem Zielsystem.Öffnen Sie die Konfigurationsdatei der Laufzeitumgebung mit einem Texteditor (beispielsweise nano).
sudo nano /etc/codesyscontrol/CODESYSControl.cfg
Fügen Sie den Eintrag
EnableMemTrace=1
in den AbschnittCmpMemGC
hinzu.[CmpMemGC] EnableMemTrace=1
Speichern und schließen Sie die Datei.
Starten Sie das Laufzeitsystem neu über das Deploy Tool.
Fügen Sie den Device Trace zu Ihrem CODESYS-Projekt (in dem dieses Problem auftritt) hinzu.
Rechtsklicken Sie auf das Gerät im Gerätebaum.
Wählen Sie den Befehl Objekt hinzufügen → Device Trace.
Das Objekt Device Trace wird unterhalb der Steuerung eingefügt.
Die Registerkarte Device Trace wird angezeigt.
Wählen Sie den Befehl Trace → Trace hochladen.
Der Dialog Online-Traces des Geräts 'CODESYS_Control_for_Linux_SL' wird angezeigt.
Wenn Sie den Eintrag MemGCTrace nicht finden können, ist die Einstellung aus Schritt 1 nicht richtig gesetzt. Sollte Ihre Steuerung den Mechanismus nicht unterstützen, verwenden Sie für die Diagnose eine der beiden nachfolgenden Möglichkeiten.
Wählen Sie den Eintrag MemGCTrace und klicken Sie auf Hochladen und Dialog schließen.
Der Speicher-Trace (
MemGCTrace
) ist zumDeviceTrace
hinzugefügt.
Für weitere Informationen siehe: Befehl: Trace hochladen
CODESYS-Bibliothek SysMem
Sie können auch programmatisch auf interne Informationen zugreifen. Über IEC-Bibliotheksfunktionen können Sie auf die aktuelle Übersicht aller alloziierten RAM- / Heap-Speicher zugreifen.
SysMem.SysMemGetCurrentHeapSize()
Dieser Wert kann verwendet werden, um die aktuelle Heap-Größe zu beobachten. Sie können diesen Wert überwachen oder ihn in einen Trace schreiben.
So können Sie feststellen, ob der Anstieg des allozierten Speichers in einem zeitlichen Zusammenhang mit bestimmten anderen Ereignissen Ihrer IEC-Anwendung steht.
Linux-Kommandozeile
Wenn Sie Zugriff auf die Linux-Konsole haben (beispielsweise über einen SSH-Client), können Sie auch das Speicherverhalten überprüfen.
Es gibt verschiedene Werkzeuge und Befehle, um dies zu erreichen:
htop / top
Dies sind grafische Werkzeuge zur Analyse der Prozesse (und Threads) auf einem Linux-System.
Fast alle Linux-Distributionen bieten diese Werkzeuge an, so dass Sie sie einfach über apt
oder dnf
oder die Paketverwaltung der Distribution installieren können.
htop # or top
Beide Werkzeuge können verwendet werden, um die Threads in einer Baumansicht zu sehen und den CODESYS-Laufzeitprozess und seine Threads zu analysieren. Jede IEC-Task ist ein pthread
innerhalb des Laufzeitprozesses.
Im Werkzeug htop können Sie die Ansicht über F2 (Setup-Menü) anpassen: Wir empfehlen Ihnen, die Optionen Tree view
und show custom thread names
zu aktivieren.
Im oberen Bereich können Sie die Baumansicht mit der Tastenkombination Shift + V aktivieren und somit die CPU-Nutzung / Speichernutzung pro Thread sehen. So können Sie feststellen, ob der Anstieg des alloziierten Speichers in einem zeitlichen Zusammenhang mit bestimmten anderen Ereignissen Ihrer IEC-Anwendung steht, oder ob Sie überhaupt ein Speicherleck haben.