The Great Skype pro firmy Memory Mystery

Tento článek napsal Kenn Guilstorf, Skype pro firmy Escalation Engineer.

Jako technik eskalace pomáhám zákazníkům s některými dalšími "persnickety" Skype pro firmy problémy. V poslední době jsem obdržel spoustu případů, které jsou "založené na výkonu" – v podstatě stížnosti, že Skype pro firmy je pomalý nebo pomalý, neumožňuje sdílení aplikací nebo jednoduše využívá příliš mnoho paměti. Šetření těchto případů často ukazuje, že uživatel nechal Skype pro firmy běžet týdny a postupem času se paměť vyčerpá, dokud to nemá vliv na výkon. Dokonce jsem si toho všiml i sám, když jsem nechal Skype běžet na dlouhou dobu. Co tedy Skype dělá a proč uchovává tolik paměti? (Tady je malá nápověda: Je to normální a záměrně. Nic není špatně – na to narazí každý nativní program.)

Kolik paměti může překousnout?

Prvním krokem k vyřešení jakéhokoli problému je porozumět problému a prvním krokem k pochopení problému je jeho definování. Není to tak snadné, jak se zdá.

Při prvním spuštění Skype pro firmy (SfB) je využití paměti srovnatelně malé (pokud můžete spočítat 100 MB jako malé). Můžeme vidět, že k tomu dochází v libovolném počtu nástrojů, jako je Správce úloh:

Snímek obrazovky s podrobnostmi o aplikaci Lync v okně Správce úloh s hodnotami paměti 83 428 KB

Obrázek 1: Nenechte se zmást: Lync.exe je název procesu pro SfB (32bitová verze)

Postupem času se velikost paměti, kterou proces využívá, bude zvětšovat. To, jak velká bude, závisí na tom, kolik se Skype používá, k čemu se používá atd. Tady je například stejný klient přibližně po 24 hodinách:

Snímek obrazovky zobrazující podrobnosti aplikace Lync v okně Správce úloh s velikostí paměti na 115 196 tisíc

Obrázek 2: Stejný SfB o 24 hodin později

Skype tak za 24 hodin spotřeboval přibližně 32 MB. To není moc, že? Opravdu to není – dokud nevysvětlím, že Skype byl jen nečinný po všech těch 24 hodin. V podstatě jsem začal Skype pro firmy na počítači, zamkl ho a čekal asi 24 hodin, než ho odemknu. Při používání by byla daň mnohem vyšší – zejména pokud jsem se připojil ke schůzkám, použil(a) jsem sdílení aplikací nebo sdílení plochy na těchto schůzkách, použil(a) rychlé zprávy atd. Zaznamenali jsme případy, kdy využití paměti Skype pro firmy vzrostlo na 300–500 MB za jeden den. Po jednom nebo více týdnech používání může dojít k nedostatku věcí – zejména u mnohem více paměti omezeného 32bitového klienta.

Zobrazit paměť

Existuje mnoho nástrojů, které můžou profilovat paměť. Jedním z nejoblíbenějších – alespoň u Microsoftu – je nástroj SysInternals VMMap, který je k dispozici na webu VMMap verze 3.26. Můžeme ho použít k tomu, abychom se podívali na paměť procesu a zjistili, jestli můžeme profilovat Skype pro firmy paměť.

Po stažení mapy VMMap ji spusťte. Na začátku se otevře seznam procesů, abyste mohli zvolit proces, který chcete prozkoumat. Vyberu lync.exe a klikněte na OK.

Snímek obrazovky znázorňující mapu Vm na začátku s vybraným Lyncem

Obrázek 3: VMMap at Start

Dále uvidíte obrázek, který je vícebarevnou reprezentací aktuálního profilu paměti pro spustitelný soubor, který jste vybrali – v tomto případě Lync.exe.

Snímek obrazovky znázorňující vícebarevnou reprezentaci profilu paměti

Obrázek 4: Spuštění mapy virtuálních počítačů pro nedávno spuštěné Lync.exe

Existuje mnoho informací zde, a popis to všechno by zaplnil jeden nebo více blogových příspěvků jeho vlastní. Pokud vás to zajímá, existuje několik skvělých knih a online článků, které vám to můžou pomoct vysvětlit. (Osobně doporučuji "Advanced Windows" od Jeffrey Richter - v současné době mimo tisk, ale stále vynikající při vysvětlení, jak funguje paměť. Použité kopie najdete ve svém oblíbeném obchodě s knihami.)

Jak vidíte, paměť zobrazená ve Správci úloh neodpovídá žádné kategorii v mapě virtuálních počítačů. Správce úloh je obecnější reprezentace; je to přesné, prostě nepočítá všechno. VMMap je mnohem komplexnější.

Tady je naše instance Skypu po 24hodinové čekací době:

Snímek obrazovky znázorňující mapu virtuálního počítače pro Skype po 24 hodinách

Obrázek 5: VMMap pro Skype po 24 hodinách

Kde je paměť?

Když porovnáte jednotlivé kategorie, nic se ve skutečnosti nerovná. Ve skutečnosti je obtížné zjistit, co paměť spotřebovává, protože kategorie paměti kolísají s tím, jak objekty a požadavky na paměť jsou vytvořeny a vydávány a paměť je vyhrazena a potvrzena pro ukládání různých objektů. "Jádro znalostí" (pro účely tohoto blogu, stejně) je kategorie "Free". V našem příkladu je "volná" paměť veškeré dostupné místo, které je "vyhrazené" pro spustitelný soubor Lyncu. Ve Správci úloh se ale zobrazuje pouze určitý typ "potvrzené" paměti. Rezervovaná paměť se nezapočítává, protože se nepoužívá.

Takže, kde je paměť? To je obtížné určit, protože paměť se neztratí. Na rozdíl od všeobecného přesvědčení nebyl tým Skypu dotován výrobci paměti pro stolní počítače. Neexistuje žádný zlý graf, který by zákazníkům přiměl upgradovat jakékoli systémy nebo paměť. To není ani případ plánovaného zastarávání. Pravda je trochu obtížnější vysvětlit.

Pojďme trochu ustoupit, aby to bylo jasnější. Když poprvé spustíte Skype pro firmy klienta, má relativně malé nároky na paměť – obvykle 100 MB nebo tak, v závislosti na počtu kontaktů, které za vás sleduje, a dalších režijních nákladů (jasně to vidíte v datech výše). Po několika dnech si všimnete, že se tato stopa zvětšuje o několik stovek tisíc bajtů na několik megabajtů. V určitých situacích to může být problém , ale nemusí to být nutně problém v Skype pro firmy samotné. Spíše je to efekt programovacího paradigmatu Windows a způsobu, jakým nativně zpracovává paměť.

Co programuje Windows?

Tady jen zjednoduším pohled na paměť Windows. Paměť Systému Windows se zpracovává drahými postupy (z hlediska cyklů a prostředků počítačů), které se označují jako přidělování a rušení přidělení. Když program potřebuje paměť, požádá systém Windows, aby ji přidělil. Po dokončení s pamětí program požádá Systém Windows o zrušení přidělení. Systém Windows interně prochází několika procesy pro správu požadavků na paměť.

Když se vytvoří požadavek, systém Windows zkontroluje paměť, kterou už potvrdil k procesu, ale že tento proces nepoužívá. Systém Windows se snaží zjistit, jestli existuje dostatečně velký blok paměti, který se dá použít. Pokud ano, systém ji použije a pokračuje svou veselou cestou. Pokud tam není, zkontroluje rezervovanou paměť. Pokud je k dispozici dostatečně velký blok rezervované paměti, potvrdí ho (v blocích definovaných operačním systémem označovaných jako "pages") a uloží do něj proměnnou. Paměť je teď potvrzená a právě jsme zvýšili nároky na paměť spustitelného souboru.

Co se stane, když není k dispozici dostatek rezervované paměti pro zpracování požadavku? Operační systém se snaží rezervovat více paměti – pokud je to možné. Tady přichází do hry rozdíl mezi 32bitovou a 64bitovou architekturou. 32bitový proces může využívat maximálně 4 GB paměti. Je to proto, že 4 GB jsou maximální množství, které může 32bitový registr adresovat. (Bit může obsahovat pouze binární soubor 1 nebo 0. Proto 32 bitů znamená, že 232 je nejvyšší povolená adresa). Díky 32bitové architektuře jsou k samotnému procesu přiřazeny pouze asi 2 GB této paměti, zbytek používá operační systém k mapování běžných knihoven DLL, o běžné objekty v režimu jádra atd. V 64bitovém systému dokážou 64bitové registry zpracovat 264, což se ukáže jako přibližně 18 exabajtů. Systém Windows ale uměle omezuje velikost dostupné paměti, která se má vyhrazit, na 2 terabajty až 4 terabajty (TB) v závislosti na verzi Windows.

Po rezervování paměti se potvrdí a použije se jako předtím. Proces zrušení přidělení je z velké části opačný – s výjimkou jednoho nebo dvou malých, ale důležitých detailů.

Za prvé, pokud není požadováno, systém Windows nikdy "nevymaže" paměť. Při zrušení přidělení paměti je paměť v mapě paměti systému Windows označena jako volná . To, co bylo v držení, je stále tam a zůstane tam, dokud nebude přepsáno jiným přidělením. Systém Windows pak jen zřídka zruší potvrzení paměti, pokud o to nepožádá. Jak jsem řekl dříve, operace paměti jsou poměrně náročné na prostředky. Pokud tedy program potřeboval dříve přidělenou paměť, systém Windows předpokládá, že tuto paměť může znovu potřebovat, a oddrží zrušit potvrzení paměti, dokud to nebude nezbytně nutné. Systém Windows nikdy nesdružuje paměť. To znamená, že paměť, kterou systém Windows uvolní, se nikdy "agreguje" a bloky volné paměti se nikdy "nepřesouvají dohromady", aby se zvětšovaly bloky volné paměti. (Všechny tyto funkce jsou spojeny do kategorie, která se označuje jako "uvolňování paměti". Rozhraní .NET Framework má některé funkce uvolňování paměti. Skype pro firmy je však "nativní" nebo non-.NET aplikace.)

Skype pro firmy zpracovává mnoho objektů s proměnlivou velikostí každou sekundu. Musí to udělat, aby to byl úžasný nástroj, který chceme být. Žádáme ho, aby spravoval kontakty, spravoval kalendáře (schůzky), rychlé zprávy s přáteli, příbuzné a kolegy a dokonce s nimi mluvil hlasem i videem, sdílel plochy nebo okna atd. No, abych citoval pozdního, skvělého Roberta Heinleina, mimo jiné: "Neexistuje nic jako oběd zdarma."

Správa tolika objektů takových rozdílných a často proměnlivých velikostí vytváří přidělení a zrušení přidělení různě velkých bloků paměti. V průběhu času to způsobuje fragmentaci paměti ( někdy závažnou), která zvyšuje nároky na paměť Skype pro firmy.

Tento bod může lépe ilustrovat příklad. Předpokládejme, že Skype (nebo jakýkoli nativní program) přidělí 64 objektů očíslovaných 1 až 64, které mají velikost 4 kB:

Snímek obrazovky znázorňující objekty Skypu 64

Obrázek 6: 64 objektů, z nichž každý využívá 4 kB paměti

To způsobí přidělení paměti a závazek 256 kB. Teď předpokládejme, že program nevyžaduje sudé objekty, takže je uvolní:

Snímek obrazovky znázorňující všechny uvolněné objekty se sudými čísly

Obrázek 7: Uvolnění všech sudých objektů uvolní až 128 kB paměti!

Pokud se podíváte na větší obrázek celkové paměti (pomocí VMMap nebo podobného nástroje), uvidíte, že jeden z potvrzených sloupců (pravděpodobně v části Halda , ale záleží na tom, jak přesně program požádal o paměť) má o 128 kB méně a část Free se zvětšila o 128 kB. Ve Správci úloh teď program vlastní pouze 128 kB paměti.

Dále předpokládejme, že náš program má jeden 8kB objekt, který musí uložit. Mělo by to být jednoduché. Koneckonců, má 128 kB zdarma. Při pokusu o uložení tohoto 8kB objektu se ale vytvoří nová rezervace paměti místo ukládání paměti do volného místa o velikosti 128 kB. Je to proto, že když se podíváte na paměť, uvidíte, že je stále rozdělená do 4kB bloků. Systém Windows nemá dostatečně velký blok paměti pro uložení 8kB objektu, takže musí rezervovat a potvrdit více paměti programu.

Toto je poněkud vymyšlené příklad, ale ilustruje potíže se správou paměti skypu. Skype spravuje velký počet objektů, které nemají snadno definovatelnou velikost. Všechny tyto objekty jsou různě dlouhé. To znamená, že při ukládání a uvolnění objektů – zejména v dlouhém časovém období, jako jsou dny nebo týdny – může být fragmentace paměti závažná, a protože systém Windows musí přidělit více paměti pro ukládání nových objektů, nadměrně roste nároky na paměť.

Pokud to způsobí problémy v 32bitovém klientovi, často doporučujeme přejít na 64bitového klienta, protože díky 64bitové a 32bitové architektuře je paměť mnohem méně omezená. Nadměrný růst paměti ale může mimo jiné způsobit zpomalení i v 64bitovém klientovi. Mezi tyto další aspekty patří celková systémová paměť, rychlost disku (protože paměť programu je obvykle podporována virtuální pamětí ve stránkovacím souboru Windows), kolik dalších aplikací je otevřených atd. V obou případech s tím, jak Skype pro firmy paměťová náročnost v průběhu času roste, tím horší bude výkon. V případě 32bitového klienta to může způsobit, že větší objekty, které Skype vyžaduje – například jeho interní vyrovnávací paměť pro sdílení aplikací – vyčerpá místo a způsobí selhání.

Abychom byli spravedliví, paměť je pouze jedním prostředkem, který se v průběhu času spotřebovává – ale je to nejzřetelnější. Využití popisovačů může narůstat, počet vláken se bude v průběhu času zvětšovat, paměť stránkovaného fondu se zvětší atd. Každé z těchto zvýšení může mít vliv na proces a v některých případech i na celý operační systém. To je jeden z nesčetných důvodů, proč doporučujeme – i pro 64bitového klienta – aby uživatelé ukončili a restartovali Skype každý den (nebo alespoň týdně) jako osvědčený postup.

Co s tím mám dělat a můžu vynutit restartování Skypu?

Restartování Skypu můžete vynutit několika způsoby, ale neexistuje jediný, nejlepší způsob. Jedním ze způsobů je samozřejmě vzdělávání uživatelů. Uživatelé jsou ve většině případů arbitry při používání plochy, takže je praktické naučit je odhlásit se a zavřít Skype, když odejdou na den. To lze provést také jako povinný krok napsáním vlastního skriptu nebo spustitelného souboru a následným spuštěním jednoho z nich jako úlohy Plánovače úloh. Tento přístup je trochu nehorázný a může způsobit, že Skype bude cyklicky, i když se "používá" (i když to lze poněkud zmírnit pomocí podmínek Plánovače úloh). Existují také příležitosti třetích stran pro správu stolních počítačů a počítačů, potenciální možnosti systému BIOS atd.

Sečteno a podtrženo je, že pro Skype pro firmy je nejlepší ho cyklovat každý den – nebo aspoň týdně. Pokud dokážete uživatele vytrénovat, aby pravidelně recyklovali Skype pro firmy ( nebo alespoň když se to stane divné ), pravděpodobně budete mít mnohem méně hovorů na helpdesku a mnohem více šťastných uživatelů.