Hängende Threads durch simplexml_load_file()

Hallo,
ich habe seit der Umstellung auf Version 4 (unter Windows 10) gelegentlich Probleme mit hängenden Threads. Leider gelingt es mir nicht das Problem nachzustellen. Bei den bisherigen „Häng“ Situation haben sich aber jede Menge Anhaltspunkte ergeben. Ich habe ein neues Thema erstellt, da die Beobachtung nicht direkt zu den anderen Fällen hier im Forum passen.

Vorab zwei sehr markante Punkte:

  1. Auslöser ist die Funktion simplexml_load_file(). Da meine Konfigurationsdaten in XML vorliegen, verwende ich die Funktion in sehr vielen Skripten.
  2. Wenn der Fehler auftritt, werden immer 9 von 10 ‚Thread-Plätzen‘ blockiert. Sobald 9 hängende Skripte vorhanden sind, läuft IPS mit einem Thread ohne Fehler weiter.

Und noch einige weitere Beobachtungen

  1. Start der Fehlersituation

[ul]
[li]Der Fehler ist bisher nur aufgetreten, wenn mehrere Skripte mit simplexml_load_file() gleichzeitig ausgeführt werden (Timer-Event jede Minute, Anwesenheit->Triggert diverse Skripte).
[/li][li]Zum Startzeitpunkt hängen immer mindestens 2 Skripte.
[/li][li]Es sind unterschiedliche Skripte die hängen.
[/li][li]Die hängenden Skripte verwenden unterschiedliche XML Files.
[/li][/ul]

  1. Zeitraum zwischen Start und 9 hängenden Threads

[ul]
[li]Der Zeitraum liegt je nach Situation zwischen 3 Sekunden und 4 Minuten.
[/li][li]Es bleiben auch Skripte hängen, wenn kein anderes Skript parallel läuft.
[/li][li]Das gleiche Skript (z.B. Überprüfung Status IP-Adressen jede Minute) läuft mal durch und ein anderes mal bleibt es hängen. In dem 4 Minuten Intervall z.B. 2 mal erfolgreich gelaufen und 2 mal blockiert.
[/li][/ul]

  1. Wenn 9 hängende Thread vorhanden sind

[ul]
[li]Alle Skripte lauf wieder ohne Probleme
[/li][li]Es ist kein erhöhter CPU Bedarf vorhanden
[/li][li]Am Anfang kam es dann bei bei einem Skript mit IPS_RunScriptWait zum Stillstand. Seit einem Update wird diese Situation nach 15 Minuten von IPS selber aufgehoben ;-).
[/li][/ul]

Ich habe schon versucht mit parallelen Skripten die simplexml_load_file ausführen die Fehlersituation hervorzurufen. Leider laufen die Testskripte ohne Probleme durch.

Freundliche Grüße
Josef

Hi Josef,

ich kann dieses problem bestätigen, genau die selben Symptome

gruss
Dave

Erstmal vielen Dank für die ausführliche Analyse!

Magst du mal IPS_Semaphore* um den Befehl in den jeweiligen Skripten tun?
Damit sollten wir die Annahme sehr schnell validieren können und du hast ggf. bisweilen einen Workaround :slight_smile:

paresy

Hallo paresy,
das gehe ich gerne morgen an. Ich werde 10-20 Skripte heraussuchen, die besonders häufig bzw. parallel ausgeführt werden.
Der Test selber kann dann dauern. Ich habe bisher auch schon 11 Tage Betrieb ohne hängende Threads gehabt.

Freundliche Grüße
Josef

Hi Paresy,

das hilft nicht wirklich…

dann wird das log hiermit zugeschoben

<br />
<b>Warning</b>:  Cannot leave semaphore with name sonos1 which we do not own! in <b>C:\IP-Symcon\modules\

Grüsse
Dave

Wie hast du denn die Befehle genutzt? Das klingt so, als wenn du die nicht korrekt verwendest :slight_smile:

paresy

danke für den Tipp…

Grüsse
Dave

Hallo paresy, hallo Dave,
ich habe jetzt 5 Skripte mit IPS_Semaphore versehen.

IPSLogger_Trc($meldung_prefix, "Trace Threadpool - Thread: " . $_IPS['THREAD'] . " - Position Semaphore-Enter" );
if (IPS_SemaphoreEnter("XML_LOAD", 1000)) {
	$xml = simplexml_load_file(IPS_GetKernelDir() . 'user\Konfiguration\JJ_Config_Instanzen.xml');
	IPSLogger_Trc($meldung_prefix, "Trace Threadpool - Thread: " . $_IPS['THREAD'] . " - Position Semaphore-Leave");
	IPS_SemaphoreLeave("XML_LOAD");
} else {
	IPSLogger_Wrn($meldung_prefix, "Trace Threadpool - Thread: " . $_IPS['THREAD'] . " - Position Semaphore konnte nicht gesetzt werden" );
	exit ("Semaphore zum Sperren XML konnte nicht gesetzt werden");
}

Ich hatte 6 mal die „Häng Situation“. Drei der geänderten Skripte laufen jede Minute und haben 4 mal für die Fehler Situation gesorgt. Die anderen 2 Skripte laufen bei einer Änderung der An-/Abwesenheit mehrfach parallel und haben 2 mal die Fehlersituation ausgelöst. Wenn andere Skripte die Häng Situation auslösen sollten, kann man dies im Log erkennen.

Insgesamt habe ich 88 Skripte mit simplexml_load_file und diese haben bis zu 5 Stellen wo der Befehl ausgeführt wird. Eine gesamte Umstellung ist da recht aufwendig. Das von Dave beschriebene Problem mit „Cannot leave semaphore“ bedeutet dann ja auch einen sofortigen Stillstand des Systems wenn viele Skripte mit Semaphore versehen sind.

Ich habe zusätzlich noch einmal versucht mit einem Testskript das 10 simplexml_load_file parallel ausführt den Fehler zu provozieren. Trotz rund 1000 Durchläufen ist leider keine Häng Situation entstanden.

Jetzt brauchen wir etwas Geduld. Der Zeitabstand zwischen den Häng Situationen betrug bisher 2 bis 11 Tage.

Freundliche Grüße
Josef

Hallo paresy,
ein kurzer Zwischenstand nach einer Woche Betrieb mit den eingebauten Semaphoren bei meinen „Standard Skripten“.

Ich hatte einen Hänger als zeitgleich zu den Standard Skripten die Beschattungssteuerung aktiv wurde. Hierbei haben sich die bisherigen Beobachtungen noch einmal bestätigt – und neue Infos gibt es auch.

  1. Beim Start der Fehlersituation laufen mehrere Skripte mit simplexml_load_file() parallel. In diesem Fall die serialisierten Zugriffe der Standard Skripte mit Skripten aus der Beschattungssteuerung. So hing auch nur eines der 3 Standard Skripte (Semaphore wirken).

  2. Nach dem Auftreten der Fehlersituation bleiben auch Skripte mit simplexml_load_file() hängen, wenn kein anderes Skript parallel läuft. Andere Skripte mit simplexml_load_file() laufen ohne Fehler durch.

  3. Beim Ende der Fehlersituation gibt es eine neue Erkenntnis. Ich hatte die Anzahl der Threads von 10 auf 12 erhöht. Die Fehlersituation war nun beendet, nachdem 11 Thread mit hängenden Skripten belegt waren.

Eine Zusätzliche Bestätigung gibt es bei der Annahme das der simplexml_load_file() Befehl den ‚Hänger‘ erzeugt. Nach dem Start der ‚Häng-Situation‘ war die Semaphore dauerhaft gesetzt. Alle Skripte die den simplexml_load_file() Befehl mit Semaphore schützen beendeten sich mit der kodierten Fehlermeldung.

Ich habe jetzt noch an ca. 20 weiteren Stellen Semaphore eingebaut.

Freundliche Grüße
Josef