Das Große Skype for Business Erinnerungsgeheimnis

Dieser Artikel wurde von Kenn Guilstorf, Skype for Business Eskalationstechniker geschrieben.

Als Eskalationstechniker behilfee ich Kunden bei einigen der "persnickety" Skype for Business Problemen. In letzter Zeit habe ich einige Fälle erhalten, die "leistungsbasiert" sind – im Grunde genommen beschwerden, dass Skype for Business langsam oder träge ist, keine Anwendungsfreigabe zulässt oder einfach zu viel Arbeitsspeicher verwendet. Häufig zeigt eine Untersuchung dieser Fälle, dass der Benutzer Skype for Business wochenlang laufen lassen hat, und im Laufe der Zeit hat sich der Speicher so lange hochgeschlichen, bis er sich auf die Leistung auswirkt. Ich habe es sogar selbst bemerkt, als ich Skype für eine lange Zeit laufen ließ. Also, was macht Skype, und warum hat es so viel Arbeitsspeicher? (Hier ist ein kleiner Hinweis: Dies ist normal und beabsichtigt. Nichts ist falsch – jedes native Programm läuft darauf hin.)

Wie viel Arbeitsspeicher kann es durch kauen?

Der erste Schritt zum Beheben eines Problems besteht darin, das Problem zu verstehen, und der erste Schritt zum Verstehen eines Problems besteht darin, es zu definieren. Das ist nicht so einfach, wie es klingt.

Wenn Skype for Business (SfB) zum ersten Mal gestartet wird, ist die Speicherauslastung vergleichbar gering (wenn Sie 100 MB als klein zählen können). Dies ist in einer beliebigen Anzahl von Tools wie dem Task-Manager zu sehen:

Screenshot: Lync-App-Detail im Task-Manager-Fenster mit den Arbeitsspeicherwerten 83.428K

Abbildung 1: Lassen Sie sich nicht täuschen: Lync.exe ist der Prozessname für SfB (32-Bit-Version)

Im Laufe der Zeit wird die Menge an Arbeitsspeicher, die der Prozess verwendet, zunehmen. Wie groß es wird, hängt davon ab, wie viel Skype verwendet wird, wofür es verwendet wird usw. Hier sehen Sie beispielsweise denselben Client nach etwa 24 Stunden:

Screenshot: Lync-App-Details im Task-Manager-Fenster mit 115.196.000 Arbeitsspeicher

Abbildung 2: Dieselbe SfB 24 Stunden später

Skype hat also etwa 32 MB in 24 Stunden verbraucht. Das ist nicht viel, oder? Es ist wirklich nicht – bis ich erkläre, dass Skype für all diese 24 Stunden nur im Leerlauf war. Im Grunde habe ich Skype for Business auf einem Computer gestartet, ihn gesperrt und etwa 24 Stunden gewartet, bevor ich es entsperrte. In der Nutzung wäre die Maut viel höher gewesen – insbesondere, wenn ich an Besprechungen teilnahm, App-Freigabe oder Desktopfreigabe in diesen Besprechungen verwendet, Chatnachrichten verwendet usw. Ich habe Fälle gesehen, in denen Skype for Business Speicherauslastung an einem einzigen Tag auf 300 bis 500 MB angewachsen ist. Die Dinge können nach einer oder mehreren Wochen nutzungsintensiver werden – insbesondere auf dem 32-Bit-Client mit viel mehr Arbeitsspeicherbeschränkung.

Speicher anzeigen

Es gibt viele Tools, mit denen ein Profil für den Arbeitsspeicher erstellt werden kann. Eines der beliebtesten – zumindest bei Microsoft – ist das SysInternals-Tool VMMap, das unter VMMap v3.26 verfügbar ist. Wir können es verwenden, um den Prozessspeicher zu betrachten und zu sehen, ob wir ein Profil für den Skype for Business Speicher erstellen können.

Nachdem Sie VMMap heruntergeladen haben, führen Sie sie aus. Beim Start wird eine Prozessliste geöffnet, sodass Sie den Prozess auswählen können, den Sie untersuchen möchten. Ich wähle lync.exe aus und klicke auf OK.

Screenshot: VM-Karte beim Start mit ausgewählter Lync-Option

Abbildung 3: VMMap beim Start

Als Nächstes wird eine Grafik angezeigt, die eine mehrfarbige Darstellung des aktuellen Speicherprofils für die ausgewählte ausführbare Datei darstellt – in diesem Fall Lync.exe.

Screenshot, der die mehrfarbige Darstellung des Speicherprofils zeigt.

Abbildung 4: Starten der VMMap für kürzlich gestartete Lync.exe

Es gibt viele Informationen hier, und die Beschreibung, dass alles würde einen oder mehrere Eigene Blogbeiträge füllen. Wenn Sie interessiert sind, gibt es mehrere großartige Bücher und Onlineartikel, die ihnen helfen können, dies zu erklären. (Persönlich empfehle ich "Advanced Windows" von Jeffrey Richter – derzeit nicht gedruckt, aber immer noch hervorragend in der Erklärung, wie arbeitsspeicher funktioniert. Sie finden gebrauchte Kopien davon in Ihrem Lieblingsbuchladen.)

Wie Sie sehen können, entspricht der im Task-Manager angezeigte Arbeitsspeicher keiner Kategorie in VMMap. Task-Manager ist eine allgemeinere Darstellung. es ist genau, es zählt einfach nicht alles. VMMap ist viel umfassender.

Hier sehen Sie unsere Skype-instance nach der 24-stündigen Wartezeit:

Screenshot: Vm-Karte für Skype nach 24 Stunden

Abbildung 5: VMMap für Skype nach 24 Stunden

Wo ist der Speicher?

Wenn Sie jede einzelne Kategorie vergleichen, wird nichts wirklich ins Leere geordnet. Das Ermitteln, was den Arbeitsspeicher verbraucht, ist schwierig, da die Speicherkategorien schwanken, wenn Objekte und Speicheranforderungen gesendet und freigegeben werden, und der Arbeitsspeicher zum Speichern verschiedener Objekte reserviert und committet wird. Der "Kernel des Wissens" (für die Zwecke dieses Blogs sowieso) ist die Kategorie "Free". In unserem Beispiel ist "freier" Arbeitsspeicher der gesamte verfügbare Speicherplatz, der für die ausführbare Lync-Datei "reserviert" ist. Im Task-Manager wird jedoch nur ein bestimmter Typ von "committetem" Arbeitsspeicher angezeigt. Der reservierte Arbeitsspeicher wird nicht gezählt, da er nicht verwendet wird.

Also, wo ist die Erinnerung? Dies wird schwierig zu bestimmen, da der Speicher nicht verloren geht. Entgegen der weit verbreiteten Meinung wurde das Skype-Team nicht von Desktopspeicherherstellern subventioniert. Es gibt keinen böswilligen Plot, um Kunden dazu zu bringen, Systeme oder Arbeitsspeicher zu aktualisieren. Dies ist nicht einmal ein Fall von geplanter Obsoleszenz. Die Wahrheit ist etwas schwieriger zu erklären.

Lassen Sie uns ein wenig zurückverfolgen, um die Dinge klarer zu machen. Wenn Sie den Skype for Business-Client zum ersten Mal starten, weist er einen relativ geringen Speicherbedarf auf – in der Regel 100 MB oder so, abhängig von der Anzahl der Kontakte, die er für Sie nachverfolgt, und anderen Mehraufwand (dies ist in den obigen Daten deutlich zu sehen). Nach einigen Tagen werden Sie feststellen, dass dieser Speicherbedarf mehrere hunderttausend Bytes auf mehrere Megabyte anwächst. In bestimmten Situationen kann dies ein Problem sein – aber es ist nicht unbedingt ein Problem in Skype for Business selbst. Vielmehr handelt es sich um einen Effekt des Windows-Programmierparadigmas und der nativen Verarbeitung des Arbeitsspeichers.

Was ist die Windows-Programmierung?

Ich werde hier nur eine einfache Ansicht des Windows-Speichers geben. Windows-Arbeitsspeicher wird durch teure (in Bezug auf Computerzyklen und Ressourcen) Prozeduren verarbeitet, die als Zuordnungen und Aufhebungen von Zuordnungen bezeichnet werden. Wenn ein Programm Arbeitsspeicher benötigt, fordert es Windows auf, ihn zuzuweisen. Wenn es mit dem Speicher durch ist, fordert das Programm Windows auf, die Zuordnung aufzugeben. Intern durchläuft Windows mehrere Prozesse, um die Speicheranforderungen zu verwalten.

Wenn eine Anforderung gestellt wird, überprüft Windows den Arbeitsspeicher, der bereits für den Prozess committet wurde, der Prozess jedoch nicht verwendet. Windows prüft, ob ein ausreichend großer Speicherblock vorhanden ist. Wenn es dies gibt, nutzt das System es und geht auf seinen fröhlichen Weg. Wenn dies nicht der Fall ist, wird der reservierte Arbeitsspeicher überprüft. Wenn ein ausreichend großer Speicherblock vorhanden ist, wird dieser committet (in vom Betriebssystem definierten Blöcken, die als "Seiten" bezeichnet werden) und die Variable darin gespeichert. Der Arbeitsspeicher wird jetzt committet, und wir haben gerade den Speicherbedarf der ausführbaren Datei vergrößert.

Was geschieht, wenn nicht genügend reservierter Arbeitsspeicher für die Verarbeitung der Anforderung vorhanden ist? Das Betriebssystem versucht, mehr Arbeitsspeicher zu reservieren – wenn dies möglich ist. Hier kommt der Unterschied zwischen der 32-Bit-Architektur und der 64-Bit-Architektur ins Spiel. Ein 32-Bit-Prozess kann nur maximal 4 GB Arbeitsspeicher verwenden. Dies liegt daran, dass 4 GB die maximale Menge ist, die ein 32-Bit-Register adressieren kann. (Ein Bit kann nur eine 1 oder eine 0 - Binärdatei enthalten. Daher bedeutet 32 Bits, dass 232 die höchste zulässige Adresse ist. Dank der 32-Bit-Architektur werden nur etwa 2 GB dieses Arbeitsspeichers dem Prozess selbst zugewiesen, der Rest wird vom Betriebssystem verwendet, um allgemeine DLLs zu zuordnen, sich um gängige Kernelmodusobjekte zu kümmern usw. In einem 64-Bit-System können die 64-Bit-Register 264 verarbeiten, was sich als etwa 18 Exabyte herausstellt. Windows schränkt jedoch den verfügbaren Arbeitsspeicher je nach Windows-Version künstlich auf 2 Terabytes bis 4 Terabyte (TB) ein.

Nachdem der Arbeitsspeicher reserviert wurde, wird er committet und dann wie zuvor verwendet. Der Prozess der Aufhebung der Zuordnung ist weitgehend umgekehrt – mit Ausnahme von ein oder zwei kleinen, aber wichtigen Details.

Erstens", sofern nicht angefordert, "löscht" Windows niemals den Arbeitsspeicher. Wenn die Speicherbelegung aufgehoben wird, wird er in der Windows-Speicherzuordnung als frei gekennzeichnet. Was auch immer es gehalten hat, ist immer noch vorhanden und bleibt dort, bis es durch eine andere Zuordnung überschrieben wird. Als Nächstes wird der Arbeitsspeicher von Windows nur selten dekompromittiert, es sei denn, dies wird dazu angefordert. Wie bereits erwähnt, sind Speichervorgänge ziemlich ressourcenintensiv. Wenn also ein Programm den zuvor zugewiesenen Arbeitsspeicher benötigt, geht Windows davon aus, dass es diesen Speicher möglicherweise erneut benötigt und das Committen des Speichers abhält, bis es unbedingt erforderlich ist. Schließlich "sammele Windows" niemals Arbeitsspeicher. Dies bedeutet, dass Arbeitsspeicher, den Windows freigibt, nie "aggregiert" wird und Blöcke mit freiem Speicher nie "zusammen verschoben" werden, um größere Blöcke mit freiem Speicher zu erstellen. (Alle diese Funktionen werden in einer Kategorie zusammengefasst, die als "Garbage Collection" bezeichnet wird. .NET Framework verfügt bekannte weise über einige Garbage Collection-Features. Skype for Business ist jedoch eine "native" oder non-.NET Anwendung.)

Skype for Business verarbeitet jede Sekunde viele Objekte, deren Größe variabel ist. Es muss dies tun, um das atemberaubende Werkzeug zu sein, das wir wollen. Wir bitten sie, Kontakte zu verwalten, Kalender (Besprechungen) zu verwalten, mit Freunden, Verwandten und Kollegen zu chatten und sogar mit ihnen zu sprechen, indem sie sowohl Sprach- als auch Videofunktionen verwenden, Desktops oder Fenster freigeben usw. Nun, um unter anderem den verstorbenen, großen Robert Heinlein zu zitieren: "Es gibt kein kostenloses Mittagessen."

Die Verwaltung so vieler Objekte mit solchen unterschiedlichen und häufig variablen Größen führt zu Zuordnungen und Aufhebungen von Speicherblöcken unterschiedlicher Größe. Im Laufe der Zeit führt dies zu einer manchmal schwerwiegenden Speicherfragmentierung, die den Speicherbedarf von Skype for Business erhöht.

Ein Beispiel könnte diesen Punkt besser veranschaulichen. Angenommen, Skype (oder wirklich ein beliebiges natives Programm) weist 64 Objekte zu, nummeriert 1 bis 64, die jeweils 4.000 Bytes sind:

Screenshot: Skype 64-Objekte

Abbildung 6: 64 Objekte mit jeweils 4 KB Arbeitsspeicher

Dies führt zu einer Speicherbelegung und -verpflichtung von 256 KB. Nehmen wir nun an, dass das Programm die geraden Objekte nicht benötigt, sodass sie freigegeben werden:

Screenshot, der alle freigegebenen Objekte mit gerader Nummer zeigt.

Abbildung 7: Durch das Freigeben aller geraden Objekte werden 128 KB Arbeitsspeicher freigegeben!

Wenn Sie sich das gesamte Bild des Arbeitsspeichers ansehen (mithilfe von VMMap oder einem ähnlichen Tool), werden Sie sehen, dass eine der committeten Spalten (wahrscheinlich im Heap-Abschnitt , aber davon abhängt, wie das Programm den Arbeitsspeicher angefordert hat) 128 KB weniger hat, und der Abschnitt Free wurde um 128 KB vergrößert. Im Task-Manager besitzt das Programm jetzt nur noch 128 KB Arbeitsspeicher.

Nehmen wir als Nächstes an, dass unser Programm über ein einzelnes 8-KB-Objekt verfügt, das es speichern muss. Dies sollte einfach sein. Immerhin hat es 128 KB kostenlos. Wenn Sie jedoch versuchen, dieses 8-KB-Objekt zu speichern, wird eine neue Speicherreservierung erstellt, anstatt den Speicher im 128-KB-Freien Speicherplatz zu speichern. Dies liegt daran, dass sie, wenn Sie sich den Speicher ansehen, immer noch in 4-KB-Blöcke segmentiert sind! Windows verfügt nicht über einen ausreichend großen Speicherblock, um das 8-KB-Objekt aufzunehmen, daher muss es mehr Arbeitsspeicher reservieren und an das Programm committen.

Dies ist ein ziemlich erfundenes Beispiel, aber es veranschaulicht die Schwierigkeit der Speicherverwaltung von Skype. Skype verwaltet eine große Anzahl von Objekten, die keine leicht definierbare Größe haben. Diese Objekte sind alle variabel lang. Dies bedeutet, dass beim Speichern und Freigeben von Objekten – insbesondere über einen längeren Zeitraum wie Tage oder Wochen – die Speicherfragmentierung schwerwiegend werden kann, und da Windows mehr Arbeitsspeicher für die Speicherung der neuen Objekte zuweisen muss, nimmt der Speicherbedarf übermäßig zu.

Wenn dies Probleme im 32-Bit-Client verursacht, wird häufig empfohlen, zum 64-Bit-Client zu wechseln, da der Arbeitsspeicher dort dank der 64-Bit- gegenüber der 32-Bit-Architektur weit weniger eingeschränkt ist. Ein übermäßiges Speicherwachstum kann jedoch unter anderem auch im 64-Bit-Client zu Trägheit führen. Zu diesen anderen Überlegungen gehören der gesamter Systemarbeitsspeicher, die Datenträgergeschwindigkeiten (da der Programmarbeitsspeicher in der Regel durch virtuellen Arbeitsspeicher in der Windows-Auslagerungsdatei unterstützt wird), wie viele andere Anwendungen geöffnet sind usw. In beiden Fällen wird die Leistung der Skype for Business Speicherbedarfs mit der Zeit schlechter. Im Fall des 32-Bit-Clients kann dies dazu führen, dass die von Skype benötigten größeren Objekte – z. B. der interne Puffer für die Anwendungsfreigabe – nicht mehr verfügbar sind und zu Fehlern führen.

Um fair zu sein, ist Speicher nur eine Ressource, die im Laufe der Zeit verbraucht wird – aber es ist die offensichtlichste. Die Verarbeitungsauslastung kann zunehmen, Threads nehmen im Laufe der Zeit zu, der Auslagerungspoolspeicher nimmt zu und so weiter. Jede dieser Erhöhungen kann Auswirkungen auf den Prozess und in bestimmten Fällen auf das gesamte Betriebssystem haben. Dies ist einer der unzähligen Gründe, warum wir – auch für den 64-Bit-Client – vorschlagen, Skype täglich (oder zumindest wöchentlich) als bewährte Methode zu beenden und neu zu starten.

Wie kann ich den Neustart von Skype erzwingen?

Es gibt mehrere Möglichkeiten, einen Skype-Neustart zu erzwingen, aber es gibt keinen einzigen, besten Weg. Eine Möglichkeit ist natürlich die Schulung von Benutzern. Benutzer sind in den meisten Fällen die Schiedsrichter ihrer Desktopnutzung, daher ist es pragmatisch, ihnen beizubringen, sich abzumelden und Skype zu schließen, wenn sie den Tag verlassen. Dies kann auch als obligatorischer Schritt erfolgen, indem sie ein benutzerdefiniertes Skript oder eine ausführbare Datei schreiben und dann eines als Taskplanertask ausführen. Dieser Ansatz ist etwas abgeschwächt und kann dazu führen, dass Skype auch dann in Einem Zyklus läuft, wenn es "in Gebrauch" ist (obwohl dies durch Aufgabenplanungsbedingungen etwas abgeschwächt werden kann). Es gibt auch Möglichkeiten von Drittanbietern für die Desktop- und Computerverwaltung, potenzielle BIOS-Optionen usw.

Unter dem Strich ist es für Skype for Business am besten, es täglich oder zumindest wöchentlich zu radeln. Wenn Sie Ihre Benutzer trainieren können, Skype for Business regelmäßig zu recyceln – oder zumindest, wenn die Dinge seltsam werden –, werden Sie wahrscheinlich viel weniger Helpdeskanrufe und viel mehr zufriedene Benutzer haben.