Zu viele gleichzeitige Skripte. Verwerfe Ausführ

Guten Abend Zusammen,

unser IPS-Meldungsfenster zeigt des öfteren folgende Meldung an:

ScriptEngine | Zu viele gleichzeitige Skripte. Verwerfe Ausführung…

Was kann das denn sein, bzw wie kann ich herausfinden was so verworfen wird, bzw was dem IPS zu viel ist?!

Vielen Dank im Voraus
Dennis.

Da läuft wohl „irgendetwas“ zu lange ;).

Willkommen --> Expertenansicht hinzufügen --> PHP Informationen

dort siehst du was hängen bleibt bzw. läuft.

Moin,

habe selbiges Problem heute früh gehabt. Lt. Expertenansicht ist es ein Script, welches alle 10 min ausgeführt werden soll. Allerdings ist desse letzte Ausführung schon mehr als 9 Stunden her und trotzdem kann keine andere Aktion mehr ausgeführt werden. Es scheitert schon bei einem einfachen

phpinfo();

Wie kann man ein solches („Fehler-“) Script sauber stoppen, damit andere wieder ausgeführt werden können? Wie läßt sich das zudem automatisiert feststellen sowie wieder richten, sodass man nicht z.B. am fernen Urlaubsort damit „überrascht“ wird, dass zu Hause die Jalousien ständig geschlossen bleiben?

Hallo,

ich habe heute auch erstmalig diese Meldung


07/28/18 07:04:30 | 00000 | MESSAGE | ScriptEngine         | Zu viele gleichzeitige Skripte. Verwerfe Ausführung...

bei meinem IPS 4.4 gesehen. Das kann dann alle paar Minuten immer wieder (bis zu dem Neustart gerade). U diese Meldungen herum stand nix, was einen Hinweis auf das auslösende Script zulassen würde.

Thread Count ist auf Standard (also 10), die Hardware ist eine raspi 3. Und hier ist nach den Imitationen auch bei 10 Tasks Schluss (wegen dem 1 GB RAM). ThreadQueueLimit steht auf 50.

Der Raspi bedient nur IPS, war nicht ausgelastet (CPU 5…20%), es gab also keinen Systembedingten Engpass.

Änderungen an dem ProdSys habe ich seit ca. 14 Tagen nicht mehr gemacht. Ich bin mir auch nicht bewusst, Script zu haben, die auf irgendetwas besonders lange warten, kann das aber natürlich nicht ausschliessen.

Leider war es nicht mehr möglich, auf die Verwaltungskonsole zu öffnen, also konnte ich nicht in die PHP-Information schauen.

Ich habe das IPS mit ‚sudo kill -9 …‘ abgebrochen und neu gestartet.

Für den Fall das das nochmal auftritt: kann man auch anders als mit der PHP-Information sich eine Übersicht über die Prozesse verschaffen, also ohne die Verwaltungskonsole zu starten?

Kann man irgendwo nachschauen, wie weit die ThreadQueue verwendet wird?

Danke
demel

Ein bereits laufendes Skript könnte das ermitteln, guck mal hier

Viele Grüsse
Harald

Prima, damit kann ich mir zyklisch eine Liste erzeugen und im Filesystem speichern (oder als LogMessage). Damit hätte ich Chancen, eventuellen Hängern auf die Spur zu kommen.

Danke
demel

Das Script habe ich nun zyklisch laufen:


<?

$scriptName = IPS_GetName($_IPS['SELF']);

$now = time();

$threadList = IPS_GetScriptThreadList();

$s = '';
$threadCount = 0;

foreach ($threadList as $t => $i) {
    $thread = IPS_GetScriptThread ($i);

    $ScriptID = $thread['ScriptID'];
    if ($ScriptID == 0) {
        continue;
    }

    if ($ScriptID != $_IPS['SELF']) {
        $threadCount++;
    }
    $ScriptName = IPS_GetName($ScriptID);
	
    $ThreadId = $thread['ThreadID'];

    $StartTime = $thread['StartTime'];
    $sec = $now - $StartTime;
    $warn = $sec > 10 ? '!!!' : '';
    $duration = '';
    if ($sec > 3600) {
        $duration .= sprintf('%dh', floor($sec / 3600));
        $sec = $sec % 3600;
    }
    if ($sec > 60) {
        $duration .= sprintf('%dm', floor($sec / 60));
        $sec = $sec % 60;
    }
    if ($sec > 0 || $duration == '') {
        $duration .= sprintf('%ds', $sec);
        $sec = floor($sec);
    }

    $Sender = $thread['Sender'];
	
    $s .= "thread=$ThreadId, script=$ScriptName($ScriptID), sender=$Sender, duration=$duration $warn
";
}

if ($threadCount) {
    IPS_LogMessage($scriptName . '(' . $_IPS['SELF'] . ')', $s);
}

Es erzeugt eine Message, wenn mehr als dieses Script läuft; es wird die Dauer des Threads ausgegeben und ab 10s mit !!! markiert.

Natürlich erhöht dieses Script selbst die Menge der laufen Scripts, aber ein Problem sind ja eigentlich nur die Hänger.

Ich habe es einmal gehabt, dass mir das System vollgelaufen ist.

Ich lasse seitdem zyklisch IPS_GetThreadList laufen und prüfe dort, wann die Threads gestartet sind. Wenn ein Thread beispielsweise länger als 2 Minuten läuft, ist davon auszugehen, dass dies nicht normal ist. Ich zähle die Anzahl dieser Threads und begebe mich somit in verschiedene Warnstufen, die unterschiedliche Benachrichtigungen auslösen. In den letzten Warnstufen werden dann die Bewohner des Hauses informiert, dass einige Dinge ggf. nur noch sehr langsam bzw. zeitverzögert laufen. In der allerletzten Warnstufe verabschiedet sich IP-Symcon brav.

Das alles hat bisher zum Glück erst einmal angeschlagen, hatte aber einen sehr hohen WAF.

Moin,

die Idee ist super, hast du das über ein Script umgesetzt und eher manueller und komplexer?

Wenn es ein Script ist, magst du das mit teilen?

Ich habe zwei Skripte. Eins, welches die Threads überprüft und ein zweites, welches mich benachrichtigt. Wenn ich mir das gerade so anschaue, dann hätte man das alles auch in ein Skript packen können.

Habe es Dir zukommen lassen.

1 „Gefällt mir“

Daran wäre ich auch sehr intressiert.
Magst du mir das bitte auch schicken.

Swen

Es ist ja jetzt keinem geholfen, wenn ich das Skript verschicke. Grundzüge des Skriptes, also z.B. IPS_GetThreadLIst oder das Herausfinden der Startzeit des Skriptes, sind ja schon in Beitrag 7 enthalten.

Es wäre also allen Beteiligten besser geholfen, wenn man hier mal aufzeigt, was an den eigenen Versuchen, so ein Skript zu erstellen, bisher nicht funktioniert hat und man dann gemeinsam eine Lösung entwickelt.

Die Funktionalität ist in vergleichbarer Form auch im Integrity Check Modul von demel42 enthalten :wink: .