4

我的一個應用程序運行約100名工人。它最初是作爲一個threading應用程序,但性能(延遲)問題受到打擊。所以我將這些工人轉換爲multiprocessing.ProcessES。下面的基準表明,以更多的內存使用(因子6)爲代價實現了負載的減少。通過多處理減少內存佔用?

那麼,如果Linux使用牛和工作人員不共享任何數據,那麼內存使用情況究竟是從哪裏來的呢?

如何減少內存佔用? (替代問題:如何減少threading的負載?)

Linux 2.6.26,4個CPU的基準測試2G RAM: (請注意,cpu使用率是以一個cpu的%給出的,因此滿載爲400%該數據是從在尋找穆寧圖表導出)

    | 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 

背景:應用程序從網絡處理事件和存儲它們中的一些在MySQL數據庫中。

回答

3

我的理解是,對於像Python這樣的動態語言,寫入時複製並不像在分叉之後更多的內存寫入(並因此複製)那樣有效。隨着Python解釋器在程序中的進展,還有更多的事情不僅僅是你的代碼。例如引用計數 - 當引用計數需要將引用計數寫入內存(觸發一個副本)時,非常快速地寫入非常快的對象。

考慮到這一點,你可能需要有一個混合線程/處理方法。有多個進程可以利用多個內核等,但每個進程都運行多個線程(這樣您就可以處理所需的併發級別)。你只需要測試你運行多少個線程vs進程。

相關問題