2012-09-01 20 views
6

C++ 'da aşağıdaki çağrıyı kullanırsam, işlemin WorkingSet'inin 100MB'nin altına düşmemesini beklerdim.Bir işlemin WorkSet'inin C++'da 1GB olmasını zorlamanın bir yolu var mı?

Ancak, OS hala bu çağrıyı yapmak bile geri 16MB ayarlı çalışma kırpar. 100MB için

Ayar WorkingSet yumuşak sayfa sayfa hatalarında (aşağıdaki şemaya bakın) ortadan kaldırarak, başvurum hızında çarpıcı bir artışa yol açacak.

Neyi yanlış yapıyorum? (Uzmanlar için ekstra)

SIZE_T workingSetSizeMB = 100; 
int errorCode = SetProcessWorkingSetSizeEx(
    GetCurrentProcess(), 
    (workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize 
    workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize, 
    QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE 
); 
// errorCode returns 1, so the call worked. 

Deneysel Metodoloji ben 100MB üzerinden WorkingSet (Süreç Explorer içinde bakıldığında) getirmek için verilerin 100MB tahsis için bir test C++ projesini yazdı

, o ayırmanın bellek. Ancak, OS, bu belleği tahsis ettiğim anda WorkSet'i 16MB'ye geri çekti. Dilerseniz kullandığım C++ projesini sağlayabilirim. işe görünmüyorsa

Neden, Windows SetProcessWorkingSetSizeEx() çağrısı sağlıyor? Yanlış bir şey yapmalıyım.

Aşağıdaki diyagram yeşil hat (çalışma kümesi) 30 MB 50MB düştü yumuşak sayfa hataları sayısındaki dramatik artış (kırmızı artışlar) gösterir. çok bu performansı değil etkisi olarak

Example showing the increase in soft page faults when the WorkingSet is reduced too low

Sonunda

Güncelleme, biz sorunu görmezden sona erdi.

Daha da önemlisi, SetProcessWorkingSetSizeEx değil kontrolü akım WorkingSet yapar ve yumuşak sayfa hatalarına karşı herhangi bir biçimde alakalı değil olduğunu. Tümü, mevcut WorkSet'in sabit sürücüye disk belleği verilmesini engelleyerek, zor sayfa hatalarını önler. bir yumuşak sayfa hataları azaltmak istiyorsa zor sayfa hataları belirtir olarak başka deyişle

, SetProcessWorkingSetSizeEx, kesinlikle hiçbir etkisi yoktur.

"C/C üzerinden Windows'un ++" Windows bellek ile nasıl başa (Richter) büyük bir writeup yoktur.

+1

İşletim Sisteminin, bellekte olduğundan daha fazla sayfayı bellekte tutmasını nasıl beklersiniz? –

+0

@James McNellis İşletim Sistemi, WorkSet'te daha fazla sayfa tutabildiyse, sayfa hataları azalır, bu da programı önemli ölçüde hızlandırabilir. Sunucuda 16 GB boş RAM var ve bu işleme kalıcı olarak ayrılmış 1GB'a zarar vermeyecek (bu da yumuşak sayfa hatalarının sayısını 0'a düşürecektir). – Contango

+0

@Gravitas: Belleğe nasıl ayırıyor ve erişiyorsunuz? – ybungalobill

cevap

4

Sayfa hataları ucuzdur ve beklenmelidir. Gerçek zamanlı uygulamalar, üst düzey oyunlar, yüksek yoğunluklu işleme ve BluRay oynatma, sayfa hatalarıyla tam hızda çalışır. Sayfa hataları uygulamanızın yavaş olmasının nedeni değildir.

Uygulamanızın neden yavaş olduğunu öğrenmek için uygulamanızın bazı uygulama profillerini oluşturmanız gerekir.

Sorunuza özel olarak yanıt vermek için - sadece bir GC.Collect() sayfanızda hata oluştuğunda meydana gelen sayfa hataları sayfa sırasındaki hatalardan kaynaklanır. GC, nesnelerinizi taşımak için yeni sıfırlanmış sayfalar için yeni bir blok ayırdı. İstenmeyen sayfalar sayfa dosyanızdan talep edilmez ve disk maliyeti olmaz, ancak bunlar hala sayfa hatalarıdır, dolayısıyla grafiğinizde neden gösterilirler.

Genel bir kural olarak, Windows sistem kaynaklarınızı yönetmekten daha iyidir ve varsayılan değerler normal programların durumu için oldukça önemlidir. Örneğinizden bir çöp toplayıcısını kullandığınızdan oldukça açık ve bu nedenle zaten çalışma kümeleri ve sanal bellekle uğraşma görevini ve GC uygulamasına yüklediniz. SetProcessWorkingSetSize, GC performansını iyileştirmek için iyi bir API çağrısı olsaydı, GC uygulaması bunu yapardı.

Size tavsiyem uygulamanızı profilinize eklemektir. Yönetilen uygulamalardaki yavaşlamanın ana nedeni, kötü yönetilen kod yazmaktır - GC sizi yavaşlatmaz. Algoritmalarınızın büyük-O performansını artırın, Future ve BackgroundWorker gibi şeyleri kullanarak pahalı bir iş yükünü boşaltın ve ağa eşzamanlı istekler yapmamaya çalışın - her şeyden önce, uygulamanızı hızlı bir şekilde almanın anahtarı profili .

+0

Uygulamada neler olup bittiğini anlamak için Microsoft Concurrency Visualizer programını kullandık. Sonunda, performans kaybı endişelenmek için yeterli değildi. – Contango

İlgili konular