如何通过多进程减少内存占用?
我有一个应用程序,运行大约100个工作线程。最开始是用 threading
来实现的,但遇到了性能(延迟)问题。所以我把这些工作线程改成了 multiprocessing.Process
。下面的基准测试显示,虽然减少了负载,但内存使用却增加了(增加了6倍)。
那么,内存使用到底是从哪里来的呢?因为Linux使用了写时复制(cow),而且这些工作线程之间并没有共享数据。
我该如何减少内存占用?(另外一个问题是:我该如何减轻 threading
的负担?)
这是在Linux 2.6.26上进行的基准测试,使用了4个CPU和2G内存: (注意,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解释器执行程序时,发生的事情远不止你的代码。例如,引用计数——每个对象很快就会被写入,因为引用计数需要将引用数量写入内存(这会触发复制)。
考虑到这一点,你可能需要采用一种混合的线程和进程的方法。可以使用多个进程来利用多个核心等,但每个进程中再运行多个线程(这样你就可以处理所需的并发级别)。你只需要尝试一下运行多少个线程和进程的组合。