Hallo,
ich bin dabei unsere Arbeitsabläufe etwas zu optimieren, damit sie etwas schneller laufen.
Unsere Arbeitsabläufe bestehen aus mehreren Schritten. An den Schritten hängen Scripte. In den Scripten werden Methoden aus einem eigenen geschriebenem Modul aufgerufen (da die Methoden in unterschiedlichen Scripten in unterschiedlichen Projekten verwendet werden).
Zu dem Arbeitsablauf (siehe scree_arbeitsablauf.png) auf denen ich mich im folgenenden beziehe:
Dieser wird auf einer Datenquelle ausgeführt und besteht aus 4 Schritten:
- Überprüfung der Eingaben
- Archivierung des bisher verlinkten Mediums (bisheriges Medium wird in ein anderen Medienordner kopiert)
- Änderung der Daten (bisheriges medium wird mit dem neu angegebenen Medium überschrieben, an dem Datensatz werden noch Daten gesetzt (Datum) und der Datensatz freigegeben)
- Änderung wird in einer speziellen Tabelle eingetragen
Um zu analysieren, wo Zeit „verbraten“ wird, habe ich einige Logausgaben eingefügt (was wird wann gestartet usw.).
Da die Logausgaben aller Schritte am Ende des Arbeitsablauf per Mail mir zugesandt werden, schreibe ich die Ausgaben in die Session (entsprechende Methode befinden sich ebenfalls in dem eigenen Modul):
...
((WorkflowScriptContext) this.projectContext).getSession().put(this.idetWfLog, this.logSB.toString());
HashMap<Object, Object> wfMap = (HashMap<Object, Object>) ((WorkflowScriptContext) this.projectContext).getSession();
...
Am Anfang eines Schrittes hole ich mir die bisherigen Ausgaben (falls vorhanden)
…
HashMap<Object, Object> wfMap = (HashMap<Object, Object>) ((WorkflowScriptContext) context).getSession();
try {
if (wfMap.get(this.idetWfLog) != null) {
this.logSB.append(wfMap.get(this.idetWfLog));
}
…
(lobSB ist ein StrinngBuffer)
Durch dieses Loggen habe ich herausbekommen, dass die Statusübergänge zwischen den einzelnen Schritten manchmal über 4 Sekunden (siehe Log2.txt – zwischen Archierung und ändern) dauern und manchmal deutlich unter einer Sekunde (siehe Log1). Die Logmenge, die dabei geschrieben wird, ist eigentlich jedes Mal die gleiche, also sollte es nicht wirklich daran liegen, dass die Loginformationen in die Session geschrieben werden.
Auch wird manchmal viel Zeit beim kopieren von Medien gebraucht und manchmal nicht.
An der Auslastung des Systems kann es nicht liegen. Arbeitsspeicher steht genug zur Verfügung und die CPU-Last ist nicht der rede wert.
Ich habe ehrlich gesagt, keine Ahnung, an was das liegen könnte, dass die Arbeitsabläufe manchmal schnell und manchmal ewig brauchen.
Auch wenn mir bewusst ist, dass eine Analyse von fernen schwer möglich ist:
- An was könnte es liegen, dass die Statusübergänge manchmal flutschen (manchmal alle zusammen unter einer Sekunde) und manchmal ewig (bis zu 10, machmal sogar über 10 Sekunden) brauchen? Wird irgendetwas automatisch angestoßen, wenn in einem Arbeitsablauf ein Statusübergang erfolgt?
- Gibt es Tipps, was man beim arbeiten im MediaStore tun oder lassen sollte? Gibt es eine Anzahl von Medien in einem Ordner, ab dem es unperfomant wird, wenn man über die Api zugreift und dann Aktionen ausführt (neuanlegen, löschen, Inhalt aktualisieren)?
- Muss etwas in der Session nach einem Arbeitsablauf aufgeräumt werden?
- Könnte es auch am Client liegen?
Für Hinweise bin ich sehr dankbar.
Grüße
Andreas
Achja: FS4.1R3 bei ausschließlicher Verwendung des SiteArchitect.