SORU
8 Temmuz 2011, Cuma


Nasıl Haskell olarak 5 GB'LIK bir yığın kontrolünü ele geçirmek için mi?

Şu anda küçük bir Haskell yükleyen Çırpıda web-server yazılı deniyorum ve istemci için kullanılabilir veri bir çok yapar. Ve çok, çok zor bir zaman sunucu süreci üzerinde kontrol kazanıyor. Rastgele anlarda işlemi dakika saniye için CPU çok kullanır ve istemci istekleri için sorumsuz olur. Bazen bellek kullanımı ani (ve bazen damla) yüzlerce megabayt saniye içinde.

Umarım birileri uzun miktarda bellek kullanıyor ve bana bir şey daha istikrarlı hale getirmek için bazı öneriler verebilir Haskell çalışan süreçleri ile daha fazla deneyime sahiptir. Günlerce şey şimdi hata ayıklama oldum ve biraz umutsuz gibi geldi.

Benim kurulum biraz bakış:

  • Server başlangıç (iç içe geçmiş) büyük bir Veri içine veri yaklaşık 5 gigabayt okudum.Göster-hem bellek yapısı. İç içe göster değer sıkı ve harita içindeki tüm değerleri tüm alan katı olarak yapılmış türleri vardır. Hayır unevaluated thunk bırakılır sağlamak için çok zaman harcadım. Alma (sistem yükü) bağlı olarak 5-30 dakika sürer. İşin garip tarafı ardışık çalışır dalgalanma beklediğimden daha büyükmüş gibi görünüyor ama bu farklı bir sorun.

  • Büyük veri yapısı bir 'TVar' tüm istemci iş parçacığı Ek sunucu tarafından oluşturulan tarafından paylaşılır. içinde yaşıyor Müşteriler veri küçük bir sorgu dili kullanarak rasgele bir parça talep edebilir. Veri talep miktarı genellikle küçük (ya da öylesine kadar 300 KB) ve sadece dokunur bir veri yapısının küçük bir parçasıdır. Salt okunur kullanılarak yapılır isteği 'readTVarİO', yani herhangi bir STM işlemleri gerekmez.

  • Sunucu aşağıdaki bayrakları ile başladı:- N RTS-I0 -qg -qb. Bu zamanı boş ve paralel GC devre dışı bırakmak çok iş parçacıklı modda sunucu başlar. Bu süreci çok hızlandıracak gibi görünüyor.

Sunucu çoğunlukla herhangi bir sorun olmadan çalışır. Ancak, her şimdi ve sonra bir müşteri 100% (veya 0) için zaman aşımına uğradı ve CPU ani istek ve uzun bir süre için bunu yapmaya devam. Bu arada sunucu isteği artık yanıt vermiyor.

CPU kullanımı neden olabilir aklıma birkaç sebep vardır:

  • İsteği sadece bir sürü iş yapılması gereken çok şey var, çünkü çok zaman alır. Bu bazen önceki çalışmalarını çok hızlı olması (hızlı 20-80ms kadar yani) kanıtlanmış istekleri olur çünkü biraz düşüktür.

  • Hala veri işleme ve istemciye gönderilmeden önce hesaplanması gereken bazı unevaluated thunk vardır. Bu da olası, bir önceki nokta ile aynı neden.

  • Bir şekilde çöp toplama devreye giriyor ve tüm 5 GB benim yığın taramayı Başlat. Bu çok zaman alabilir hayal edebiliyorum.

Sorun tam olarak ne olup bittiğini anlamaya ve bu konuda ne yapacağım hakkında hiçbir fikrim yok. Alma işlemi bu kadar uzun sürüyor çünkü profil sonuçları bana yararlı bir şey göstermiyorsun. Koşullu kod içinde ve dışında profiler açmak için bir yol var gibi görünüyor.

Ben şahsen GC burada sorun olduğundan şüpheleniyor. Bir çok seçenek var gibi görünüyor GHC7 GC nasıl çalıştığını oynamak için kullanıyorum.

Ne GC ayarları genellikle çok kararlı veri ile büyük kümeler kullanırken tavsiye edersiniz?

CEVAP
8 Temmuz 2011, Cuma


Büyük bellek kullanımı ve CPU zaman zaman sivri neredeyse kesin tekme tokat GC. Gördüğünüz eğer bu gerçekten durumda kullanarak RTS seçenekleri gibi -B, neden olur DZD için bip sesi ne zaman bir büyük toplama, -t seni söyleyecek istatistikleri sonra gerçeği (özellikle, eğer GC zamanlar gerçekten uzun) veya -Dg, yanar hata ayıklama bilgisi için GC aramalar (gerçi ihtiyacın derlemek için -debug).

Bu sorunu hafifletmek için yapabileceğiniz birkaç şey vardır:

  • Veri başlangıç alma, DZD öbek büyüyen çok zaman harcıyor. O anda ihtiyacınız olan tüm -H büyük belirterek kapmak için söyleyebilirsin.

  • Kararlı veri ile büyük bir yığın eski bir kuşağa terfi edecek. Eğer artırmak numarası nesiller ile -G, sen-ebilmek muktedir almak ahır veri için en eski, çok nadir GC ... nesil, oysa daha geleneksel genç ve yaşlı yığınları üzerinde.

  • Uygulama geri kalanı bellek kullanımı bağlı olarak, -F ne kadar eski nesil tekrar toplamadan önce büyümeye izin verecek tweak kullanabilirsiniz. Bu parametre, BM-çöp toplanan bu yapmak için çimdik olabilir.

  • Yoksa yazar ve iyi tanımlanmış bir arayüz olabilir yaşanabilir hale bu bellek BM tarafından yönetilen DZD (C FFI), böylece orada hiçbir şans bir süper-GC hiç.

Bunların hepsi spekülasyon, lütfen belirli bir uygulama ile test.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • Dive In

    Dive In

    17 Temmuz 2013
  • MVLV28

    MVLV28

    17 Mart 2008

İLGİLİ SORU / CEVAPLAR