我的一个应用程序运行大约100名工人。它最初是一个threading
应用程序,但性能(延迟)问题受到了影响。所以我将这些工人转换为multiprocessing.Process
es。下面的基准测试显示,负载的减少是以更多内存使用(因子6)为代价实现的。
那么,如果Linux使用牛并且工作人员不共享任何数据,那么内存使用的确切来源呢?
如何减少内存占用? (备选问题:如何减少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数据库中。
答案 0 :(得分:3)
我的理解是,对于像Python这样的动态语言,写入时复制并不像在分叉后写入(因此复制)更多内存一样有效。随着Python解释器在程序中的进展,除了代码之外还有很多其他内容。例如,引用计数 - 非常快的对象写得太快,因为引用计数需要将引用计数写入内存(触发副本)。
考虑到这一点,您可能需要采用混合线程/处理方法。有多个进程可以利用多个内核等,但每个进程都运行多个线程(因此您可以处理所需的并发级别)。您只需要尝试运行多少线程与进程。