4

Uygulamalarımdan biri yaklaşık 100 çalışanı çalıştırıyor. Bir threading uygulaması olarak başladı, ancak performans (gecikme) sorunları vuruldu. Bu yüzden bu çalışanları multiprocessing.Process es'e dönüştürdüm. Aşağıdaki ölçüt, yükteki azalmanın daha fazla bellek kullanımı maliyetiyle sağlandığını göstermektedir (faktör 6).Çoklu işlemle bellek ayak izinin azaltılması?

Linux, ineği kullanıyorsa ve çalışanlar herhangi bir veri paylaşmıyorsa bellek kullanımı tam olarak nereden geliyor?

Bellek izi nasıl azaltabilirim? (Alternatif soru: Nasıl threading için yükünü azaltabilir?)

Linux 2.6.26, 4 CPU 2G üzerinde Deneyler RAM: (yani cpu kullanımı bir cpu% olarak verilen, bu nedenle tam yük% 400'dür Not . numaraları Munin grafikler bakarak türetilmiştir)

    | threading | multiprocessing 
------------------+-----------+---------------- 
memory usage  | ~0.25GB | ~1.5GB 
context switches | ~1.5e4/s | ~5e2/s 
system cpu usage | ~30%  | ~3% 
total cpu usage | ~100%  | ~50% 
load avg   | ~1.5  | ~0.7 

Arka Planı. uygulama ağı olaylarını işleme ve MySQL veritabanı bazıları depolanmasıdır.

cevap

3

Anlayışım, Python gibi dinamik dillerle, yazma üzerine yazma işleminin, forking'ten sonra daha fazla bellek yazıldığından (ve dolayısıyla kopyalanmasından) çok etkili olmadığıdır. Python yorumlayıcısı program boyunca ilerledikçe, sadece kodunuzdan çok daha fazlası oluyor. Örneğin referans sayma - referans sayımı, referans sayımının belleğe yazılması gerektiğinden (bir kopyanın tetiklenmesi) çok hızlı bir şekilde çok hızlı bir şekilde yazılacaktır.

Bu düşünceyle muhtemelen karma bir iş parçacığı/işleme yaklaşımına sahip olmanız gerekir. Birden fazla çekirdekten faydalanabilmeniz için birden fazla işleminiz var, ancak her birinin birden fazla iş parçacığı çalıştırmasını sağlayın (böylelikle ihtiyacınız olan eşzamanlılık düzeyiyle başa çıkabilirsiniz). Sadece kaç tane iş parçacığı çalıştırdığınızı deneme denemeniz gerekir.

İlgili konular