3 Stimmen

Wie kann ich die Ausführungszeit für ein Perl-Skript in IIS begrenzen?

Dies ist eine Shared-Hosting-Umgebung. Ich kontrolliere den Server, aber nicht unbedingt den Inhalt. Ich habe einen Kunden mit einem Perl-Skript, das gelegentlich außer Kontrolle gerät und bis zu 50% des Prozessors verbraucht, bis der Prozess beendet wird.

Bei ASP-Skripten kann ich die Ausführungszeit des Skripts einschränken, und IIS beendet es einfach nach zum Beispiel 90 Sekunden. Dies funktioniert nicht für Perl-Skripte, da sie als CGI-Prozess ausgeführt werden (und tatsächlich einen externen Prozess starten, um das Skript auszuführen).

Ebenso werden Techniken, die nach übermäßigem Ressourcenverbrauch in einem Worker-Prozess suchen, dies wahrscheinlich nicht erkennen, da die Ressource, die verbraucht wird (der Prozessor), von einem Kindprozess und nicht vom WP selbst beansprucht wird.

Gibt es eine Möglichkeit, dass IIS ein Perl-Skript (oder einen anderen CGI-Typ-Prozess), der zu lange läuft, abbricht? Wie??

1voto

arclight Punkte 1588

Auf einem UNIX-ähnlichen System würde ich einen Signaldandler verwenden, der ALRM-Ereignisse abfängt, dann die alarm-Funktion verwenden, um einen Timer zu starten, bevor ich eine Aktion starte, von der ich erwarte, dass sie abläuft. Wenn die Aktion abgeschlossen ist, würde ich alarm(0) verwenden, um den Alarm auszuschalten und normal zu beenden, andernfalls sollte der Signaldandler es abfangen, um alles ordnungsgemäß zu schließen.

Ich habe schon eine Weile nicht mehr mit Perl unter Windows gearbeitet und obwohl Windows in gewisser Weise POSIX-konform ist, kann ich nicht garantieren, dass dies funktioniert; Sie müssen die Perl-Dokumentation überprüfen, um zu sehen, ob und inwieweit Signale auf Ihrer Plattform unterstützt werden.

Weitere detaillierte Informationen zur Signalbehandlung und dieser Art von Selbstzerstörungsprogrammierung mit alarm() finden Sie im Perl Cookbook. Hier ist ein kurzes Beispiel aus einem anderen Beitrag, das ein wenig modifiziert wurde:

eval {
    # Erstellen Sie einen Signalhandler und machen Sie ihn lokal, damit er außerhalb des eval-Blocks außer Kraft gesetzt wird
    local $SIG{ALRM} = sub {
        print "Gib dies aus, wenn wir Zeitüberschreitung haben, dann stirb.\n";
        die "alarm\n";
    };

    # Stellen Sie den Alarm ein, wagen Sie es, das Routinen laufen zu lassen und schalten Sie den Alarm aus, wenn es abgeschlossen ist.
    alarm(90);
    routine_die eventuell etwas länger dauern könnte();
    alarm(0);
};

1voto

jwmiller5 Punkte 2564

Das ASP-Skript-Timeout gilt für alle Skriptsprachen. Wenn das Skript auf einer ASP-Seite ausgeführt wird, wird das Skript-Timeout die beanstandete Seite schließen.

1voto

Eric Longman Punkte 61

Ein Update zu diesem...

Es stellt sich heraus, dass dieses bestimmte Skript anscheinend ein wenig fehlerhaft ist und der Googlebot die unheimliche Fähigkeit hat, seine "Knöpfe zu drücken" und es verrückt zu machen. Das Skript ist eine ältere, kommerzielle Anwendung, die Kalenderfunktionen ausführt. Offensichtlich zeigt es Links für "nächsten Monat" und "vorherigen Monat" an, und wenn man zu oft auf "nächster Monat" klickt, fällt man von einer Klippe. Die resultierende Seite enthält jedoch immer noch einen "nächster Monat" Link. Googlebot würde das Skript kontinuierlich traktieren und den Prozessor überlasten.

Interessanterweise hat das Hinzufügen einer robots.txt mit Disallow: / das Problem nicht gelöst. Entweder hatte der Googlebot das Skript bereits gefunden und wollte es nicht loslassen, oder er hat die robots.txt einfach ignoriert.

Jedenfalls war Microsoft's Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) eine riesige Hilfe, da es mir ermöglichte, die Umgebung des perl.exe Prozesses genauer zu betrachten und ich dadurch feststellen konnte, dass der Googlebot meine Probleme verursachte.

Nachdem ich das wusste (und feststellte, dass robots.txt das Problem nicht lösen würde), konnte ich direkt über IIS den gesamten Verkehr von *.googlebot.com zu dieser Seite blockieren, was in diesem Fall gut funktionierte, da es uns egal ist, ob Google diesen Inhalt indexiert.

Vielen Dank für die anderen Ideen, die alle gepostet haben!

Eric Longman

0voto

piCookie Punkte 9252

Wenn Sie nach "iis cpu limit" googeln, erhalten Sie diese Treffer:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/38fb0130-b14b-48d5-a0a2-05ca131cf4f2.mspx?mfr=true

"Das CPU-Überwachungsmerkmal überwacht und schaltet automatisch Worker-Prozesse ab, die große Mengen an CPU-Zeit verbrauchen. Die CPU-Überwachung ist für einzelne Anwendungspools aktiviert."

http://technet.microsoft.com/en-us/library/cc728189.aspx

"Durch die Verwendung der CPU-Überwachung können Sie Worker-Prozesse auf die CPU-Auslastung überwachen und bei Bedarf die Worker-Prozesse abschalten, die große Mengen an CPU-Zeit verbrauchen. Die CPU-Überwachung ist nur im Worker-Prozess-Isolationsmodus verfügbar."

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X