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