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

2023-12-22

我的一个应用程序运行着大约 100 名工作人员。它最初是作为threading应用程序,但遇到了性能(延迟)问题。所以我将这些工人转变为multiprocessing.Processes.下面的基准测试表明,负载的减少是以更多内存使用为代价实现的(系数 6)。

那么,如果Linux使用cow并且workers不共享任何数据,那么内存使用量到底来自哪里呢?

如何减少内存占用? (替代问题:如何减少负载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 数据库中。


我的理解是,对于像 Python 这样的动态语言,写时复制不如分叉后写入(并因此复制)更多内存那么有效。当 Python 解释器执行程序时,除了代码之外还有很多事情在发生。例如引用计数 - 每个对象都会被写入得太快,因为引用计数需要将引用计数写入内存(触发副本)。

考虑到这一点,您可能需要采用混合线程/处理方法。拥有多个进程来利用多个核心等,但让每个进程运行多个线程(这样您就可以处理所需的并发级别)。您只需要试验运行的线程数和进程数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过多处理减少内存占用? 的相关文章

随机推荐