使用多进程减少内存占用?

4
我的一个应用程序运行了大约100个工作进程。起初它是一个线程应用程序,但遇到了性能(延迟)问题。因此,我将这些工作进程转换为multiprocessing.Process。下面的基准测试显示,在牺牲更多内存使用(6倍)的代价下,成功减少了负载。
那么如果Linux使用cow且工作进程不共享任何数据,具体来说内存使用情况从哪里产生?
如何减少内存占用?(另一个问题:如何减少线程的负载?)
在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个回答

3
我的理解是,在动态语言(如Python)中,由于分叉后会写入更多的内存(因此被复制),因此写时复制并不像静态语言那样有效。随着Python解释器在程序中的进展,除了您的代码之外还有很多其他事情要处理。例如引用计数-每个对象都将很快被写入,因为引用计数需要将引用计数写入内存(触发复制)。
考虑到这一点,您可能需要采用混合线程/处理方法。使用多个进程来利用多个核心等,但每个进程运行多个线程(以便您可以处理所需的并发级别)。您只需要尝试运行多少线程与进程即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接