2014-04-01 11 views
6

Ich habe Probleme damit, dass meine Playframework-Anwendung von Zeit zu Zeit nicht reagiert und ich möchte dies zur Laufzeit feststellen + Informationen darüber protokollieren, was gerade im erschöpften Ausführungskontext abläuft.Wie scala executioncontext Erschöpfung zu erkennen?

Was wäre die beste Strategie für die Umsetzung? Ich dachte daran, kleine Runnables in den Ausführungskontexten zu posten und wenn sie nicht rechtzeitig ausgeführt werden, würde ich eine Warnung protokollieren. Diese maximale Wartezeit sollte natürlich konfigurierbar sein. ZB sollte der Haupt-Webausführungskontext niemals für mehr als 1 Sekunde blockiert werden, aber ein Hintergrund-Db-Ausführungskontext könnte 30 Sekunden blockieren.

Jemand muss das schon mal gemacht haben?

verwandte Informationen: http://www.playframework.com/documentation/2.2.x/ThreadPools

+0

möchten Sie feststellen, ob die CPU/der Speicher bis an seine Grenzen genutzt wird? – Augusto

+0

Ist New Relic eine mögliche Option für Sie? –

+0

Das hat nichts mit dem os/cpu/memory zu tun, es geht darum, die richtigen Akka-Ausführungskontexte einzurichten und Werkzeuge zu haben, die Ihnen helfen, Leistungsverschlechterungen zu erkennen, weil Sie falsche Ausführungskontexte im Code verwenden. – Somatik

Antwort

2

Die ziemlich schwierige Frage zu beantworten.

Konfiguration der Dispatcher hängt wirklich von der Art der Arbeit Ihrer Akteure ab.

Wahrscheinlich sollten Sie die Schauspieler betrachten, die Futures spawnen, um ihre Arbeit zu erledigen. Es kann eine gute Idee sein, um Ausführungskontext in der Konfigurationsdatei vordefinieren und verwenden Sie sie wie folgt aus:

implicit val ec : ExecutionContext = context.system.dispatchers.lookup("someDispatcher")

diese Akteure sind wahrscheinlich die Hunger-Effekt verursachen.

Der Effekt, den Sie erreichen möchten, ist sicherzustellen, dass Nachrichten schnell verarbeitet werden und lange laufende Aufgabe sie nicht beeinflusst, so dass Trennung der Schlüssel hier ist.

Ein gutes Werkzeug zur Überwachung Ihrer Anwendung ist die Typesafe-Konsole. Sie können den Dispatcher dort ansehen und sehen, dass die Latenz bei der Verarbeitung von Nachrichten zunimmt.

Ein weiteres Problem besteht darin, Akteure zu identifizieren, die ein hohes Risiko verursachen, wie Netzwerk-E/A. Wenn etwas mit dem Thread passiert, der nicht wieder im Pool verfügbar ist, wird es Probleme verursachen.

Es ist sehr wahrscheinlich, dass Sie nicht wissen, was die beste Einstellung für Sie ist, wenn Sie nicht mit der Größe des Threadpools experimentieren.

Die meisten dieser Ratschläge, die ich geschrieben habe, weiß ich aus dem Buch Effective Akka by Jamie Allen und sie scheinen recht gut für mich zu arbeiten. Es gibt einen Abschnitt in diesem Buch Fixing Starvation. Vielleicht möchten Sie es genauer betrachten.

+0

danke für die Antwort, aber lassen Sie uns sagen, dass Sie einen Praktikanten haben, der an dem Projekt arbeitet und er nicht über die Regeln weiß, was auf welchem ​​Dispatcher ausgeführt werden kann. Er könnte den Web-Dispatcher lange blockieren. Ich möchte, dass das System ihm sagt, dass er es tut/etwas falsch macht ... – Somatik

+1

Ich glaube, das automatisch zu erreichen wäre ziemlich schwer zu bekommen. Um ehrlich zu sein, habe ich keine gute Idee, wie ich dem "armen" Praktikanten helfen kann. – almendar

+0

Etwas, das Sie in Betracht ziehen können, ist, Ihrem Akteur einen Stapel Eigenschaften hinzuzufügen, mit einigen periodischen Metriken, z. Anzahl der verarbeiteten Nachrichten und verbrachte Zeit im Empfangsblock. Dann sammle sie und stelle sie der Analyse aus. – almendar