通过多处理减少内存占用?

时间:2010-11-18 12:35:25

标签: python multithreading memory-management benchmarking multiprocessing

我的一个应用程序运行大约100名工人。它最初是一个threading应用程序,但性能(延迟)问题受到了影响。所以我将这些工人转换为multiprocessing.Process es。下面的基准测试显示,负载的减少是以更多内存使用(因子6)为代价实现的。

那么,如果Linux使用牛并且工作人员不共享任何数据,那么内存使用的确切来源呢?

如何减少内存占用? (备选问题:如何减少threading的负载?)

Linux 2.6.26基准测试,4 CPU 2G RAM: (请注意,cpu使用率以一个cpu的百分比给出,因此满载是400%。这些数字来源于查看Munin图。)

                  | 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数据库中。

1 个答案:

答案 0 :(得分:3)

我的理解是,对于像Python这样的动态语言,写入时复制并不像在分叉后写入(因此复制)更多内存一样有效。随着Python解释器在程序中的进展,除了代码之外还有很多其他内容。例如,引用计数 - 非常快的对象写得太快,因为引用计数需要将引用计数写入内存(触发副本)。

考虑到这一点,您可能需要采用混合线程/处理方法。有多个进程可以利用多个内核等,但每个进程都运行多个线程(因此您可以处理所需的并发级别)。您只需要尝试运行多少线程与进程。