Ne kadar bellek alacağınızı nasıl tahmin edersiniz?


10

Windows 2008 R2 üzerinde çalışan özel bir sunucu uygulamam var. Bu, bir dizi özel terminali destekleyen .Net'te yazılmış, evde yetiştirilen bir Windows Hizmetidir. Canlı sunucuya benzer özelliklere sahip bir test makinem var ve gerçek sistemin makul bir yaklaşımı olan bir yük üretmek için kullanabileceğim bir dizi istemci simülatörü var. Bunların 12.000'i destekleyebilmem gerekiyor ve şu anda sunucu belleği yetersiz (Çağrı çatıdan geçiyor).

Planım sadece 100 simülatörden başlamak, bellek kullanımını ölçmek, daha sonra 100 daha fazla ölçüm belleği başlatmak ve sayfalama başlayana kadar tekrarlamaktı (Gerçekte üçten fazla veri noktası alacağım.) Bu bana bir rakam vermeli 100 simülatör için gereken fazladan bellek miktarı ve ne kadar bellek gerektiğini yansıtmamı sağlıyor. Sunucunun alacağı tam 2 TB (150.000 $ değerinde) satın almaktan kaçınmak için sadece kaba bir fikir +/- 30Gb'ye ihtiyacım var. Benim sorum bunun kullanım için makul bir yöntem olup olmadığı ve gerçekte kullanılan bellek miktarını vermek için hangi Performans Sayaçlarını izleyeceğinizdir?

Burada özellikle Hafızadan bahsediyorum, çünkü Çalışma Kümesi, Özel Bayt, Taahhütlü, Paylaşılan, Sanal ve diğer tüm bellek terimleri beni karıştırıyor. CPU, IO ve Networking'i kendi başıma izlemeyi başarabiliyorum. Fark ettiğim diğer bir şey, .Net Cache, mevcut olana bağlı olarak bellek kullanımını ayarlamasıdır, bu da lekelenmeyi görmeyi zorlaştırır.


Birbirine çok yakın 2 veri noktasına dayanan bellek kullanımını yansıtmaya gerçekten dikkat ediyorum . Bellek kullanımının (ve bu konuda G / Ç) doğrusal olarak ölçekleneceğinden ciddi şüphelerim olur. Olabilir, ancak büyük sayılara geçtiğinizde lineer olmayan eğilimlere şüpheliyim. Performans sorunlu hale gelene kadar (sayfalama, G / Ç doygunluğu, vb.) Ve oradan projelendirilene kadar küçükten büyüğe ilerleyen bir dizi veri noktasıyla test ederdim. Makineyi kademeli olarak yükseltmek ve daha büyük müşteri numaralarını simüle etmeye devam etmek mümkün olursa, eğrinin şekli hakkında iyi bir his elde edene kadar yapardım.
Evan Anderson

Bunun ne olduğu hakkında biraz daha iyi bir fikir vermelisiniz. Web mi? aspx? php? Evde yetişen bir şey mi var? Batch iş ilanları? Asp.net davranışı bir kutu üzerinde çalışan exes bir sürü farklıdır. Sistemin kullanıcı başına ne kullandığına dair temel bir fikre ihtiyacınız var - yaklaşık. rakamlar - ve sonra eski bir zarf. Bu rakamları nasıl alacağınız, sisteminizin nasıl çalıştığına bağlıdır.
Ian Murphy

@Evan. Her zaman ikiden fazla veri noktası alacaktım.
Martin Brown

@Ian: "Sistemin kullanıcı başına ne kullandığına dair bazı temel fikirler" bulmaya çalıştığım şey. Bunu bilsem soruyu sormam gerekmeyecekti. Diğer puanlarınızı da kapsamaya çalışmak için soruyu güncelledim.
Martin Brown

Yanıtlar:


8

Dürüst? Ben YAPMAYIN .
Her türlü gerçek iş yükünü görecek bir sunucu belirtirken, makul bir şekilde karşılayabildiğim kadar RAM'de tıkarım (sistemlerin CPU veya Disk kısıtlamalı RAM kısıtlamalı sarma olasılığı daha yüksektir - diğer garantili darboğaz ön taraftır. otobüs).

Eğer önerdiğimiz gibi uygulama temel bir yük testi kullanabilir ne kadar RAM anlamaya istiyorsanız iyi bir başlangıç, ama zaten eğer varsa üretimde bu sistemi (sen de yapmak gibi geliyor) ve üretim sistemi takas edilir senin görev daha kolaydır: Ne kadar takas alanı kullandığınızı belirleyin -> En az 2 kat daha fazla RAM ekleyin (sisteminizin DIMM boyutu kısıtlamalarına uyacak şekilde toplayın).

Kaba sayılar almak ve oradan tahmin etmek için bir yük testi yaparsanız, birkaç şeyi hesaba katmayı unutmayın:

  1. Bellek eğrisi muhtemelen iki ayrı bölüm olacaktır
    (çerçeveler / paylaşılan kütüphaneler önbelleğe alındıkça ilk keskin artış, sonra her yeni uygulamanın paylaşılamayan kodu belleğe yerleştirildikçe biraz daha az dik eğri)

  2. Disk ve paylaşılan kütüphane önbelleği ve işletim sistemi için hala boş RAM'e ihtiyacınız var.
    (Bu, uygulamanızın neye ihtiyacı olduğu konusunda en az birkaç konser olmalıdır)

  3. TÜM yazılımlar bellek sızdırıyor (en azından tüm pratik yazılımlar yapıyor), bu yüzden testinizde buna dikkat edin ve bir sızıntıyla başa çıkabileceğinizden emin olun.

  4. Yükünüz muhtemelen sunucunun ömrü boyunca artacaktır. Buna göre planlayın.
    (İyi bir kapasite planlama numaranız yoksa, bugünün iş yükünü ikiye katlayın ve bunu ele almayı planlayın).

  5. Bugün çok fazla RAM almak, çevrenizin yarın devrilmesinden daha ucuzdur.

    • İlk Sonuç: İhtiyacınız olandan biraz daha büyük bir sunucu satın alırsanız, şirketi çalıştıran ileri düzey yöneticisiniz. Büyük ölçüde görmezden gelinecek ve takdir edilmeyeceksiniz.
    • İkinci Sonuç: Makineyi boyutlandırmazsanız ve sorunlar varsa,% 500 büyüme öngöremeyen beceriksiz soytarı sizsiniz ve herkes sizden nefret ediyor.

Sonuçların onaylanması.
mfinni


Bunun için teşekkürler. Bu sistemi canlı yayınlamamıza rağmen şu anda çok küçük bir denemeyi destekliyor, yani iyi rakamlar alamıyorum.
Martin Brown

0

Teşekkürler, güncelleme en azından herkese bir ipucu veriyor. 2Tb bellek düşündüğünüz, olağan kurulumlardan farklı bir basketbol sahasında oynadığınız anlamına gelir. Büyük sistem. ne kadar ısı yayılacağını düşünmekten nefret ediyorum.

Bu bir iç sunucu süreci ve bellek yetersiz (göz önüne alındığında hangi düzeyde söylemek yok) olduğunu göz önüne alındığında ama ben sunucu işlem herhangi gitmeden önce daha büyük miktarda bellek tüketme olasılığını ortadan kaldırmak istiyorum Daha ileri. Bu durumda ne yaptığınız bir fark yaratmazsa, sistem bir noktada duracaktır.

Size neler olup bittiğine dair temel bir genel bakıştan çok daha fazlasını vermek için kullanabileceğiniz herhangi bir genel araç bilmiyorum ... pencerelerle birlikte geliyor. Hizmet sürecinin kendisi bir kara kutudur ve geliştirme ekibinizin izleme araçları sağlaması gerekir.

Zarf hesaplamasının hızlı geri alınması:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

Bu normal bir .net exe çalışma kümesi aralığının dışında olmaz.

Hizmetin birden fazla iş parçacığı var mı? Her bağlantı için bir iş parçacığı başlatıyorlarsa, bunu nasıl yaptıklarına bakmaya değer. Microsoft ProcExp.exe birden fazla iş parçacığı olup olmadığını ve bu iş parçacığı ne tüketmek görmek için kolay bir yoludur. .Net hakkında bir şey bilmiyor ama size win32 sayacı verecek.

Disk belleği çalışmaya başlamadan önce ne kadar bellek ve kaç bağlantınız olduğunu belirtebilir misiniz?

Peki, sunucu işleminde bellek sızıntısı sorunları olup olmadığı nasıl belirlenir? Her oturum bağlıyken daha fazla bellek biriktirebilir veya bellek biriktirebilir ve onları hiç serbest bırakmayabilir.

Yapabileceğiniz şey - çağrıyı provoke etmeyen bir dizi oturum seçin ve bu bağlantı sayısını simüle edin. - Simülasyonu birkaç saat boyunca çalıştırın ve temel bellek sayaçlarını izlemek için perfmon kullanın. - Bu testleri kısa süreli bağlanan ve bağlantıyı kesen oturumlarla tekrarlayın.

Fikir, hizmetin her oturumda giderek daha fazla bellek tüketip tüketmediğini veya açık oturumların giderek artan bellek kullanımını tetikleyip tetiklemediğini görmek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.