Büyük Skype Kurumsal Bellek Gizemi
Bu makale Yükseltme Mühendisi Skype Kurumsal Kenn Guilstorf tarafından yazılmıştır.
Yükseltme mühendisi olarak müşterilere daha "persnickety" Skype Kurumsal sorunlarından bazılarında yardım ediyorum. Son zamanlarda, "performansa dayalı" olan birkaç durum aldım- temel olarak, Skype Kurumsal yavaş veya yavaş olduğuna, uygulama paylaşımına izin vermeyeceği veya çok fazla bellek kullandığına dair şikayetler. Çoğu zaman, bu durumlarla ilgili bir araştırma kullanıcının Skype Kurumsal haftalarca çalışmasına izin verdi ve zaman içinde bellek performansı etkileyene kadar yok oldu. Skype'ın uzun süre çalışmasına izin verince kendim bile fark ettim. Skype ne yapıyor ve neden bu kadar çok bellek tutuyor? (İşte küçük bir ipucu: Bu normaldir ve tasarım gereğidir. Hiçbir sorun yok; her yerel program bu sorunla karşılaşır.)
Ne kadar hafızayı çiğneyebiliyor?
Herhangi bir sorunu çözmenin ilk adımı, sorunu anlamak ve herhangi bir sorunu anlamanın ilk adımı bunu tanımlamaktır. Bunu yapmak kulağa geldiği kadar kolay değil.
Skype Kurumsal (SfB) ilk başlatıldığında bellek kullanımı oldukça küçük olur (100 MB'ı küçük sayabiliyorsanız). Bunun Görev Yöneticisi gibi herhangi bir sayıda araçta gerçekleştiğini görebiliriz:
Şekil 1: Kandırılma: Lync.exe SfB için işlem adıdır (32 bit sürüm)
Zaman içinde işlemin kullandığı bellek miktarı artacak. Ne kadar büyüyeceği Skype'ın ne kadar kullanıldığına, ne için kullanıldığına vb. göre belirlenir. Örneğin, yaklaşık 24 saat sonra aynı istemci şu şekildedir:
Şekil 2: Aynı SfB 24 saat sonra
Bu nedenle Skype, 24 saatte yaklaşık 32 MB tüketmiştir. Fazla bir şey değil, değil mi? Skype'ın 24 saat boyunca boşta oturduğunu açıklayana kadar gerçekten öyle değil. Temel olarak, bir bilgisayarda Skype Kurumsal başladım, kilitledim ve kilidini açmadan önce yaklaşık 24 saat bekledim. Kullanımda, özellikle toplantılara katıldıysam, bu toplantılarda uygulama paylaşımını veya masaüstü paylaşımını kullandıysam, anlık ileti kullandıysam, geçiş ücreti çok daha yüksek olurdu. Skype Kurumsal bellek kullanımının tek bir günde 300-500 MB'a kadar artmış olduğunu gördüm. Özellikle çok daha fazla bellek kısıtlanmış 32 bit istemcide bir veya daha fazla hafta kullanımdan sonra işler riskli hale gelebilir.
Bana belleği göster
Belleğin profilini oluşturan birçok araç vardır. En popülerlerden biri (en azından Microsoft), VMMap v3.26'da bulunan SysInternals aracı VMMap'tir. İşlem belleğine bakmak ve Skype Kurumsal belleğin profilini alıp alamayacağımıza bakmak için bunu kullanabiliriz.
VMMap'i indirdikten sonra çalıştırın. Başlarken, incelemek istediğiniz işlemi seçebilmeniz için bir işlem listesi açar. lync.exe'ı seçip Tamam'a tıklayacağım.
Şekil 3: Başlangıçta VMMap
Ardından, seçtiğiniz yürütülebilir dosya için geçerli bellek profilinin çok renkli bir gösterimi olan bir grafik görürsünüz( bu örnekte Lync.exe).
Şekil 4: Yakın zamanda başlatılan Lync.exe için VMMap'i başlatma
Burada çok fazla bilgi var ve her şeyi açıklamak, kendi blog gönderilerinden birini veya daha fazlasını dolduracak. İlgileniyorsanız, bunu açıklamaya yardımcı olabilecek birkaç harika kitap ve çevrimiçi makale vardır. (Kişisel olarak, Jeffrey Richter'ın "Gelişmiş Pencereler"i öneriyorum – şu anda baskısı yetersiz ama belleğin nasıl çalıştığını açıklama konusunda hala mükemmel. Kullanılan kopyalarını sık kullandığınız kitap mağazasında bulabilirsiniz.)
Gördüğünüz gibi , Görev Yöneticisi'nde gösterilen bellek VMMap'teki hiçbir kategoriyle hizalanmamıştır. Görev Yöneticisi daha genelleştirilmiş bir temsildir; Doğru, sadece her şeyi saymıyor. VMMap çok daha kapsamlıdır.
24 saatlik bekleme süresinden sonra Skype örneğimiz aşağıdadır:
Şekil 5: 24 saat sonra Skype için VMMap
Hafıza nerede?
Her bir kategoriyi karşılaştırırsanız, hiçbir şey gerçekten doğru olmaz. Aslında, bellek kategorilerinin nesneler ve bellek istekleri yapıldıktan ve serbest bırakıldığından ve bellek çeşitli nesneleri depolamak için ayrılmış ve işlendiğinden belleği tüketenleri bulmak zordur. "Bilgi çekirdeği" (bu blogun amaçları doğrultusunda, yine de) "Ücretsiz" kategorisidir. Örneğimizde, "boş" bellek, Lync yürütülebilir dosyası için "ayrılmış" olan tüm kullanılabilir alantır. Ancak Görev Yöneticisi'nde yalnızca belirli bir tür "kaydedilmiş" bellek gösterilir. Ayrılmış bellek kullanımda olmadığından sayılmaz.
Hafıza nerede? Bellek kaybolmadığı için bunu saptamak zorlaşır. Popüler inanışın aksine, Skype ekibi masaüstü bellek üreticileri tarafından desteklenmiyordu. Müşterilerin herhangi bir sistemi veya belleği yükseltmesini sağlamak için kötü amaçlı bir çizim yoktur. Bu planlı bir eskimişlik durumu bile değil. Gerçeği açıklamak biraz daha zor.
İşleri daha net hale getirmek için biraz geri dönelim. Skype Kurumsal istemcisini ilk kez başlattığınızda, sizin ve diğer ek yükleri takip eden kişi sayısına bağlı olarak görece küçük bir bellek ayak izi vardır ( genellikle 100 MB veya daha fazladır) (yukarıdaki verilerde bunu açıkça görebilirsiniz). Birkaç gün sonra, bu ayak izinin birkaç yüz bin bayttan birkaç megabayta kadar büyüdüğünü fark edeceksiniz. Bazı durumlarda bu bir sorun olabilir, ancak Skype Kurumsal kendisinde bir sorun olması gerekmez. Bunun yerine, Windows programlama paradigması ve belleği yerel olarak işleme şeklinin bir etkisidir.
Windows programlama ne?
Burada yalnızca Windows belleğinin basit bir görünümünü vereceğim. Windows belleği, ayırmalar ve ayırmaları kaldırma olarak bilinen pahalı (bilgisayar döngüleri ve kaynaklar açısından) yordamlar aracılığıyla işlenir. Bir program belleğe ihtiyaç duyduğunda, Windows'un bellek ayırmasını ister. Bellekle ilgili işlem bittiğinde, program Windows'tan belleği kaldırmasını ister. Windows, bellek isteklerini yönetmek için dahili olarak birkaç işlemden geçer.
bir istek yapıldığında, Windows işleme zaten taahhüt etmiş ancak işlemin kullanmadığı belleği denetler. Windows, kullanılacak kadar büyük bir bellek bloğu olup olmadığını görmek ister. Varsa, sistem onu kullanır ve mutlu bir şekilde devam eder. Yoksa ayrılmış belleği denetler. Yeterince büyük bir ayrılmış bellek bloğu varsa, bunu işler (işletim sistemi tarafından tanımlanan öbeklerde "sayfalar" olarak bilinir) ve değişkenini içinde depolar. Bellek artık işlendi ve yürütülebilir dosyanın bellek ayak izini büyüttük.
İsteği işlemek için yeterli ayrılmış bellek yoksa ne olur? İşletim sistemi, varsa daha fazla bellek ayırmaya çalışır. 32 bit mimari ile 64 bit mimari arasındaki fark burada devreye girer. 32 bitlik bir işlem yalnızca en fazla 4 GB bellek kullanabilir. Bunun nedeni 4 GB'ın 32 bit yazmaçların giderebileceği maksimum miktar olmasıdır. (Bit yalnızca 1 veya 0 – ikiliyi barındırabilir. Bu nedenle, 32 bit, izin verilen en yüksek adresin2 32 olduğu anlamına gelir). 32 bit mimari sayesinde, bu belleğin yalnızca 2 GB'ı işlemin kendisine atanır, geri kalanı işletim sistemi tarafından ortak DLL'leri eşlemek, ortak çekirdek modu nesneleriyle ilgilenmek vb. için kullanılır. 64 bit sistemde, 64 bit uzunluğunda yazmaçlar 264'leri işleyebilir ve bu da yaklaşık 18 exabayttır. Ancak Windows, Windows sürümüne bağlı olarak 2 terabayt ile 4 terabayt (TB) arasında ayrılabilecek bellek miktarını yapay olarak sınırlar.
Bellek ayrıldıktan sonra işlenir ve daha önce olduğu gibi kullanılır. Ayırmayı kaldırma işlemi, bir veya iki küçük ama önemli ayrıntı dışında büyük ölçüde tersidir.
İlk olarak, istenmediği sürece Windows hiçbir zaman belleği "temizlemez". Bellek kaldırıldığında, Windows bellek eşlemesinde boş olarak işaretlenir. Tuttuğu her şey hala oradadır ve başka bir ayırma tarafından üzerine yazılana kadar orada kalır. Daha sonra Windows, istenmediği sürece nadiren belleğin işlenmesini geri alır. Daha önce de söylediğim gibi bellek işlemleri oldukça kaynak açısından pahalıdır. Bu nedenle, bir program daha önce ayrılmış belleğe ihtiyaç duyuyorsa, Windows bu belleğe yeniden ihtiyaç duyabileceğini varsayar ve kesinlikle gerekene kadar belleğin işlenmesini durduracaktır. Son olarak, Windows hiçbir zaman belleği "birleştirmez". Bu, Windows'un boşaltıldığı belleğin hiçbir zaman "toplanmaz" ve boş bellek bloklarının daha büyük boş bellek blokları oluşturmak için hiçbir zaman "birlikte taşınmaz" anlamına gelir. (Tüm bu işlevler birlikte "çöp toplama" olarak bilinen bir kategoride toplanır. .NET Framework ünlü bazı çöp toplama özelliklerine sahiptir. Ancak, Skype Kurumsal "yerel" veya non-.NET bir uygulamadır.)
Skype Kurumsal her saniye değişken boyutta birçok nesneyi işler. Olmasını istediğimiz etkileyici araç olması için bunu yapması gerekir. Kişileri yönetmesini, takvimleri (toplantıları), arkadaşlarınızla, akrabalarımızla ve iş arkadaşlarınızla anlık ileti göndermesini ve hatta hem ses hem de video kullanarak onlarla konuşmasını, masaüstlerini veya pencerelerini paylaşmasını vb. istiyoruz. Merhum Robert Heinlein'den alıntı yapmak için: "Bedava öğle yemeği diye bir şey yoktur."
Bu tür farklı ve genellikle değişken boyutlardaki bu kadar çok nesnenin yönetilmesi, değişken boyuttaki bellek öbeklerinin ayırmalarını ve ayırmalarını kaldırmayı sağlar. Zaman içinde bu, Skype Kurumsal bellek ayak izini artıran bellek parçalanması (bazen ciddi) neden olur.
Bir örnek bu noktayı daha iyi gösterebilir. Skype'ın (veya herhangi bir yerel programın) her biri boyut olarak 4 K bayt olan 1-64 numaralı 64 nesne ayırdığını varsayalım:
Şekil 6: Her biri 4 KB bellek kullanan 64 Nesne
Bu, 256 KB bellek ayırma ve taahhüdüne neden olur. Şimdi, programın çift numaralı nesneleri gerektirmediğini ve bu nedenle bunları serbest bırakdığını varsayalım:
Şekil 7: Çift numaralı tüm nesnelerin serbest bırakılması 128 KB bellek boşaltıyor!
Genel belleğin daha büyük resmine bakarsanız (VMMap veya benzer bir araç kullanarak), işlenen sütunlardan birinin (büyük olasılıkla Yığın bölümündedir, ancak programın belleği tam olarak nasıl istediğine bağlıdır) 128 KB daha az olduğunu ve Ücretsiz bölümünün 128 KB büyüdüğünü görürsünüz. Görev Yöneticisi'nde, program artık yalnızca 128 KB bayt belleğe sahip.
Şimdi programımızın depolaması gereken tek bir 8 KB nesnesi olduğunu varsayalım. Bu basit olmalıdır. Sonuçta, 128 KB ücretsiz. Ancak, bu 8 KB'lık nesneyi depolamak, belleği 128 KB boş alanda depolamak yerine yeni bir bellek ayırması oluşturur. Bunun nedeni, belleğe baktığınızda hala 4 KB'lık öbeklere ayrılmış olduğunu görebilmenizdir! Windows'un 8 KB'lık nesnesini barındıracak kadar büyük bir bellek bloğu yoktur, bu nedenle programa daha fazla bellek ayırması ve işlemesi gerekir.
Bu oldukça karmaşık bir örnektir ancak Skype'ın bellek yönetiminin zorluğunu gösterir. Skype, kolayca tanımlanabilir boyuta sahip olmayan çok sayıda nesneyi yönetir. Bu nesnelerin tümü değişken uzunluktadır. Bu, nesneler depolanıp serbest bırakıldıkça (özellikle günler veya haftalar gibi uzun bir süre içinde) bellek parçalanması ciddi hale gelebilir ve Windows'un yeni nesneleri depolamak için daha fazla bellek ayırması gerektiğinden bellek ayak izi aşırı büyür.
Bu durum 32 bit istemcide sorunlara neden olduğunda, 64 bit ve 32 bit mimari sayesinde bellek çok daha az kısıtlandığından sık sık 64 bit istemciye geçmenizi öneririz. Ancak, dikkat edilmesi gereken diğer noktalar arasında aşırı bellek büyümesi, 64 bit istemcide bile yavaşlığa neden olabilir. Diğer önemli noktalar arasında genel sistem belleği, disk hızları (program belleği genellikle Windows disk belleği dosyasındaki sanal bellek tarafından desteklendiğinden), başka kaç uygulamanın açık olduğu vb. yer alır. Her iki durumda da Skype Kurumsal bellek ayak izi zamanla arttıkça daha kötü performans gösterir. 32 bit istemci durumunda, bu durum Skype'ın gerektirdiği daha büyük nesnelerin (uygulama paylaşımı için iç arabelleği gibi) boş alanın bitmesine ve hatalara neden olmasına neden olabilir.
Adil olmak gerekirse, bellek zaman içinde tüketilen tek bir kaynaktır; ancak en belirgin olanıdır . İşleme kullanımı büyüyebilir, iş parçacıkları zaman içinde artar, disk belleği havuzu belleği artar ve bu şekilde devam eder. Bu artışların her biri süreci ve belirli durumlarda tüm işletim sistemini etkileyebilir. Bu, 64 bit istemci için bile kullanıcıların skype'dan en iyi uygulama olarak günlük (veya en azından haftalık) çıkıp yeniden başlatmasını önermemiz için sayısız nedenden biridir.
Bu konuda ne yapmalıyım ve Skype'ı yeniden başlatmaya zorlayabilir miyim?
Skype'ı yeniden başlatmaya zorlamanın birkaç yolu vardır, ancak tek ve en iyi yolu yoktur. Elbette bir yol da kullanıcı eğitimidir. Kullanıcılar çoğu durumda masaüstü kullanımlarının arbiterleridir, bu nedenle onlara gün için ayrıldıklarında oturumu kapatmayı ve Skype'ı kapatmayı öğretmek pragmatiktir. Bu, özel bir betik veya yürütülebilir dosya yazıp birini Görev Zamanlayıcı görevi olarak çalıştırarak da zorunlu bir adım olarak yapılabilir. Bu yaklaşım biraz ham-fisted şeklindedir ve "kullanımda" olsa bile Skype'ın döngüye geçmesine neden olabilir (ancak bu durum Görev Zamanlayıcı koşulları aracılığıyla biraz azaltılabilir). Masaüstü ve bilgisayar yönetimi, olası BIOS seçenekleri vb. için üçüncü taraf fırsatlar da vardır.
Sonuç olarak, Skype Kurumsal için günlük veya en azından haftalık olarak döngü yapmak en iyisidir. Kullanıcılarınızı düzenli olarak Skype Kurumsal geri dönüşüme dönüştürmeleri için eğitebiliyorsanız (veya en azından işler garipleştiyse) büyük olasılıkla çok daha az Yardım Masası çağrınız ve çok daha mutlu kullanıcılarınız olacaktır.