如何通过多进程减少内存占用?

4 投票
1 回答
1343 浏览
提问于 2025-04-16 07:16

我有一个应用程序,运行大约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解释器执行程序时,发生的事情远不止你的代码。例如,引用计数——每个对象很快就会被写入,因为引用计数需要将引用数量写入内存(这会触发复制)。

考虑到这一点,你可能需要采用一种混合的线程和进程的方法。可以使用多个进程来利用多个核心等,但每个进程中再运行多个线程(这样你就可以处理所需的并发级别)。你只需要尝试一下运行多少个线程和进程的组合。

撰写回答