2009-04-02 29 views
13

'da bellek kullanımıyla başa çıkma ve en aza indirgeme Bazı basit web uygulamaları yazmak için SBCL + Hunchentoot ile Common Lisp geliştirme için kullanmaya çalıştığım çok fazla belleğe (256Mb) sahip bir VPS var. . Özellikle karmaşık bir şey yapmadan büyük miktarda bellek kullanılıyormuş gibi görünmektedir ve bir süre hizmet veren sayfalardan sonra bellek biter ve ya tüm takas (ya da takas yoksa) delirir ya da sadece ölür. (Özellikle, beni kütüphaneleri var ya ise) Common Lisp (SBCL)

  • Sınır SBCL kullanmasına izin bellek miktarı, önlemek için tüm bellek kullanıyor öğrenin

    • :

      Yani için yardıma ihtiyacım büyük miktarda takas miktarı

    • Bellek tükendiğinde, çökme yerine (örneğin bir web uygulaması olduğu için temizlemeyi ve temizlemeye çalıştığım için) işleri temiz tutun.

    İlk ikisinin oldukça basit olduğunu farz ediyorum, ama üçüncü mümkün mü? İnsanlar Lisp'de bellek dışı veya kısıtlı bellek koşullarını nasıl işler?

    (Ayrıca, 64 bitlik bir SBCL'nin tam anlamıyla iki kat daha fazla bellek 32-bit olarak kullandığını görüyorum. Bu beklenir mi? Çok fazla bellek biriktirecekse 32-bit bir sürümünü çalıştırabilirim)

  • cevap

    13

    SBCL'nin bellek kullanımını sınırlamak için, --dynamic-space-size seçeneğini kullanın (ör. sbcl --dynamic-space-size 128, bellek kullanımını 128M ile sınırlayacaktır).

    , sen (room) farklı zamanlarda (nasıl kullanıldığını kadar bellek söyler işlevi) çağırabilir dışarı bellek kimin kullandığını bulmak için: Tüm kütüphaneler yüklenir ve açılışta, sonra sonra (cource çalışmaları sırasında, (sb-ext:gc :full t) çağrı Odadan önce henüz toplanmamış olan çöpleri ölçmemek için).

    Ayrıca, bellek ayırma ölçmek için SBCL Profiler kullanmak mümkündür.

    +0

    SBCL profiler hakkında bir şeye bağlantı ekleyebilirsiniz, lütfen? :) –

    +2

    SBCL kılavuzunda http://www.sbcl.org/manual/Deterministic-Profiler.html –

    +0

    Müthiş'te bir profiler açıklaması var, teşekkürler! –

    1

    64 bitlik bir SBCL tarafından, iki katın kullanılmasıyla şaşırmayacağım, muhtemelen bir 32-bit yerine 64-bit bir hücre kullanacak, ama gerçekten kontrol etmeden emin olamadım.

    Belleğin beklemeden daha uzun süre asılı kalmasını sağlayan tipik işlevler, artık kök ayırma kümesinin bir yolunun olduğu artık yararlı olmayan başvurulardır (karma tablolar, bu şeylerin sızmasına izin vermenin iyi bir yolunu buluyorum). Kodunuzda açık çağrıları GC'ye ayırmayı deneyebilir ve küresel değişkenlerde bir şeyleri saklayamadığınızdan (mümkün olduğunca) emin olabilirsiniz.

    3

    Herhangi bir tür bildiriminiz yoksa, 64 bit Lisp'in 32 bitlik bir alanın iki katı olmasını beklerim. Düz (küçük) bir int bile 64 bitlik bir bellek belleği kullanır. Bunu beyan etmedikçe, bir makine kelimesinden daha azını kullanacağını düşünmüyorum.

    # 2 ve # 3 konusunda yardımcı olamıyorum, ancak # 1'i belirlerseniz, bunun bir sorun olmayacağından şüpheleniyorum. Çağlar boyunca çalışan SBCL/Hunchentoot örneklerini gördüm. Aşırı miktarda bellek kullanıyorum, genellikle kendi suçumdur. :-)

    4

    Attila Lendvai bir tahsis nesneler nereden geldiğini öğrenmek için bazı SBCL özel kodu vardır (özellikle, beni bu kütüphaneleri ise ya) tüm hafızayı kullandığını öğrenin .http://article.gmane.org/gmane.lisp.steel-bank.devel/12903'a bakın ve gerekirse ona özel bir mail yazın. Uygulamaya özel bir sızıntı olmadığından emin olmak için, tercihen kesin bir GC (Clozure CL gibi) ile başka bir uygulama yapmayı denediğinizden emin olun.

    Sınır SBCL kullanmasına izin bellek miktarı,

    Zaten başkaları tarafından cevap takas kitlesel miktarlarda önlemek için. Bellek oldukça çökmesini daha out, çalıştırdığında

    Sap şeyler temiz bir şekilde (o beri ben devam etmek istiyorum ve web uygulaması temizlemeye deneyin).

    256MB sıkıdır, ancak yine de: kalan boş alanı denetleyen yinelenen (belki 1 sn) zamanlanmış iş parçacığı zamanlayın. Boş alan X'den küçükse, geçerli SBCL işlem görüntüsünü yenisiyle değiştirmek için exec() öğesini kullanın.

    İlgili konular