The Great Skype pro firmy Memory Mystery

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

Jako eskalační technik pomáhám zákazníkům s některými další "persnickety" Skype pro firmy problémy. V poslední době se mi dostalo poměrně málo případů, které jsou založené na výkonu – v podstatě stížnosti, že Skype pro firmy je pomalé nebo pomalé, nepovoluje sdílení aplikací nebo prostě využívá příliš mnoho paměti. Mnohonásobné zkoumání těchto případů ukazuje, že uživatel Skype pro firmy několik týdnů; a v průběhu času se paměť protáhla, dokud neovlivní výkon. Dokonce jsem si toho všiml(a), když Skype dlouhou dobu běžet. Co tedy Skype dělat a proč má tolik paměti? (Tady je malá nápověda: Toto je normální a designové. Nic není v pořádku – každý nativní program na to běží.)

Kolik paměti může prokousnout?

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

Při Skype pro firmy (SfB) je využití paměti srovnatelně malé (pokud můžete spočítat 100 MB jako malé). Vidíme, že k tomu dochází v libovolném počtu nástrojů, například ve Správci úloh:

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

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

Časem se velikost paměti, kterou proces používá, zvětšuje. Jak velký bude růst, se určí podle toho, kolik Skype se používá, k čemu se používá a tak dále. Příklad: Tady je stejný klient po přibližně 24 hodinách:

Snímek obrazovky s podrobnostmi aplikace Lync v okně Správce úloh s pamětí se zvětšuje na 115 196 kB.

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

Takže Skype spotřeboval přibližně 32 MB za 24 hodin. To není moc, že? To opravdu není – dokud nevysvětlím, že Skype jen seděl nečinně po dobu všech těchto 24 hodin. V podstatě jsem Skype pro firmy na počítači, zamknul ho a čekal asi 24 hodin, než ho odemkl. Při používání by se výše mýtného vyšla – hlavně pokud jsem se připojil(a) ke schůzkám, používal(a) jsem sdílení aplikací nebo sdílení plochy v těchto schůzkách, používal(a) jsem rychlých zpráv a tak dále. Viděl(a) jsem případy, kdy Skype pro firmy paměti za jeden den vzrostla na 300–500 MB. Po jednom nebo více týdnech používání může být všechno kostkované – hlavně u 32bitového klienta s mnohem větší pamětí.

Zobrazení paměti

Existuje mnoho nástrojů, které mohou profilovat paměť. Jedním z nejoblíbenějších nástrojů – aspoň microsoftu – je nástroj SysInternals VMMap, který je dostupný na webu VMMap v3.26. Můžeme ji použít k tomu, abychom se podívali na paměť procesu a podívali se, jestli můžeme profilovat Skype pro firmy paměti.

Až si stáhnete VMMap, spusťte ho. Při spuštění se otevře seznam procesů, abyste mohli zvolit proces, který chcete zkontrolovat. Vyberu možnost lync.exe a klikněte na OK.

Snímek obrazovky s vybranou mapou V m na začátku s vybraným Lyncem

Obrázek 3: Mapa virtuálního počítače na obrazovce Start

Dále se zobrazí obrázek, který je vícebarevným znázornění aktuálního profilu paměti pro spustitelný soubor, který jste vybrali – Lync.exe v tomto případě.

Snímek obrazovky s vícebarevnou reprezentací profilu paměti

Obrázek 4: Počáteční mapa virtuálních virtuálních Lync.exe

Tady je hodně informací a jejich popis by vyplnil jeden nebo více vlastních blogových příspěvků. Pokud vás to zajímá, existuje několik skvělých knih a online článků, které vám to můžou vysvětlit. (Osobně doporučuji "Advanced Windows" od Uživatele Jeffa Richtera – v současné době se nevytiskl, ale přesto skvěle vysvětluje, jak paměť funguje. Použité kopie najdete ve svém oblíbeném knihkupci.)

Jak vidíte, paměť zobrazená ve Správci úloh není v nástroji VMMap zarovnána s žádnou kategorií. Správce úloh je generalizovanou reprezentací. je to přesné, ale všechno se nepočítá. VMMap je mnohem komplexnější.

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

Snímek obrazovky s mapou V m pro Skype po 24 hodinách

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

Kde je paměť?

Pokud porovnáte jednotlivé kategorie, nic se ve skutečnosti nevyrovná. Ve skutečnosti je obtížné zjistit, co paměť spotřebovává, protože kategorie paměti kolísaly, protože se vynakládaly a uvolňovávají objekty a žádosti o paměť a paměť se rezervuje a potvrzená pro ukládání různých objektů. "Jádro znalostí" (stejně pro účely tohoto blogu) je kategorie "Zdarma". V našem příkladu je "volná" paměť veškerým dostupným prostorem, který je vyhrazený pro spustitelný soubor Lyncu. Ve Správci úloh se ale zobrazuje jenom určitý typ "potvrzené" paměti. Rezervovaná paměť se nezapočítává, protože se používá.

Tak kde je paměť? To je obtížné určit, protože paměť není ztracená. Na rozdíl od všeobecného přesvědčení Skype výrobce desktopové paměti dotovat. Neexistuje žádný záslepný plán, který by zákazníky přindal k upgradu všech systémů nebo paměti. Není to ani případ plánovaného zastarávání. Pravda je trochu obtížnější vysvětlit.

Trochu se uchytáme, aby to bylo jasnější. Při prvním spuštění klienta Skype pro firmy má relativně malou paměťovou stopu – obvykle 100 MB nebo tak, v závislosti na počtu kontaktů, které za vás a dalších režijních nákladů sleduje (to můžete jasně vidět v datech výše). Po několika dnech si všimnete, že se tato stopa zvětšuje o několik set 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 sobě. Spíše je to efekt paradigmatu Windows a způsobu, jakým nativně zpracovává paměť.

Windows programování co?

Tady si jenom zjednoduším pohled na Windows paměti. Windows paměti se zpracovává prostřednictvím nákladných (z hlediska počítačových cyklů a zdrojů) postupů označované jako přidělení a delokace. Když program potřebuje paměť, požádá Windows, aby ho přidělil. Až to s pamětí projde, program vás požádá, Windows ho delokovat. Interně Windows několik procesů pro správu žádostí o paměť.

Když se žádost vyžádá, Windows zkontroluje paměť, kterou už tento proces odsoudí, ale tento proces se nepou3/4í. Windows se dívá, jestli je k dispozici dost velký blok paměti. Pokud je, systém ho používá a pokračuje vesele. Pokud není, zkontroluje rezervovanou paměť. Pokud je dost velký blok rezervované paměti, potvrdí ji (v blokech definovaných v operačním systému označovaných jako "stránky") a uloží do ní proměnnou. Paměť je teď potvrzená a právě jsme zvýšili nároky na paměť spustitelného souboru.

Co se stane, když není dost rezervované paměti pro zpracování žádosti? Operační systém se snaží rezervovat více paměti – pokud je to možné. Tady je místo, kde přichází do hry rozdíl mezi 32bitovou architekturou a 64bitovou architekturou. 32bitový proces může používat maximálně 4 GB paměti. Je to proto, že 4 GB je maximální částka, kterou může 32bitový registr adresovat. (Bit může obsahovat jenom binární hodnotu 1 nebo 0. 32 bitů proto znamená, že 232 je nejvyšší povolená adresa). Díky 32bitové architektuře je k samotnému procesu přiřazeno jenom asi 2 GB této paměti, zbytek operační systém používá k mapování běžných knihoven DLL, k péči o běžné objekty v režimu kernelu a tak dále. V 64bitovém systému 64bitové registry zvládnou 264, což se ukazuje jako přibližně 18 exabajtů. Ale Windows uměle omezuje množství paměti, která je dostupná pro rezervování mezi 2 terabajty a 4 terabajty (TB), v závislosti na Windows verzi.

Až bude paměť rezervovaná, bude potvrzená a použita jako dřív. Proces delokace je do značné míry opačný – s výjimkou jednoho nebo dvou malých, ale důležitých podrobností.

Za prvé, pokud není požadováno, Windows nikdy "vymaže" paměť. Pokud je paměť delokována, označí se jako volná v Windows paměti. Všechno, co se v ní nachází, je pořád tam a zůstane tam, dokud nebude přepsána jiným přidělením. Potom Windows paměť jen zřídka, pokud o to nepožádáte. Jak už jsem řekl, operace s pamětí jsou poměrně nákladné na zdroje. Pokud tedy program potřeboval dříve přidělenou paměť, Windows předpokládá, že bude tuto paměť potřebovat znovu, a vyrušování paměti podrží, dokud to nebude nezbytně nutné. A konečně, Windows nikdy "coalesces" paměti. To znamená, že paměť, Windows není nikdy "agregovaná", a bloky volné paměti se nikdy "nepřesouvaly" do větších bloků volné paměti. (Všechny tyto funkce se sekují do kategorie, která se označuje jako "uvolňování paměti". .NET Framework má některé funkce pro uvolňování paměti. Ale Skype pro firmy je "nativní" nebo non-.NET aplikace.)

Skype pro firmy zpracuje mnoho objektů v každé sekundě, které mají rozptylnou velikost. Musí to udělat, aby byl úžasným nástrojem, který chceme mít. Požádáme ho o správu kontaktů, správu kalendářů (schůzek), rychlých zpráv s našimi přáteli, příbuznými a kolegy a dokonce s nimi můžete mluvit pomocí hlasu i videa, sdílení plochy nebo oken atd. No, citovat pozdního skvělého Roberta Heinleina, mimo jiné: "Neexistuje nic jako oběd zadarmo".

Správa tolika objektů s různými a často proměnnými velikostmi vytváří přidělení a delokace bloků paměti s různou velikostí. V průběhu času to způsobuje fragmentaci paměti – občas těžkou – která zvyšuje nároky na paměť Skype pro firmy.

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

Snímek obrazovky s Skype 64 objektů

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

To způsobí přidělení a závazek v paměti o 256 KB. Předpokládejme, že program nevyžaduje objekty s rovnoměrně číslováním, takže je uvolní:

Snímek obrazovky se všemi vydanými objekty s rovnoměrně číslováním

Obrázek 7: Uvolněním všech rovnoměrně očíslovaných objektů uvolníte 128 kB paměti!

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

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

Jedná se o poměrně vykonstrované příklady, ale ukazuje to, jak Skype správy paměti. Skype spravuje velký počet objektů, které nemají snadno definovattelnou velikost. Všechny tyto objekty jsou vždy délkové. To znamená, že vzhledem k tomu, že se objekty ukládají a uchovávají – zejména po dlouhou dobu, jako jsou dny nebo týdny – může být fragmentace paměti závažná, a protože Windows musí přidělit více paměti pro ukládání nových objektů, velikost paměti se příliš zvětšuje.

Když to způsobí problémy v 32bitovém klientovi, často doporučujeme přechod na 64bitového klienta, protože v tomto případě je paměť mnohem méně míň omezená, a to díky 64bitové architektuře vs. 32bitová architektura. Nadměrný růst paměti ale může mimo jiné způsobit pomalé používání i v 64bitovém klientovi. Mezi tyto další aspekty patří celková systémová paměť, rychlost disku (protože paměť programu je obvykle zálohovaná virtuální pamětí ve stránkovacím souboru Windows),kolik dalších aplikací je otevřených a tak dále. V obou případech, protože Skype pro firmy paměť roste v průběhu času, tím hůře to bude dělat. V případě 32bitového klienta to může způsobit, že větší objekty, které Skype vyžaduje – například vnitřní vyrovnávací paměť pro sdílení aplikací – k tomu, aby došly mezery a způsobily chyby.

Aby to bylo spravedlivé, paměť je jenom jeden zdroj, který se v průběhu času spotřebovává – ale je to nejzřejmější. Využití úchytů se může zvětšit, vlákna se v průběhu času zvětšují, paměť stránkovaných fondu se zvýší a tak dále. Každé z těchto zvýšení může mít vliv na proces a v některých případech na celý operační systém. To je jeden z nesčetných důvodů, proč navrhujeme – i pro 64bitového klienta – aby uživatelé denně (nebo aspoň jednou týdně) odcvičí Skype restartu jako osvědčený postup.

Co s tím udělám a můžu Skype restartovat?

Existuje několik způsobů, jak vynutit restartování Skype, ale neexistuje jediný, nejlepší způsob. Jedním ze směrů je samozřejmě vzdělávání uživatelů. Uživatelé jsou ve většině případů arbitry využití plochy, takže je pragmatické naučit je odhlásit se a zavřít Skype, když odejdou na den. To se taky může udělat jako povinný krok napsáním vlastního skriptu nebo spustitelného souboru a spuštěním jednoho z nich jako úkolu Plánovače úloh. Tento přístup je trochu ztuhý a může způsobit, že Skype cyklicky cyklicky, i když se "používá" (i když to může být poněkud zmírněno v podmínkách Plánovače úloh). K dispozici jsou také možnosti třetích stran pro správu počítačů a počítačů, potenciální možnosti systému BIOS a tak dále.

Sečteno a poslední je, že je nejlepší, když Skype pro firmy denně cyklicky cyklicky – nebo aspoň jednou týdně. Pokud můžete své uživatele pravidelně Skype pro firmy recyklovat – nebo aspoň v případě, že se něco stane divným – budete pravděpodobně mít mnohem míň hovorů na helpdesku a spoustu dalších šťastných uživatelů.