The Great Skype for Business Memory Mystery

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

Als Eskalationstechniker assistiere ich Kunden bei einigen der "persnickety" Skype for Business Probleme. In letzter Zeit habe ich einige Fälle erhalten, die "leistungsbasiert" sind – im Wesentlichen Beschwerden, dass Skype for Business langsam oder träge ist, keine Anwendungsfreigabe zulässt oder einfach zu viel Arbeitsspeicher verwendet. Eine Untersuchung dieser Fälle zeigt häufig, dass der Benutzer Skype for Business wochenlang laufen lassen hat, und im Laufe der Zeit hat sich der Speicher eingeschlichen, bis er sich auf die Leistung auswirkt. Ich habe es sogar selbst bemerkt, wenn ich Skype für eine lange Zeit laufen lassen. Was macht Skype, und warum hält es so viel Arbeitsspeicher? (Hier ist ein kleiner Hinweis: Dies ist normal und beabsichtigt. Nichts ist falsch – jedes systemeigene Programm läuft darauf ein.)

Wie viel Arbeitsspeicher kann es durchkauen?

Der erste Schritt zum Beheben eines Problems besteht darin, das Problem zu verstehen, und der erste Schritt, um jedes Problem zu verstehen, besteht darin, es zu definieren. Dies ist nicht so einfach zu machen, wie es sich anhört.

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

Screenshot, der das Detail der Lync-App im Task-Manager-Fenster mit den Speicherwerten 83.428K zeigt.

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

Im Laufe der Zeit wird der speicherbedarf des Prozesses zunehmen. Wie groß es wächst, 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, der zeigt, dass das Lync-App-Detail im Task-Manager-Fenster mit einer Speichererweiterung von 115.196 KB angezeigt wird.

Abbildung 2: Die gleiche SfB 24 Stunden später

Skype hat also in 24 Stunden ca. 32 MB verbraucht. Das ist nicht viel, oder? Es ist wirklich nicht – bis ich erkläre, dass Skype nur im Leerlauf für all diese 24 Stunden saß. Grundsätzlich habe ich Skype for Business auf einem Computer gestartet, gesperrt und etwa 24 Stunden gewartet, bevor ich ihn entsperrt habe. Im Einsatz wäre die Maut viel höher gewesen – insbesondere, wenn ich an Besprechungen teilnutze, in diesen Besprechungen App-Freigaben oder Desktopfreigaben verwendet, Chatnachrichten verwendet habe usw. Ich habe Fälle gesehen, in denen Skype for Business Speichernutzung an einem einzigen Tag auf 300-500 MB gestiegen ist. Die Dinge können nach einer oder mehreren Wochen nutzungsintensiv werden – insbesondere auf dem viel mehr arbeitsspeicherbeschränkten 32-Bit-Client.

Anzeigen des Speichers

Es gibt viele Tools, die Speicher profilieren können. Eine der beliebtesten – zumindest bei Microsoft – ist das SysInternals-Tool VMMap, verfügbar unter VMMap v3.26. Wir können ihn verwenden, um den Prozessspeicher zu betrachten und zu sehen, ob wir den Skype for Business Speicher profilieren können.

Nachdem Sie VMMap heruntergeladen haben, führen Sie es aus. Zu Beginn 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 der V m-Karte am Anfang, wobei Lync ausgewählt ist.

Abbildung 3: VMMap am Startbildschirm

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 mehrfarbigen Darstellung des Speicherprofils.

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

Es gibt hier viele Informationen, und die Beschreibung 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 – zurzeit nicht ausgedruckt, aber immer noch hervorragend in der Erläuterung der Funktionsweise des Speichers. Sie finden gebrauchte Kopien davon in Ihrem bevorzugten Buchladen.)

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

Hier ist unsere Skype-Instanz nach der 24-stündigen Wartezeit:

Screenshot der V m-Karte für Skype nach 24 Stunden.

Abbildung 5: VMMap für Skype nach 24 Stunden

Wo befindet sich der Speicher?

Wenn Sie jede einzelne Kategorie vergleichen, wird nichts richtig aufgeschlüsselt. Tatsächlich ist es schwierig zu finden, was den Speicher beansprucht, da die Kategorien des Arbeitsspeichers schwanken, wenn Objekte und Speicheranforderungen vorgenommen und freigegeben werden, und speicher wird reserviert und zum Speichern verschiedener Objekte zugesichert. Der "Kernel des Wissens" (für die Zwecke dieses Blogs, sowieso) ist die Kategorie "Kostenlos". In unserem Beispiel ist "freier" Speicher der gesamte verfügbare Speicherplatz, der für die ausführbare Datei von Lync "reserviert" ist. Im Task-Manager wird jedoch nur eine bestimmte Art von "zugesicherten" Speicher angezeigt. Der reservierte Speicher wird nicht gezählt, da er nicht verwendet wird.

Wo befindet sich also der Speicher? Dies wird schwierig zu erkennen, da der Speicher nicht verloren geht. Entgegen der allgemeinen Meinung wurde das Skype-Team nicht von Desktopspeicherherstellern subventioniert. Es gibt keine schändliche Darstellung, 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 etwas zurückverfolgen, um die Dinge klarer zu machen. Wenn Sie den Skype for Business Client zum ersten Mal starten, hat er einen relativ geringen Speicherbedarf – in der Regel 100 MB oder so, abhängig von der Anzahl der Kontakte, die für Sie nachverfolgt werden, und anderem Aufwand (dies können Sie in den obigen Daten deutlich sehen). Nach ein paar Tagen werden Sie feststellen, dass dieser Speicherbedarf mehrere hunderttausend Bytes auf mehrere Megabyte wächst. In bestimmten Situationen kann dies ein Problem sein – aber es ist nicht unbedingt ein Problem in Skype for Business selbst. Vielmehr ist es ein Effekt des Windows-Programmierparadigms und seiner systemeigenen Behandlung des Arbeitsspeichers.

Was programmiert Windows?

Ich werde hier nur eine vereinfachte Ansicht des Windows-Speichers geben. Windows-Speicher wird durch teure Verfahren (im Hinblick auf Computerzyklen und Ressourcen) verarbeitet, die als Zuordnungen und Dezuweisungen bezeichnet werden. Wenn ein Programm Arbeitsspeicher benötigt, fordert es Windows auf, es zuzuordnen. Wenn der Speicher durch ist, fordert das Programm Windows auf, die Zuweisung aufzuheben. Intern durchläuft Windows mehrere Prozesse zum Verwalten der Speicheranforderungen.

Wenn eine Anforderung gestellt wird, überprüft Windows den Speicher, den es bereits für den Prozess zugesichert hat, aber nicht verwendet. Windows prüft, ob ein ausreichend großer Speicherblock zur Verwendung vorhanden ist. Wenn ja, nutzt das System es und geht seinen fröhlichen Weg. Andernfalls wird reservierter Speicher überprüft. Wenn ein ausreichend großer Block reservierten Speicher vorhanden ist, wird ein Commit ausgeführt (in vom Betriebssystem definierten Blöcken, die als "Seiten" bezeichnet werden), und die Variable darin gespeichert. Der Speicher wird jetzt zugesichert, und wir haben gerade den Speicherbedarf der ausführbaren Datei vergrößert.

Was geschieht, wenn nicht genügend reservierter Speicher für die Verarbeitung der Anforderung vorhanden ist? Das Betriebssystem versucht, mehr Arbeitsspeicher zu reservieren – falls ja. Hier kommt der Unterschied zwischen 32-Bit-Architektur und 64-Bit-Architektur ins Spiel. Ein 32-Bit-Prozess kann nur maximal 4 GB Arbeitsspeicher nutzen. Dies liegt daran, dass 4 GB der maximale Betrag ist, den ein 32-Bit-Register adressiert. (A bit can only hold a 1 or a 0 – binary. Daher bedeutet 32 Bit, dass 232 die höchste zulässige Adresse ist. Dank der 32-Bit-Architektur werden nur etwa 2 GB dieses Speichers dem Prozess selbst zugewiesen, der Rest wird vom Betriebssystem verwendet, um allgemeine DLLs zuzuordnen, sich um allgemeine Kernelmodusobjekte zu kümmern usw. In einem 64-Bit-System können die 64-Bit-Langen Register 264 verarbeiten, was sich als etwa 18 Exabytes herausstellt. Allerdings begrenzt Windows den verfügbaren Speicher je nach Windows-Version künstlich auf 2 Terabyte bis 4 Terabyte (TB).

Nachdem Speicher reserviert wurde, wird er zugesichert und dann wie zuvor verwendet. Der De-Allocation-Prozess ist im Wesentlichen umgekehrt - mit Ausnahme von ein oder zwei kleinen, aber wichtigen Details.

Erstens löscht Windows, sofern nicht angefordert, niemals Denkspeicher. Wenn die Speicherzuweisung aufgehoben wird, wird er in der Windows-Speicherzuordnung als frei gekennzeichnet. Was immer es hält, ist immer noch da und bleibt dort, bis es durch eine andere Zuordnung überschrieben wird. Als Nächstes wird der Speicher von Windows nur selten entfernt, wenn dies nicht angefordert wird. Wie bereits erwähnt, sind Speichervorgänge ziemlich ressourcenintensiv. Wenn also ein Programm den zuvor zugewiesenen Speicher benötigt hat, geht Windows davon aus, dass es diesen Speicher möglicherweise erneut benötigt, und hält die De-Commit-Übernahme des Speichers bis zu absoluter Notwendigkeit ab. Schließlich "vermensen" Windows niemals Denkspeicher. Dies bedeutet, dass der von Windows freigegebene Speicher nie "aggregiert" wird und Blöcke mit freiem Speicher niemals "zusammen verschoben" werden, um größere Blöcke freien Speichers zu bilden. (Alle diese Funktionen werden in eine Kategorie zusammengefasst, die als "Garbage Collection" bezeichnet wird. .NET Framework hat bekanntermaßen einige Funktionen für die Garbage Collection. Skype for Business ist jedoch eine "systemeigene" oder non-.NET Anwendung.)

Skype for Business verarbeitet jede Sekunde viele Objekte mit unterschiedlicher Größe. Es muss dies tun, um das beeindruckende Werkzeug zu sein, das wir wollen. Wir bitten sie, Kontakte zu verwalten, Kalender (Besprechungen) zu verwalten, chatten Sie mit unseren Freunden, Verwandten und Kollegen, und sprechen Sie sogar mit ihnen über Sprache und Video, Teilen von Desktops oder Fenstern usw. Nun, um den verstorbenen, großen Robert Heinlein zu zitieren, unter anderem: "Es gibt kein kostenloses Mittagessen."

Wenn Sie so viele Objekte mit solchen unterschiedlichen und oft variablen Größen verwalten, werden Zuordnungen und Dezuweisungen von Speicherabschnitten unterschiedlicher Größe erstellt. 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. Nehmen wir an, dass Skype (oder ein systemeigenes Programm) 64 Objekte mit einer Nummer von 1 bis 64 zuordnet, die jeweils 4 K Byte groß sind:

Screenshot der Skype 64-Objekte.

Abbildung 6: 64 Objekte mit jeweils 4 KB Arbeitsspeicher

Dies führt zu einer 256-KB-Speicherzuweisung und -verpflichtung. Gehen wir nun davon aus, dass das Programm die geraden Objekte nicht benötigt, sodass sie losgelassen werden:

Screenshot, der alle freigegebenen geraden Objekte zeigt.

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

Wenn Sie sich das größere Bild des Gesamtspeichers ansehen (mithilfe von VMMap oder einem ähnlichen Tool), sehen Sie, dass eine der zugesicherten Spalten (wahrscheinlich im Heap-Abschnitt , aber es hängt davon ab, wie das Programm den Speicher angefordert hat) weniger als 128 KB aufweist und der Abschnitt "Frei " um 128 KB gewachsen ist. Im Task-Manager besitzt das Programm jetzt nur noch 128 KB Arbeitsspeicher.

Als Nächstes wird davon ausgegangen, dass unser Programm über ein einzelnes 8-KB-Objekt verfügt, das gespeichert werden muss. Dies sollte einfach sein. Schließlich hat es 128 KB kostenlos. Wenn Sie jedoch versuchen, dieses 8-KB-Objekt zu speichern, wird eine neue Speicherreservierung erstellt, anstatt den Speicher im freien Speicherplatz von 128 KB zu speichern. Der Grund: Wenn Sie sich den Speicher ansehen, können Sie sehen, dass er immer noch in 4-KB-Blöcke segmentiert ist! Windows verfügt nicht über einen ausreichend großen Speicherblock, um das 8-KB-Objekt zu speichern, daher muss es mehr Speicher für das Programm reservieren und committen.

Dies ist ein eher konstruiertes Beispiel, aber es veranschaulicht die Schwierigkeit der Speicherverwaltung von Skype. Skype verwaltet eine große Anzahl von Objekten, die nicht über eine leicht definierbare Größe verfügen. Diese Objekte sind alle unterschiedlich lang. Dies bedeutet, dass beim Speichern und Freigeben von Objekten – insbesondere über einen längeren Zeitraum, z. B. Tage oder Wochen – die Speicherfragmentierung schwerwiegend werden kann, und da Windows mehr Speicher zum Speichern der neuen Objekte zuordnen muss, wächst der Speicherbedarf übermäßig.

Wenn dies Probleme im 32-Bit-Client verursacht, empfehlen wir häufig, zum 64-Bit-Client zu wechseln, da der Arbeitsspeicher dort dank der 64-Bit- und 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. Diese weiteren Überlegungen umfassen den gesamten Systemspeicher, Datenträgergeschwindigkeiten (da der Programmspeicher in der Regel durch virtuellen Speicher in der Windows-Auslagerungsdatei gesichert wird), wie viele andere Anwendungen geöffnet sind usw. In beiden Fällen, je Skype for Business Speicherbedarf im Laufe der Zeit wächst, desto schlimmer wird es ausgeführt. Im 32-Bit-Clientfall kann dies dazu führen, dass die größeren Objekte, die Skype benötigt – z. B. der interne Puffer für die Anwendungsfreigabe – nicht mehr verfügbar sind und Fehler verursachen.

Um fair zu sein, ist Speicher nur eine Ressource, die im Laufe der Zeit verbraucht wird – aber es ist die offensichtlichste. Die Handhabung der Nutzung kann größer werden, Threads werden im Laufe der Zeit zunehmen, der Arbeitsspeicher des Seitenpools wird zunehmen usw. Jede dieser Erhöhungen kann sich auf den Prozess und in bestimmten Fällen auf das gesamte Betriebssystem auswirken. Dies ist einer der unzähligen Gründe, warum wir – auch für den 64-Bit-Client – empfehlen, dass Benutzer Skype täglich (oder zumindest wöchentlich) als bewährte Methode beenden und neu starten.

Was tue ich dagegen, und kann ich erzwingen, dass Skype neu gestartet wird?

Es gibt mehrere Möglichkeiten, einen Skype-Neustart zu erzwingen, aber es gibt keinen einzigen, besten Weg. Eine Möglichkeit ist natürlich die Benutzerschulung. Benutzer sind in den meisten Fällen die Vermittler 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 Aufgabenplanungsaufgabe ausführen. Dieser Ansatz ist etwas zu kurz geschaltet und kann dazu führen, dass Skype auch dann kreist, wenn es "in Gebrauch" ist (obwohl dies durch Aufgabenplanungsbedingungen etwas abgemildert 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, sie täglich oder zumindest wöchentlich zu radeln. Wenn Sie Ihre Benutzer dazu schulen 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 glückliche Benutzer haben.