Im Artikel Gewusst wie! "Optimierung der Asynchronen Prozesse" hatte ich schon mal erläutert, dass man die asynchrone Prozess-Queue selbst auf seine Bedürfnisse anpassen kann. Mit diesem Artikel möchte ich gerne eine Erkenntnis teilen, welche die Performace innerhalb eines Management Server Clusters für die Publizierung steigern kann. Zusätzlich erläutere ich noch wie man zeitgleich dies für bestimmte Projekte individuell einstellen kann.
Wir haben bei uns über unser Monitoring für eine sehr lange Zeit beobachtetet, dass einzelne Nodes während der nächtlichen Publizierung immer mehr Last hatten als andere:
Wir haben uns dann immer gefragt, warum das so ist. Dazu haben wir uns ebenfalls angeschaut, welche Publizierungsaufträge auf welchem Knoten innerhalb des Clustern verarbeitet werden.
Man muss wissen, dass die Verteilung der Publizierungsaufträge in der Queue aktuell wie folgt durchgeführt wird:
Nehmen wir mal folgendes Beispiel an:
Nun passiert folgendes:
Man kann sehr gut daran erkennen, dass von 4 Publizierungs-Knoten im Cluster gerade mal 3 was zu tun haben. Davon 2 leider dann sehr viel und einer macht nichts.
Der Management Server teilt also keine Aufträge nach bestimmten Regeln zu. Es wird das Prinzip "Wer zu erst fragt, bekommt die soviele Aufträge wie verarbeitet werden können". Das ist bei großen Systemen mit vielen Aufträgen ungeschickt. Hier wäre z.B. eine Verteilmechanik wie RoundRobin oder nach aktueller Auslastung besser.
Mit der Erkenntnis haben wir uns nun gefragt, wie könnte man das Verhalten so in den Griff bekommen, dass die Verteilung nahezu optimal wird. In diesem Moment kam mir mein alter Artikel Gewusst wie! "Optimierung der Asynchronen Prozesse" wieder in den Sinn.
Wir sind dann viel folgt vorgegangen:
Bei uns sieht die prozessserver.config nun wie folgt aus:
<?xml version="1.0" encoding="utf-8" ?> <Configuration> <!-- ProcessServer --> <ProcessServer> <!-- ProcessServer Worker --> <WorkerAssemblies> <!-- Worker SpikeWorker --> <Worker type="OpenText.WS.MS.ProcessServer.SupportInformation.SupportInformationWorker"> <Assemblies> <Assembly driver="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" /> <Assembly typecontains="1" driver="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" /> </Assemblies> </Worker> <!-- Worker RQLWorker --> <Worker type="OpenText.WS.MS.ProcessServer.Rql.RQLWorker"> <Assemblies> <Assembly name="OpenText.WS.MS.Server" typecontains="1" driver="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" /> </Assemblies> </Worker> </WorkerAssemblies> <!-- ProcessManagers Settings --> <ProcessManagers> <ProcessManager name="Default Manager" threads="10" priority="3" default="1"> <Processes> <Process name="OpenText.WS.MS" /> </Processes> </ProcessManager> <ProcessManager name="Instant Manager" threads="100" priority="2"> <Processes> <Process name="OpenText.WS.MS.PageCache.Directory.Delete" /> <Process name="OpenText.WS.MS.PageCache.Update" /> <Process name="OpenText.WS.MS.ImageCache.Update" /> <Process name="OpenText.WS.MS.Page.Saveversion" /> </Processes> </ProcessManager> <ProcessManager name="Asynchronous Queue" threads="10" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing" /> <Process name="OpenText.WS.MS.Publishing.Queue" /> <Process name="OpenText.WS.MS.Task" /> <Process name="OpenText.WS.MS.Application.Start" /> <Process name="OpenText.WS.MS.Escalation" /> <Process name="OpenText.WS.MS.Page.Forwarding" /> <Process name="OpenText.WS.MS.Search" /> <Process name="OpenText.WS.MS.Validate" /> <Process name="OpenText.WS.MS.ExportSettings.Copy" /> <Process name="OpenText.WS.MS.Pages.Delete" /> <Process name="OpenText.WS.MS.WebCompliance.Validate" /> </Processes> </ProcessManager> <ProcessManager name="Publishing Supporter" threads="20" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing.Transfer" /> <Process name="OpenText.WS.MS.Cleaner.Ftp" /> </Processes> </ProcessManager> <ProcessManager name="Live Server Cleaning" threads="5" priority="3"> <Processes> <Process name="OpenText.WS.MS.Cleaner" /> </Processes> </ProcessManager> <ProcessManager name="Translation processes" threads="5" priority="3"> <Processes> <Process name="OpenText.WS.MS.Translation" /> </Processes> </ProcessManager> <ProcessManager name="Asset Manager processes" threads="3" priority="3"> <Processes> <Process name="OpenText.WS.MS.Media.UpdateMetadata" /> </Processes> </ProcessManager> <ProcessManager name="Asset Manager Folder Updates" threads="1" priority="3"> <Processes> <Process name="OpenText.WS.MS.Media.Folder.Update" /> </Processes> </ProcessManager> <ProcessManager name="AskVodafone: Asynchronous Queue > Publishing + Publishing Queue" threads="5" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing.8C681C01ECE44FC8B1FB45C4A7760501" /> <Process name="OpenText.WS.MS.Publishing.Queue.8C681C01ECE44FC8B1FB45C4A7760501" /> </Processes> </ProcessManager> <ProcessManager name="AskVodafone: Publishing Supporter > Transfer" threads="10" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing.Transfer.8C681C01ECE44FC8B1FB45C4A7760501" /> </Processes> </ProcessManager> <ProcessManager name="AskVodafone: Publishing Supporter > Cleaner FTP" threads="10" priority="3"> <Processes> <Process name="OpenText.WS.MS.Cleaner.Ftp.8C681C01ECE44FC8B1FB45C4A7760501" /> </Processes> </ProcessManager> <ProcessManager name="Vodafone Internet: Asynchronous Queue > Publishing + Publishing Queue" threads="5" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing.072D6659A806425BACA8D29F37FD6E7D" /> <Process name="OpenText.WS.MS.Publishing.Queue.072D6659A806425BACA8D29F37FD6E7D" /> </Processes> </ProcessManager> <ProcessManager name="Vodafone Internet: Publishing Supporter > Transfer" threads="10" priority="3"> <Processes> <Process name="OpenText.WS.MS.Publishing.Transfer.072D6659A806425BACA8D29F37FD6E7D" /> </Processes> </ProcessManager> <ProcessManager name="Vodafone Internet: Publishing Supporter > Cleaner FTP" threads="10" priority="3"> <Processes> <Process name="OpenText.WS.MS.Cleaner.Ftp.072D6659A806425BACA8D29F37FD6E7D" /> </Processes> </ProcessManager> </ProcessManagers> </ProcessServer> </Configuration>
Wie man dies macht, steht im Artikel Gewusst wie! "Optimierung der Asynchronen Prozesse" und auch in der Online-Hilfe genau beschrieben.
Direkt nach der Umstellung konnte man den positiven Effekt bereits sehen:
Die Verteilung der Publizierung wurde durch die o.g. Umstellung der Queue viel gleichmäßiger vorgenommen. Es ist zwar immer noch nicht perfekt, jedoch der Effekt wurde sogar bei unserern Anwendern bemerkt. Wir hatten, ohne aktives Nachfragen, folgende Rückmeldungen bzw. Rückfragen bekommen:
Wir waren selbst überrascht, dass man diese Änderungen so extrem positiv sogar bei den Anwendern bemerkt. Aber auch als Systemadministrator sieht man direkt den positiven Effekt.
Die Systeme werden weniger belastet, es wird besser verteilt und alle Knoten haben annähernd gleich viel zu tun.
Die OotB-Einstellungen sind gut, aber nicht für jede Umgebung optimal. Doch dafür bietet der Management Server eine sehr flexible Möglichkeit, um das Systemverhalten für die Anforderungen entsprechend zu verändern. Dies bedeutet aber auch, dass man sein System (Cluster) beobachtet, kennt und so ein Verhalten darüber erkennt.
Wir sind derzeit mit der neuen Konfiguration der ProzessServerQueues sehr zufrieden und auch die Anwender haben dies sehr positiv bemerkt.
Jedoch würde ich mir auch wünschen, dass mit der Zeit die aktuelle Implementierung durch eine bessere Methode ersetzt wird, wie z.B. RoundRobin.
Jetzt viel Spaß bei der Systemoptimierung ;)
... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.
Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.