Udostępnij za pośrednictwem


Wielka tajemnica pamięci Skype dla firm

Ten artykuł został napisany przez Kenna Guilstorfa, inżyniera eskalacji Skype dla firm.

Jako inżynier eskalacji pomagam klientom w niektórych bardziej "persnickety" Skype dla firm problemów. Ostatnio otrzymałem sporo przypadków, które są "oparte na wydajności" - w zasadzie, skarg, że Skype dla firm jest powolny lub powolny, nie pozwoli na udostępnianie aplikacji, lub jest po prostu za dużo pamięci. Wiele razy badanie tych przypadków pokazuje, że użytkownik pozwolił Skype dla firm działać przez kilka tygodni, a z czasem pamięć wkradła się, dopóki nie wpłynie na wydajność. Zauważyłem to nawet sam, kiedy pozwoliłem Skype'owi działać przez długi czas. Więc, co robi Skype i dlaczego trzyma tyle pamięci? (Oto mała wskazówka: Jest to normalne i z założenia. Nic złego się nie dzieje — każdy natywny program działa w tym celu).

Ile pamięci może przeżuć?

Pierwszym krokiem do rozwiązania każdego problemu jest zrozumienie problemu, a pierwszym krokiem do zrozumienia każdego problemu jest jego zdefiniowanie. To nie jest tak łatwe do zrobienia, jak się wydaje.

Po pierwszym uruchomieniu Skype dla firm (SfB) użycie pamięci jest porównywalnie małe (jeśli można liczyć 100 MB jako małe). Widać to w dowolnej liczbie narzędzi, takich jak Menedżer zadań:

Zrzut ekranu przedstawiający szczegóły aplikacji Lync w oknie Menedżer zadań z wartościami pamięci 83 428 000.

Rysunek 1. Nie daj się zwieść: Lync.exe jest nazwą procesu dla SfB (wersja 32-bitowa)

Z biegiem czasu ilość pamięci używanej przez proces będzie rosnąć. To, jak duży rośnie, zależy od tego, ile skype jest używany, do czego jest używany itd. Oto przykład tego samego klienta po około 24 godzinach:

Zrzut ekranu przedstawiający szczegóły aplikacji Lync w oknie Menedżer zadań z pamięcią wzrasta do 115 196 000.

Rysunek 2. Ten sam SfB 24 godziny później

Dlatego skype zużywa około 32 MB w ciągu 24 godzin. To nie jest dużo, prawda? To naprawdę nie jest - dopóki nie wyjaśnię, że Skype po prostu siedział bezczynnie przez te wszystkie 24 godziny. Zasadniczo zacząłem Skype dla firm na komputerze, zablokowałem go i czekałem około 24 godzin przed odblokowaniem. W użyciu opłaty byłyby znacznie wyższe — zwłaszcza jeśli dołączyłem do spotkań, korzystałem z udostępniania aplikacji lub udostępniania aplikacji na tych spotkaniach, korzystałem z wiadomości błyskawicznych itd. Widziałem przypadki, w których użycie pamięci Skype dla firm wzrosło do 300–500 MB w ciągu jednego dnia. Rzeczy mogą stać się trudne po co najmniej jednym tygodniu użycia — szczególnie w przypadku znacznie bardziej ograniczonego pamięci klienta 32-bitowego.

Pokaż mi pamięć

Istnieje wiele narzędzi, które mogą profilować pamięć. Jednym z najbardziej popularnych — przynajmniej w firmie Microsoft — jest mapa maszyny wirtualnej narzędzia SysInternals dostępna w programie VMMap w wersji 3.26. Możemy go użyć do przyjrzenia się pamięci procesu i sprawdzenia, czy możemy profilować Skype dla firm pamięci.

Po pobraniu mapy maszyny wirtualnej uruchom ją. Po rozpoczęciu zostanie otwarta lista procesów, dzięki czemu można wybrać proces, który chcesz zbadać. Wybierzę lync.exe i kliknij przycisk OK.

Zrzut ekranu przedstawiający mapę V m na początku z wybraną pozycją Lync.

Rysunek 3. Mapa maszyny wirtualnej na początku

Następnie zobaczysz grafikę, która jest wielokolorową reprezentacją bieżącego profilu pamięci dla wybranego pliku wykonywalnego — w tym przypadku Lync.exe.

Zrzut ekranu przedstawiający wielokolorową reprezentację profilu pamięci.

Rysunek 4. Uruchamianie mapy maszyny wirtualnej dla ostatnio uruchomionych Lync.exe

Jest tu wiele informacji, a opisanie tego wszystkiego wypełni jeden lub więcej własnych wpisów w blogu. Jeśli cię to interesuje, istnieje kilka świetnych książek i artykułów online, które mogą pomóc to wyjaśnić. (Osobiście polecam "Advanced Windows" Jeffrey Richter - obecnie z wydruku, ale nadal doskonałe w objaśnieniu, jak działa pamięć. Używane kopie można znaleźć w ulubionym sklepie z książkami).

Jak widać, pamięć wyświetlana w Menedżerze zadań nie jest zgodna z żadną kategorią na mapie maszyny wirtualnej. Menedżer zadań jest bardziej uogólnioną reprezentacją; jest dokładna, po prostu nie liczy wszystkiego. VMMap jest znacznie bardziej kompleksowy.

Oto nasze wystąpienie skype'a po 24-godzinnym okresie oczekiwania:

Zrzut ekranu przedstawiający mapę V m dla programu Skype po 24 godzinach.

Rysunek 5. Mapa maszyny wirtualnej dla programu Skype po 24 godzinach

Gdzie jest pamięć?

Jeśli porównasz każdą kategorię, nic tak naprawdę nie ustawia się w kolejce. Faktycznie znalezienie tego, co zużywa pamięć, jest trudne do wykonania, ponieważ kategorie pamięci zmieniają się w miarę tworzenia i zwalniania obiektów i żądań pamięci, a pamięć jest zarezerwowana i zatwierdzana do przechowywania różnych obiektów. "Jądro wiedzy" (na potrzeby tego bloga, tak czy inaczej) jest kategorią "Free". W naszym przykładzie "bezpłatna" pamięć to całe dostępne miejsce, które jest "zarezerwowane" dla pliku wykonywalnego programu Lync. Jednak w Menedżerze zadań jest wyświetlany tylko określony typ "zatwierdzonej" pamięci. Pamięć zarezerwowana nie jest liczona, ponieważ nie jest używana.

Więc, gdzie jest pamięć? To staje się trudne do zidentyfikowania, ponieważ pamięć nie jest utracona. Wbrew powszechnemu przekonaniu zespół Skype'a nie został dotowany przez producentów pamięci stacjonarnej. Nie ma nikczemnej fabuły, aby skłonić klientów do uaktualnienia jakichkolwiek systemów lub pamięci. Nie jest to nawet przypadek planowanego przestarzałości. Prawda jest nieco trudniejsza do wyjaśnienia.

Cofniemy się nieco, aby wyjaśnić sytuację. Po pierwszym uruchomieniu klienta Skype dla firm ma on stosunkowo niewielki rozmiar pamięci — zazwyczaj 100 MB lub więcej, w zależności od liczby kontaktów, które śledzi on dla Ciebie i innych narzutów (widać to wyraźnie w powyższych danych). Po kilku dniach zauważysz, że ten ślad rośnie o kilkaset tysięcy bajtów do kilku megabajtów. W niektórych sytuacjach może to być problem , ale niekoniecznie jest to problem w Skype dla firm. Jest to raczej efekt paradygmatu programowania systemu Windows i sposobu natywnego obsługi pamięci.

Co programowanie systemu Windows?

Mam zamiar tylko dać uproszczony widok pamięci systemu Windows tutaj. Pamięć systemu Windows jest obsługiwana za pomocą kosztownych procedur (w zakresie cykli komputera i zasobów) znanych jako alokacje i cofanie alokacji. Gdy program potrzebuje pamięci, prosi system Windows o przydzielenie go. Po zakończeniu pracy z pamięcią program prosi system Windows o jego cofnięcie przydzielenia. Wewnętrznie system Windows przechodzi kilka procesów zarządzania żądaniami pamięci.

Po utworzeniu żądania system Windows sprawdza pamięć, która została już zatwierdzona w procesie, ale proces nie jest używany. System Windows chce sprawdzić, czy istnieje wystarczająco duży blok pamięci do użycia. Jeśli istnieje, system używa go i idzie na swój wesoły sposób. Jeśli tak nie jest, sprawdza pamięć zarezerwowaną. Jeśli istnieje wystarczająco duży blok pamięci zarezerwowanej, zatwierdza ją (w fragmentach zdefiniowanych przez system operacyjny nazywanych "stronami") i przechowuje w niej zmienną. Pamięć jest teraz zatwierdzona i właśnie powiększyliśmy ilość pamięci pliku wykonywalnego.

Co się stanie, jeśli nie ma wystarczającej ilości pamięci zarezerwowanej do obsługi żądania? System operacyjny próbuje zarezerwować więcej pamięci — jeśli to możliwe. Oto, gdzie występuje różnica między architekturą 32-bitową a architekturą 64-bitową. Proces 32-bitowy może używać tylko maksymalnie 4 GB pamięci. Jest to spowodowane tym, że maksymalna ilość 4 GB może być rozwiązana przez rejestr 32-bitowy. (Bit może zawierać tylko 1 lub 0 — binarny. W związku z tym 32 bity oznacza, że 232 jest najwyższym dozwolonym adresem). Dzięki architekturze 32-bitowej tylko około 2 GB tej pamięci jest przypisane do samego procesu, a reszta jest używana przez system operacyjny do mapowania typowych bibliotek DLL, dbania o typowe obiekty trybu jądra itd. W systemie 64-bitowym 64-bitowe rejestry mogą obsługiwać 264, co okazuje się około 18 eksabajtów. Jednak system Windows sztucznie ogranicza ilość dostępnej pamięci do zarezerwowania do przedziału od 2 terabajtów do 4 terabajtów (TB), w zależności od wersji systemu Windows.

Po zarezerwowaniu pamięci zostanie ona zatwierdzona, a następnie użyta tak jak poprzednio. Proces cofania alokacji jest w dużej mierze odwrotny - z wyjątkiem jednego lub dwóch małych, ale ważnych szczegółów.

Najpierw, o ile nie zażądano, system Windows nigdy nie "czyści" pamięci. Gdy pamięć zostanie cofnięta, zostanie ona oznaczona jako bezpłatna na mapie pamięci systemu Windows. Cokolwiek się odbyło jest nadal tam i pozostanie tam, dopóki nie zostanie zastąpiony przez inną alokację. Następnie system Windows rzadko cofa zatwierdzanie pamięci, chyba że zażądano tego. Jak powiedziałem wcześniej, operacje pamięci są dość kosztowne w zasobach. Dlatego jeśli program potrzebował przydzielonej wcześniej pamięci, system Windows zakłada, że może ona ponownie potrzebować tej pamięci i wstrzyma cofnięcie zatwierdzania pamięci, dopóki nie będzie to konieczne. Na koniec system Windows nigdy nie "łączy" pamięci. Oznacza to, że pamięć, którą zwalnia system Windows, nigdy nie jest "agregowane", a bloki wolnej pamięci nigdy nie są "przenoszone razem", aby tworzyć większe bloki wolnej pamięci. (Wszystkie te funkcje są połączone w kategorię nazywaną "odzyskiwaniem pamięci". .NET Framework ma kilka funkcji odzyskiwania pamięci. Jednak Skype dla firm jest aplikacją "natywną" lub non-.NET).

Skype dla firm przetwarza wiele obiektów na sekundę o zmiennym rozmiarze. Musi to zrobić, aby być oszałamiającym narzędziem, które chcemy, aby było. Prosimy o zarządzanie kontaktami, zarządzanie kalendarzami (spotkania), wiadomości błyskawiczne z naszymi przyjaciółmi, krewnymi i współpracownikami, a nawet rozmawianie z nimi przy użyciu głosu i wideo, udostępnianie pulpitów lub okien itd. Cóż, cytując późno, wielki Robert Heinlein, między innymi: "Nie ma czegoś takiego jak darmowy lunch."

Zarządzanie tak wieloma obiektami o takich różnych i często zmiennych rozmiarach tworzy alokacje i de-alokacje o różnych rozmiarach fragmentów pamięci. Z biegiem czasu powoduje to fragmentację pamięci — czasami ciężką — co zwiększa zużycie pamięci Skype dla firm.

Przykład może lepiej zilustrować ten punkt. Załóżmy, że Skype (lub dowolny program natywny, naprawdę) przydziela 64 obiekty o numerze od 1 do 64, które mają rozmiar po 4 K:

Zrzut ekranu przedstawiający obiekty skype 64.

Rysunek 6. 64 Obiekty, z których każdy korzysta z 4 KB pamięci

Powoduje to alokację pamięci o rozmiarze 256 KB i zobowiązanie. Teraz załóżmy, że program nie wymaga obiektów parzystych, więc zwalnia je:

Zrzut ekranu przedstawiający wszystkie wydane obiekty parzysty.

Rysunek 7. Zwolnienie wszystkich obiektów parzystych zwalnia 128 KB pamięci!

Jeśli przyjrzysz się większemu obrazowi ogólnej pamięci (przy użyciu narzędzia VMMap lub podobnego narzędzia), zobaczysz, że jedna z zatwierdzonych kolumn (prawdopodobnie w sekcji Sterta , ale zależy dokładnie od tego, jak program zażądał pamięci) ma 128 KB mniej, a sekcja Bezpłatna wzrosła o 128 KB. W Menedżerze zadań program ma teraz tylko 128 KB pamięci.

Załóżmy, że nasz program ma jeden obiekt 8 KB, który musi przechowywać. To powinno być proste. W końcu ma 128 KB za darmo. Jednak próba przechowywania tego obiektu o rozmiarze 8 KB spowoduje utworzenie nowej rezerwacji pamięci zamiast przechowywania pamięci w wolnym miejscu o rozmiarze 128 KB. Dzieje się tak dlatego, że jeśli spojrzysz na pamięć, zobaczysz, że jest ona nadal podzielona na fragmenty o rozmiarze 4 KB! System Windows nie ma wystarczająco dużego bloku pamięci, aby pomieścić obiekt o rozmiarze 8 KB, więc musi zarezerwować i zatwierdzić więcej pamięci w programie.

Jest to raczej wymyślony przykład, ale ilustruje trudności związane z zarządzaniem pamięcią skype'a. Skype zarządza dużą liczbą obiektów, które nie mają łatwo odróżnialnego rozmiaru. Wszystkie te obiekty mają zmienną długość. Oznacza to, że w miarę jak obiekty są przechowywane i zwalniane — zwłaszcza w długim okresie czasu, takim jak dni lub tygodnie — fragmentacja pamięci może stać się poważna, a ponieważ system Windows musi przydzielić więcej pamięci do przechowywania nowych obiektów, ślad pamięci nadmiernie rośnie.

Gdy powoduje to problemy w kliencie 32-bitowym, często sugerujemy przejście do klienta 64-bitowego, ponieważ pamięć jest tam znacznie mniej ograniczona dzięki architekturze 64-bitowej i 32-bitowej. Jednak nadmierny wzrost pamięci, między innymi, może powodować spowolnienie nawet w kliencie 64-bitowym. Te inne zagadnienia obejmują ogólną pamięć systemowa, szybkość dysku (ponieważ pamięć programu jest zwykle wspierana przez pamięć wirtualną w pliku stronicowania systemu Windows), ile innych aplikacji jest otwartych itd. W obu przypadkach, w miarę jak ilość pamięci Skype dla firm rośnie wraz z upływem czasu, tym gorzej będzie. W przypadku klienta 32-bitowego może to spowodować, że większe obiekty, których wymaga skype , takie jak wewnętrzny bufor do udostępniania aplikacji, wyczerpieją miejsce i spowodują awarie.

Aby być uczciwym, pamięć to tylko jeden zasób, który jest używany w czasie — ale jest to najbardziej oczywiste. Obsługa użycia może rosnąć, wątki będą zwiększać się wraz z upływem czasu, pamięć puli stronicowa wzrośnie i tak dalej. Każdy z tych podwyżek może mieć wpływ na proces, a w niektórych przypadkach na cały system operacyjny. Jest to jeden z niezliczonych powodów, dla których sugerujemy — nawet w przypadku klienta 64-bitowego — że użytkownicy opuszczają i ponownie uruchamiają Skype'a codziennie (lub przynajmniej co najmniej co tydzień) jako najlepsze rozwiązanie.

Co mam z tym zrobić i czy mogę wymusić ponowne uruchomienie programu Skype?

Istnieje kilka sposobów wymuszania ponownego uruchomienia skype'a, ale nie ma jednego, najlepszego sposobu. Jednym ze sposobów jest oczywiście edukacja użytkowników. Użytkownicy są arbitrami ich użycia pulpitu w większości przypadków, więc pragmatyczne jest nauczyć ich wylogowywać się i zamknąć Skype po opuszczeniu na dzień. Można to również zrobić jako obowiązkowy krok, pisząc skrypt niestandardowy lub wykonywalny, a następnie uruchamiając jeden z nich jako zadanie harmonogramu zadań. Takie podejście jest nieco ham-fisted, i może powodować Skype cykl nawet wtedy, gdy jest "w użyciu" (chociaż może to być złagodzone nieco przez warunki harmonogramu zadań). Istnieją również możliwości zarządzania komputerami i komputerami innych firm, potencjalne opcje biosu itd.

Najważniejsze jest to, że najlepiej dla Skype dla firm cyklu to codziennie - lub, co najmniej, co tydzień. Jeśli możesz regularnie szkolić użytkowników do odtwarzania Skype dla firm — a przynajmniej gdy coś się dziwnie stanie — prawdopodobnie będziesz mieć o wiele mniej połączeń z pomocą techniczną i o wiele więcej zadowolonych użytkowników.